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

时间:2014-11-03 06:19:25

标签: vim vi

我不了解缓冲区。当我在同一个标​​签上打开3个文件并关闭我的窗口时,我一般都很恼火地发现下次我打开其中一个文件时,有奇怪的交换文件挥之不去,给我一些麻烦的消息。但是我一次又一次地读到这些东西是我错过的生产力天堂,而且这些标签是为了让平民使用。

所以我问你,Vim专家:在标签上使用缓冲区有什么好处?我不知道差异有多大差别,但我认为自己只是在初级中级水平上操作Vim。 :ls :b#真的比gt快得多吗?我觉得它必须比这更深入。

11 个答案:

答案 0 :(得分:408)

正如ZyX在#vim上所说的那样,这个问题听起来像"为什么Vim专家更喜欢美味而温暖?"

" Vim专家"不喜欢缓冲区而不是标签:它们使用缓冲区作为它们的文件代理,并使用标签页作为它们的工作空间。缓冲区和标签页有不同的用途,所以 更喜欢一个到另一个没有任何意义。

缓冲区和制表符的问题是混淆之一,由独立事实的组合引起。

  1. 大多数"现代"文本编辑器和IDE使用选项卡比喻来表示加载的文件。该隐喻充当信息系统 - 它向用户显示打开的文件及其状态 - 以及作为交互设备 - 它允许用户操纵(重新排序,选择,关闭......)这些打开的文件。尽管存在许多限制,但标签无处不在,人们已经习惯了它们,而且期望它们无处不在。

  2. Vim在7.0中引入了标签页,作为其用户创建ad-hoc"工作区"的一种方式。其功能,特定选项,特定命令或其:help部分中没有任何内容表明标签页可以或应该用作文件代理。

    除了名称​​和之外没有其他任何内容"标签页"当然,这会导致很多混乱。

  3. 如果没有:set hidden,默认情况下被禁用且不容易找到,Vim无法在不写入当前缓冲区或放弃其更改的情况下切换到另一个缓冲区。没有意识到这个选项的新用户别无选择,只能转向使用沉重的窗户或者使用最接近的标签式的#34;他们可以找到的功能:标签页。

  4. "标签页"对于这个功能来说,这是一个不幸的名字选择,特别是在一个由读取文档是浪费时间的想法占主导地位的时代。

    在Vim中,标签页是一个构建在windows之上的抽象,它们本身就是一个构建在缓冲区之上的抽象。每个新级别都会添加有用的功能,但会限制您的工作流程。

    "缓冲方式"

    使用基于缓冲区的工作流程,您使用的文件将沿一个维度分布。您可以遍历缓冲区,可以通过键入部分名称(完成)或其编号来访问特定缓冲区,您可以在缓冲区之间切换,您可以非常轻松地定位它们。基本上没有摩擦。

    1. 打开八个缓冲区,只有一个可见:

      Eight buffers open

    2. 按号码切换:

      Switching by number

    3. 按名称切换:

      Switching by name

    4. 缓冲区是Vim的文件代理。如果你考虑文件,你会考虑缓冲区。

      "窗口方式"

      使用基于窗口的工作流程,您的"文件"两者都分布在同一个单一的虚拟"如果你只使用缓冲区而另外两个" physical"尺寸。但是发现这些尺寸的笛卡尔空间几乎完全分开:移动到另一个缓冲区仍然意味着移动到另一个文件"但转移到另一个窗口并不是。与所需文件对应的缓冲区可以显示在该窗口中,但也可以显示在另一个窗口中,可能显示在另一个标签页中,或者根本不显示。

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

      如下所述,Windows可以使用它们,但它们不具备在任何人的工作流程中替换缓冲区所需的功能。

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

      Working on a colorscheme

      Windows不是作为文件代理设计的,也不能被制成一个:它们是"容器"或"视口"旨在为您提供缓冲区的视图。不多也不少。

      "标签方式"

      使用基于选项卡的工作流程,您基本上可以尝试模仿您以前编辑器中习惯的用户体验,同时完全忽略Vim标签页面的本质。如果我们暂时忘记这个策略通常非常非生产性,那么就像使用Windows一样,迫使Vim坚持这个"一个文件=一个标签"范式不会失去很多的灵活性。

      仍然使用与上面相同的文件,tabline占用了大量空间,几乎没有任何好处。我的所有文件和所有标签都名为javascript*.vim,因此我无法3gt并确信我会在正确的位置结束,无法访问特定标签按名字。除此之外,它的标签很可能是非常无用但完全合乎逻辑[Quickfix List] ...因为没有实用的方法将文件/缓冲区绑定到标签页,所以基本上只剩下一种实用方法在标签页/缓冲区/文件之间导航:循环。

      是的,我的标语只有8个标签,想象一下,如果我有20个!

      1. 在八个标签页中打开八个缓冲区(错误)

        Wrong

      2. 两个特定任务的标签(右)

        Right

      3. 标签页是"容器"或"视口"设计用于包含一个或多个窗户,它们本身也包含容器"旨在包含缓冲区。

        总结

        &#34; Vim专家&#34; (让我们假设我可以说话就像我一样)不喜欢缓冲区而不是标签:他们只是按照设计使用Vim并且非常适合这种设计:< / p>

        • &#34; Vim专家&#34;加载了2个,30个或97个缓冲区,非常高兴他们不必处理空间分布;

        • 当他们需要比较两个文件或在当前缓冲区的一部分中工作而另一部分作为参考时,&#34; Vim专家&#34;使用windows因为它们的用法是什么;

        • 当他们需要在项目的某个单独部分工作一段时间而不会弄乱他们当前的观点时,&#34; Vim专家&#34;加载一个全新的标签页。

答案 1 :(得分:56)

我曾经把每个缓冲区都放在一个单独的标签中,但我厌倦了 g t g T < / kbd>到处都是。

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

以下是一些完全改变了我之前意见的技巧:

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

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

我觉得在强制使用这些新模式一周左右之后,我可以更容易地看到我打开了哪些缓冲区,以及如何只用几次自动笔画就可以找到它们中的任何一个。

答案 2 :(得分:10)

标签的缺点是您一次只能看到一个内容。因此,如果您像在浏览器中一样使用它们,则会在并排查看多个缓冲区时丢失,甚至在分割中查看同一文件的单独部分。因此,许多人建议仅使用制表符来隔离不同的工作区(例如,一个用于Java项目,另一个用于待办事项列表,第三个用于黑客攻击脚本)。

您描述的问题表明您使用Vim错误。要么(大部分)都有一个专用的实例。然后,隐藏的缓冲区将简单地重新出现&#34;如果你重新编辑它们(你现在可以使用缓冲区列表来调用它们),那么就不会有交换文件消息。或者,每个项目/文件/编辑会话使用单独的Vim实例,但是当你完成文件时,要养成完全:quit每个实例的习惯。

答案 3 :(得分:6)

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

缓冲区名称的任何片段都可用于匹配。例如,如果您有缓冲区request_manager.javaqueue_manager.java,那么:buffer que:b que会匹配它们,但会在开头匹配时切换到queue_manager.java。

答案 4 :(得分:3)

我在工作流程中使用制表符, Ctrl - P 和Vim会话,现在已超过一年了:

  • 我有分别映射到“转到下一个标签页”和“转到上一个标签页”。 t n 打开一个新标签。我还使用tabm来帮助保持整洁。

  • 我将Vim会话用于与我正在处理的当前故事/错误相关的文件组,通常按类别完成。这些会议在整个过程中被覆盖。

  • 我还没有找到比 Ctrl - P 更好的东西,但它确实需要处理所有文件才能找到。

答案 5 :(得分:3)

把2c扔进堆里。

TLDR; :b *part-of-filename*是在缓冲区列表中找到所需文件的最佳方法,即它比缓冲区编号,制表符或用于跟踪文件的窗口更快,认知负荷更小。

打开30个缓冲区对我来说没什么(即我还没有整理房间),使用缓冲区的妙处在于它完全不会减慢我的速度。实际上,当我打开需要的文件四天后,调用:b *part-of-filename*并以神奇的方式出现时,它加快了工作速度,给同事和狡猾的收藏家都留下了深刻的印象。

缓冲区用于文件。

要生效:

  • 从精心选择的根目录中打开重要的第一个文件
  • 使用:e
  • 打开后续文件
  • 刚开始建立良好的心理模型时,请始终使用ls(无论是从心理上还是从字面上看,您都无法理解自己看不到的东西)
  • 从不:q,它会吹
  • 在您的肌肉记忆中输入:b
  • :b1适用于您知道打开的第一个文件,否则数字和字母会变得笨拙
  • :b#非常适合切换到您的最后一个文件,这是常见的需求
  • :bd#非常适合当您切换到临时文件,完成您需要做的事情,使用:b#切换回现在想要关闭该临时文件时
  • :b *part-of-filename*是在列表中查找所需文件的最佳方法,即它比缓冲区编号,制表符或用于跟踪文件的窗口更快,并且认知负荷更少。

:b *part-of-filename*的唯一烦恼是有时您尚未打开文件,因此需要先返回:e path/to/full-filename

标签用于区分真正不相关的文件。

或者方便使用特定的Windows布局(免责声明:我本人从未使用过它)。

或用于很少使用但可预测需要的文件。对我来说,这通常是一个commitMessage文件,我在工作时会对其进行注释,因此在进行提交时,我不必进行过多思考。 gt:b com<enter>快(如果您感到幸运,则:b com<tab><enter>

  • :tabe commitMessage
  • gtgT也是肌肉记忆的最爱

窗口分割用于直观地比较信息

或者可以立即访问重要信息(说实话,除非该信息某种程度上需要我用:e实时更新,例如日志文件),我通常只是将内容拉入当前文件并在那里进行处理)。

  • :vspC-w v打开垂直拆分,即|右键,然后使用:b:e来获取所需的文件
  • :spC-w s打开水平拆分,即顶部/底部
  • C-w C-w,即按两次Ctrl-w,可在可用窗口中旋转
  • C-w c关闭当前窗口
  • C-w o关闭所有其他窗口,仅保持最新状态

答案 6 :(得分:0)

将这些添加到您的.vimrc并开始爱好缓冲区:

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

这样你就可以通过 Tab / Shift Tab 正常模式中向前/向后循环。

答案 7 :(得分:0)

我加载&#34;选择&#34;缓冲区作为快速选项卡(TAB / S-TAB)在它们之间切换。 工作空间的框架适用于我,缓冲区VS标签主要是可见性的东西。我可以在窗口和标签中弹出重要/工作文件,隐藏我当前无需在后台即时使用的文件,而无需记住路径或花时间搜索并在需要时再次加载它们。这允许在一个VIM会话中处理多个任务或项目,我想这在低内存机器中很重要,但也适合将所有编辑任务集中在一个应用程序框架下。我还将缓冲区移位快捷方式设置为Ctrl-Right / Left,这样我也可以快速切换各种缓冲区。

最重要的是,人们只能分割到一些窗口以供屏幕使用,但是可以在多个标签中保存多个窗口设置,从而扩展了工作区并改善了工作流程,从而可以方便地划分复杂的任务旋转多个文件。

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

答案 8 :(得分:0)

我想建议许多年前的出色实现:kien/tabman.vim。它阐明了以下内容:

  • 一个地方可以有许多被仔细隐藏的缓冲区;
  • 通过设计,选项卡旨在以创造性的方式显示缓冲区。
    • 有了适当的tabline插件,可以在第一行(tabline)显示所有隐藏的缓冲区;
    • 根据我对vim-airline的经验,创建新标签页时,该标签页会显示很少的相关信息。
    • 两个标签将并排占据制表位,浪费其余的水平空间
    • 最糟糕的是,我对隐藏的缓冲区一无所知。

这是一个神奇的重新发现这个魔术插件的工具,它应该也已经在我的Vim配置中保留了很多年。 虽然我会继续寻找可以显示所有隐藏缓冲区的内容,但是当鸟瞰鸟瞰图如何跨不同选项卡布置缓冲区时,TabMan是我的超人。

答案 9 :(得分:0)

很好的答案,非常感谢,对某些答案+1。

我想分享一下有关打开和处理多个文件的想法。万一其他(新)用户分享我的情况和需求。

我通常只使用终端选项卡和窗口(Ubuntu,Terminal,从不在服务器上)。我使用终端用户经常知道的快捷键(Ctrl + Shift + T或N)打开它们。然后,我只使用Alt + Tab,或者更好地使用Alt +`和Alt + num。使用set title。也可以快速调整大小,并排放置窗口(Windows键),甚至可以在不同的工作空间上工作。对于grep,我仅使用grep,例如gpy() { grep -r -B 3 -A 3 --include="*.py" "$*" .}。对于导航目录和文件,我知道并继续使用fasd和其他常规解决方案(cd-,pushd,popd,$ _等)。

当然这是用户不满意的,但是我不觉得我没有通过不使用vim缓冲区和制表符而错过很多东西。经过一点vim开发(使用neovim),我同意这样一个事实,即我们不应该考虑不应该使用什么vim,这不是这个问题,https://www.youtube.com/watch?v=Bt-vmPC_-Ho&t=2562s是一个很好的话题。只是每个人都有不同的需求和喜好,这不仅关乎成为专家。 Vim和现在的Neovim能够很好地满足不同的需求,这取决于用户来探索可能的解决方案。

答案 10 :(得分:-1)

制表符和缓冲区是Vi中的两个不同标准。 阅读以下三个定义:

A buffer is the in-memory text of a file
A window is a viewport on a buffer.
A tab page is a collection of windows.

阅读本文,了解更多https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/