关于vi:为什么Vim专家更喜欢缓冲区而不是标签?

Why do Vim experts prefer buffers over tabs?

我不懂缓冲器。当我在同一个选项卡上打开3个文件并关闭我的窗口时,我通常会很恼火,因为当我下次打开其中一个文件时,会发现有奇怪的交换文件仍然存在,并给我带来烦人的消息。但我一次又一次地读到,这些东西是生产力涅盘,我错过了,标签是为平民使用。

所以我问你,VIM专家:使用缓冲区胜过标签有什么好处?我不明白两者之间的差别有多大,但我认为自己只是处于操作VIM的初级中级水平。:ls:b#真的比gt快得多吗?我觉得一定比这更深入。


正如ZYX在Vim上所说,这个问题听起来像是"为什么Vim专家更喜欢美味而不是温暖?".好的。

"vim专家"不喜欢使用缓冲区而不是制表符:他们使用缓冲区作为文件代理,使用制表页作为工作区。缓冲区和标签页有不同的用途,因此一个优先于另一个毫无意义。好的。

缓冲区和选项卡的问题是由独立事实组合引起的混乱之一。好的。

  • 大多数"现代"文本编辑器和IDE都使用标签隐喻来表示加载的文件。这个比喻就像一个信息系统-它向用户显示打开的文件及其状态-作为一个交互设备-它允许用户操作(重新排序、选择、关闭…)那些打开的文件。尽管有很多限制,但是标签随处可见,人们习惯了标签,并期待着标签随处可见。好的。

  • Vim在7.0中引入了标签页,作为用户创建特殊"工作区"的一种方法。它们的特性、特定选项、特定命令或:help部分中没有任何内容表明选项卡页可以或应该用作文件代理。好的。

    当然,除了"标签页"的名称和外观之外什么都没有,这会导致很多混乱。好的。

  • 如果没有默认禁用且不容易找到的:set hidden,vim就不可能在不写入当前缓冲区或放弃其更改的情况下切换到另一个缓冲区。没有意识到这个选项的新用户别无选择,只能转向大量使用Windows或他们能找到的最接近的"标签式"功能:标签页。好的。

  • "标签页"是该功能的一个不幸的名称选择,尤其是在一个以阅读文档浪费时间为主导的时代。好的。

    在VIM中,标签页是建立在Windows之上的抽象,它们本身是建立在缓冲区之上的抽象。每个新级别都会添加有用的功能,但会限制您的工作流。好的。"缓冲方式"

    使用基于缓冲区的工作流,您正在使用的文件将沿单个维度分布。您可以循环访问缓冲区,您可以通过键入特定缓冲区的部分名称(完成后)或其编号来访问该缓冲区,您可以在缓冲区之间切换,您可以非常容易地将其作为目标。基本上没有摩擦。好的。

  • 八个缓冲区打开,只有一个可见:好的。

    Eight buffers open好的。

  • 按编号切换:好的。

    Switching by number好的。

  • 按名称切换:好的。

    Switching by name好的。

  • 缓冲区是VIM的文件代理。如果从文件的角度考虑,那么就从缓冲区的角度考虑。好的。"窗口"

    对于基于窗口的工作流,您的"文件"都分布在同一个"虚拟"维度上,就像只使用缓冲区和其他两个"物理"维度一样。但是找到这些维度的笛卡尔空间几乎是完全分离的:移动到另一个缓冲区仍然意味着"移动到另一个文件",但移动到另一个窗口并不意味着。与所需文件相对应的缓冲区可以显示在该窗口中,但也可以显示在另一个窗口中,也可以显示在另一个选项卡页中,或者一点也不。好的。

    使用Windows,在打开的文件之间导航变得过于复杂或过于简单,即使使用'switchbuf':sb。主要是因为您被迫对本质上相同的东西使用两组命令:访问缓冲区。好的。

    Windows有它们的用途,如下所述,但是它们没有替换任何人工作流中的缓冲区所需的功能。好的。

    这里我正在研究VIM配色方案。这两个窗口是同一个缓冲区的不同视图:顶部窗口用作参考,颜色方案中使用的颜色代码表,底部窗口是我工作的地方:好的。

    Working on a colorscheme好的。

    窗口不是作为文件代理而设计的,不能做成文件代理:它们是"容器"或"视区",设计为向缓冲区提供视图。不多不少。好的。"制表方式"

    使用基于选项卡的工作流,您基本上尝试模仿以前的编辑器中使用的用户体验,同时完全忽略Vim选项卡页面的本质。如果我们暂时忘记这个策略通常是非常没有成效的,那么也不可能像Windows那样,强制Vim坚持"一个文件=一个选项卡"的模式,而不会失去很多灵活性。好的。

    尽管与上面的文件相同,这张小报还是占据了很大的空间,几乎没有任何好处。我所有的文件和选项卡都称为javascript*.vim,所以我不能执行3gt,而且我确信我会在正确的位置结束,而且不可能按名称到达特定的选项卡。除此之外,它的标签很可能是非常无用但完全合乎逻辑的[Quickfix List]…因为没有实际的方法将文件/缓冲区绑定到选项卡页,所以基本上只剩下一种在选项卡页/缓冲区/文件之间导航的实际方法:循环。好的。

    是的,我的小报只有8个标签,想象一下如果我有20个!好的。

  • 八个缓冲区在八个选项卡页中打开(错误)好的。

    Wrong好的。

  • 两个选项卡用于两个特定任务(右)好的。

    Right好的。

  • 选项卡页是设计用于包含一个或多个窗口的"容器"或"视区",它们本身也是设计用于包含缓冲区的"容器"。好的。总之

    "VIM专家"(假设我可以说得好像我是其中一个)不喜欢缓冲区而不是制表符:他们只是按照设计使用VIM,并且非常适合这种设计:好的。

    • "VIM专家"有2个、30个或97个缓冲器,他们非常高兴他们不必处理空间分布问题;好的。

    • 当他们需要比较两个文件或在当前缓冲区的一个部分中工作,同时将另一个作为参考时,"vim专家"使用windows,因为这就是要使用它们的方式;好的。

    • 当他们需要在项目的一个单独的部分工作一段时间而不干扰他们当前的观点时,"VIM专家"加载一个全新的标签页。好的。

    好啊。


    我以前把每个缓冲区都放在一个单独的选项卡中,但我厌倦了到处都是GABBDTABBD和GABBDTABBD。

    我也觉得缓冲器太难管理了。

    以下是一些完全改变了我先前观点的技巧:

    • 缓冲区管理::b。你在这方面的速度惊人。参见vim,使用普通vim(无插件)在文件之间快速切换
    • 跳转/更改列表(ctrl o/g)
    • 备用文件(^)
    • tpope未损坏的插件。方便的映射,用于在缓冲区(以及其他缓冲区)中飞行。

    以下是我的典型工作流程:

    • 打开vim,使用:e(通常与regex-like-:e src/**/F*Bar.js一起)打开缓冲区。
    • 意识到我需要打开另一个文件。也可以使用:e。如果我想在这个缓冲区和当前打开的缓冲区之间切换,我将使用:sp:vsp在单独的窗口中打开它。
    • 重复,直到我得到3-5个文件,我将使用上面项目符号列表中的技术在缓冲区之间切换。
    • 如果我想"重新开始"我的缓冲区,只需关闭VIM并重新打开。

    我觉得,在强制这些新模式执行了大约一个星期之后,可以更容易地想象我打开了哪些缓冲区,以及如何在几个自动笔画中到达其中任何一个缓冲区。


    标签的缺点是一次只能看到一个的内容。因此,如果您像在浏览器中那样使用它们,那么您将在并排查看多个缓冲区,甚至在拆分中查看同一文件的不同部分时失败。因此,很多人建议只使用标签来隔离不同的工作空间(例如,对于Java项目有一个,另一个用于待办事项列表,第三个在脚本上进行黑客攻击)。

    你所描述的问题使你看起来是在错误地使用VIM。或者有(大部分)一个单独的、专用的实例。然后,如果您重新编辑了隐藏的缓冲区(现在您可以使用缓冲区列表调用它们),那么这些缓冲区将简单地"重新出现",并且不会有交换文件消息。或者,在每个项目/文件/编辑会话中使用单独的VIM实例,但是在使用完文件后,习惯于对每个实例完全执行:quit


    另一个技巧是,当使用缓冲区名称作为:buffer的参数时,不必指定整个名称。但是,如果多个缓冲区与给定参数匹配,则不会切换缓冲区。

    可以使用缓冲区名称的任何片段进行匹配。例如,如果有缓冲区request_manager.javaqueue_manager.java,那么:buffer que:b que将匹配这两个缓冲区,但在开始匹配时将切换到queue manager.java。


    我在我的工作流程中使用选项卡、CtrL PaKBD和VIM会话,现在已经有一年多了:

    • 我有)(分别映射到"转到下一个选项卡"和"转到上一个选项卡"。tn打开一个新选项卡。我还利用tabm来帮助组织工作。

    • 我将VIM会话用于与我正在处理的当前故事/bug相关的文件组,通常按类别进行。在处理过程中,这些会话会被覆盖。

    • 我还没有找到比ctrl p更好的东西,但是要处理所有要查找的文件确实需要一些时间。


    我想建议在很多年前实现一个出色的方案:kien/tabman.vim。它澄清了以下内容:

    • 一个人可以有尽可能多的缓冲区被小心地隐藏在某个地方;
    • 按设计,标签是用来以创造性的方式显示缓冲区的。
      • 有了适当的tabline插件,就可以在最上面一行(tabline)显示所有隐藏的缓冲区;
      • 根据我在VIM航空公司的经验,当我创建一个新标签时,小报将显示很少的相关信息。
      • 两个标签将占据小报槽,并排,浪费剩余的水平空间。
      • 更糟糕的是,我不再知道隐藏的缓冲区是什么。

    这是对这个神奇插件的一次极好的重新发现,它应该在我的VIM配置中保存好几年。虽然我会继续寻找一些东西,也显示所有隐藏的缓冲区,泰布曼是我的超人,当涉及到一个鸟瞰缓冲区是如何安排不同的标签。


    我加载"选定"缓冲区作为选项卡,以便在它们之间快速切换(tab/s-tab)。工作区的框架在这里适用于Me Buffers和Tabs,这主要是可见性方面的事情。我可以在窗口和选项卡中弹出重要/工作文件,并隐藏当前不需要在后台即时使用的文件,而无需记住路径或在需要时花时间搜索并重新加载它们。这允许在一个VIM会话中处理多个任务或项目,我想这在低内存机器中曾经很重要,但也有利于将所有编辑任务集中在一个应用程序框架下。我还将缓冲区切换快捷方式设置为ctrl right/left,这样我就可以快速切换不同的缓冲区。

    最重要的是,一个人只能拆分到一些窗口以供他使用,就像屏幕属性一样,但可以在多个选项卡中保存多个窗口设置,从而扩展工作空间并改进工作流,从而方便地划分旋转多个文件的复杂任务。

    对于交换文件,您可以告诉Vim将所有文件保存在指定的一个文件夹中。为此,使用:set directory


    把这些加到你的.vimrc中,开始爱的缓冲区:

    1
    2
    :nnoremap <Tab> :n<cr>
    :nnoremap <S-Tab> :N<cr>

    通过这种方式,您可以在正常模式下通过tabbkBD/shifttabbkBD循环前进/后退。