为什么Vim专家喜欢缓冲区选项卡?

我不明白缓冲区。 当我在同一个选项卡上打开3个文件并closures我的窗口时,我通常很恼火地发现下次我打开其中一个文件,那里有奇怪的交换文件缠绵,给我讨厌的消息。 但一次又一次,我读到这些东西是我错过了的生产力涅and,标签是为平民使用的。

所以我问你,Vim专家:在caching中使用caching有什么优势? 我不明白这种差异可能会有很大的不同,但我认为自己只能在Vim运行的初级阶段。 是:ls :b#真的快得多吗? 我觉得它必须比这更深入。

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

“Vim专家”不喜欢缓冲区选项卡:他们使用缓冲区作为他们是文件代理和选项卡页作为工作区。 缓冲区和标签页有不同的目的,所以select一个到另一个是没有任何意义的。

缓冲区和选项卡的问题是一个混乱 ,由独立的事实相结合造成的。

  1. 大多数“现代”文本编辑器和IDE使用标签隐喻来表示加载的文件。 这个隐喻作为一个信息系统 – 它向用户显示打开的文件和他们的状态 – 以及作为一个交互设备 – 它允许用户操纵(重新sorting,select,closures…)这些打开的文件。 尽pipe他们有很多限制,标签无处不在,人们习惯了他们,并期待他们到处都是。

  2. Vim在7.0中引入了标签页 ,作为用户创build临时“工作空间”的一种方式。 他们的function,他们的具体选项,他们的具体命令或他们的:help部分没有什么build议标签页可以或应该被用作文件代理。

    当然,除了“标签页”的名称外观之外,什么都没有,这导致了很多混淆。

  3. 没有:set hidden ,默认情况下禁用,不容易find,Vim使它不可能切换到另一个缓冲区,而不写入当前的或放弃其更改。 新用户,不知道这个选项,别无select,只能转向大量的Windows使用或最近的“标签式”function,他们可以find:标签页。

“标签页”是该function的一个不幸的名字select,特别是在阅读文档浪费时间的主导时代。

在Vim中,标签页是一个build立在窗口之上的抽象,它们本身是一个build立在缓冲区之上的抽象。 每一个新的水平增加了有用的function,但限制你的工作stream

“缓冲方式”

通过基于缓冲区的工作stream程,您正在使用的文件将沿着一个维度分发。 你可以循环访问你的缓冲区,你可以通过input部分名字(带有完成)或者它的编号访问一个特定的缓冲区,你可以在缓冲区之间交替,你可以很容易地定位它们。 基本上没有摩擦。

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

    八个缓冲区打开

  2. 按数字切换:

    按数字切换

  3. 按名称切换:

    按名称切换

缓冲区是Vim的文件代理。 如果你认为在文件方面,你认为在缓冲区方面。

“窗口的方式”

通过基于窗口的工作stream程,您的“文件”都将沿着与仅使用缓冲区另外两个“物理”维度相同的单一“虚拟”维度进行分配。 但是发现这些维度的笛卡尔空间几乎完全是分开的:移动到另一个缓冲区仍然意味着“移动到另一个文件”,但移动到另一个窗口则不是。 对应于所需文件的缓冲区可以显示在该窗口中,但也可以显示在另一个窗口中,也许在另一个标签页中,或根本不显示。

使用窗口,在打开的文件之间导航要么变得太复杂,要么过于简单,即使使用'switchbuf':sb 。 主要是因为你被迫使用两套命令来实现同样的function:访问一个缓冲区。

Windows有他们的使用,如下所述,但他们没有什么需要在任何人的工作stream程中取代缓冲区。

在这里我正在研究一个Vim色彩scheme。 这两个窗口是同一缓冲区的不同视图:最上面的一个作为参考,在colorscheme中使用了一个颜色代码表,最下面的一个是我工作的地方:

在colorscheme上工作

Windows不是作为文件代理devise的,不能被制作成一个:它们是“容器”或“视口”,旨在为你提供一个缓冲区视图。 不多不less。

“标签方式”

通过基于标签的工作stream程,您基本上可以尝试模仿您之前的编辑器所习惯的用户体验,同时完全忽略了Vim标签页的本质。 如果我们暂时忘记这个策略通常是非常无效的,那么就像Windows一样,也不可能强迫Vim坚持这个“一个文件=一个标签”的范式,而不会失去很多的灵活性。

仍然使用与上面相同的文件,tabline占据了一个几乎没有任何好处的重要空间。 我的所有文件和所有选项卡都被称为javascript*.vim所以我不能做3gt并有信心我会在正确的地方结束,并且不可能通过名称到达特定的选项卡。 除此之外,它的标签很可能是非常无用的,但完全合乎逻辑的[Quickfix List] …因为没有将文件/缓冲区绑定到标签页的实际方法,所以基本上只剩下一个实际的方法在标签页/缓冲区/文件之间切换:循环。

是的,我的标准是只有8个标签,如果我有20个!

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

    错误

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

    对

标签页是“容器”或“视口”,用于包含一个或多个窗口,这些窗口本身也是devise用于包含缓冲区的“容器”。

结论是

“Vim专家”(让我们假设我可以说,就像我是一个) 不喜欢缓冲区的标签:他们只是使用Vim,因为它的devise和完全舒适的devise:

  • “Vim专家”有2,30或97个缓冲区,非常高兴,他们不需要处理空间分布;

  • 当他们需要比较两个文件或在当前缓冲区的一部分中工作,同时又保留另一个作为参考时,“Vim专家”使用Windows,因为这就是它们的使用方式;

  • 当他们需要在项目的一个单独部分上工作一段时间而不会干扰他们当前的视图时,“Vim专家”会加载一个全新的标签页。

我曾经把每一个缓冲区都放在一个单独的标签中,但是我却厌倦了每一个地方都经常使用gT和gT。

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

这里有一些技巧完全改变了我以前的观点:

  • 缓冲区pipe理:b。 你在这个上得到惊人的快速。 查看vim,使用vanilla Vim快速切换文件(无插件)
  • 跳转/更改列表(ctrl o / i和g;)
  • 替代文件(^)
  • tpope的未受伤的插件: https : //github.com/tpope/vim-unimpaired 。 用映射在不同的缓冲区列表之间飞行。

这是我典型的工作stream程:

  • 打开vim,并使用编辑(通常用正则expression式)打开一个缓冲区
  • 意识到我需要打开另一个文件。 使用“编辑”也是如此。 如果我想在这个缓冲区和当前打开的缓冲区之间切换,我将使用“sp”或“vsp”在一个单独的窗口中打开它。
  • 重复,直到我有3-5个文件,我将使用上面的项目符号列表中的技术在您的缓冲区之间进行切换。
  • 如果我想用我的缓冲区“重新开始”,请closuresvim并重新打开。

我觉得,在强制这些新模式一个星期左右之后,更容易看出我已经打开了哪些缓冲区,以及如何在仅仅几次自动敲击中find其中的任何一个缓冲区。

选项卡的缺点是,您一次只能看到一个内容。 因此,如果您在浏览器中使用它们,您将无法并排查看多个缓冲区,甚至无法查看分割中相同文件的不同部分。 因此,许多人build议只使用选项卡来隔离不同的工作区(例如,一个用于Java项目,另一个用于待办事项列表,第三个用于黑方脚本)。

你所描述的问题使得看起来你正在使用Vim错误。 要么(主要)只有一个专用实例。 然后,如果您重新编辑缓冲区,则隐藏的缓冲区将会简单地“重新出现”(现在您可以使用缓冲区列表来调用缓冲区),并且不会有交换文件消息。 或者,为每个项目/文件/编辑会话使用单独的Vim实例,但是完成这个习惯完全是:quit在完成文件时:quit每个实例。

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

缓冲区名称的任何片段都可以用来匹配。 例如,如果你有缓冲区request_manager.javaqueue_manager.java那么:buffer que matches或者:b que都是,但是会在开始匹配时切换到queue_manager.java。

我在我的工作stream中使用标签, CtrlP和Vim会话,并且已经使用了一年多了:

  • 我有(分别映射到“转到下一个选项卡”和“转到上一个选项卡”) t打开一个新的选项卡,我也利用tabm帮助保持组织。

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

  • 我还没有find比CtrlP更好的东西,但是要处理所有的文件才能find。

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

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

这样,您可以通过Tab / Shift Tab正常模式下向前/向后循环。