为什么Vim专家更喜欢缓冲区而不是选项卡?


242

我不明白缓冲区。当我在同一选项卡上打开3个文件并关闭窗口时,通常令我烦恼的是,下次我打开那些文件中的一个时,发现有奇怪的交换文件徘徊并给我带来讨厌的消息。但是我一次又一次地读到,这些东西是我所缺少的生产力的必杀技,而且标签是供平民使用的。

因此,我问您,Vim专家:使用缓冲区比制表符有什么好处?我看不出两者之间的差异会有多么大的不同,但我只会在操作Vim的初学者到中级水平上考虑自己。是:ls :b#真的远远快于gt荷兰国际集团在吗?我觉得它必须比这更深入。


6
对于那些学习Vim或受到其他基于GUI的编辑者的影响的Vim,我强烈建议您先阅读@Jonathan Brink的答案,然后再回到此处。
icc97

1
不用太担心。我使用标签作为在文件之间导航的主要方式。如您所说,<#> gt易于键入。为了使其更易于使用,我自定义了选项卡数据以包括选项卡编号。如果一次需要查看多个缓冲区,可以在选项卡中拆分一个新窗口。尽管@romaini声称,使用Vim的这种方式使我非常高效,因为它符合我的个人隐喻。还请注意,在37年(到目前为止)的程序员职业生涯中,我一次不必打开五个或六个以上的文件,而且这种情况很少。做对您有用的事情。:)
托尼

做有效的事。有些人在一个会话中使用大量文件,因此缓冲区的重要性更大。甚至Bram Moolenaar都说“可以随意组织它们”。打开20个选项卡不是正确的方法,但是几个文件的选项卡并不是世界末日。Bram管理大量文件的解决方案是打开多个终端会话。他说,这就是他的做法,但不是每个人都应该这样做。
工艺

似乎没有正确突出显示的最明显区别是,如果您停留在一个选项卡中,则可以通过:split进入“窗口”来同时查看多个缓冲区。如果所有缓冲区(文件)都位于单独的选项卡中,则不会同时显示该视图。我建议使用1标签开始学习vim,并习惯于拆分。
NeilG '19

Answers:


498

正如ZyX在#vim上所说的那样,这个问题听起来像“为什么Vim专家偏爱美味而不是温暖?”

“ Vim专家”不喜欢使用缓冲区而不是选项卡:他们使用缓冲区作为文件代理,使用标签页作为工作区。缓冲区和选项卡页具有不同的用途,因此优先选择缓冲区和选项卡毫无意义。

缓冲区和制表符的问题是混乱的原因之一,这是由多个独立事实共同引起的。

  1. 大多数“现代”文本编辑器和IDE都使用制表符来表示加载的文件。这个比喻充当了一个信息系统–它向用户显示了哪些文件已打开以及它们的状态–以及作为一个交互设备–它允许用户操纵(重新排序,选择,关闭……)那些打开的文件。尽管有很多限制,制表符无处不在,人们已经习惯了制表符,并期望无处不在。

  2. Vim 在7.0中引入了选项卡页面,以供用户创建临时的“工作区”。它们的功能,其特定的选项,其特定的命令或它们的:help节中没有任何内容表明选项卡页可以或应该用作文件代理。

    除了名字 当然, “标签页”外观会引起很多混乱。

  3. 不带 :set hidden,默认情况下它是禁用的,而且很难找到,Vim使得无法在不写入当前缓冲区或放弃其更改的情况下切换到另一个缓冲区。不知道该选项的新用户别无选择,只能转向使用繁琐的Windows或他们可以找到的最接近的“类似于标签的”功能:标签页。

“标签页”是该功能的不幸名称选择,尤其是在以阅读文档为浪费时间这一思想为主导的时代。

在Vim中,选项卡页是建立在Windows之上的抽象,本身就是建立在缓冲区之上的抽象。每个新级别都会添加有用的功能,但会限制您的工作流程。

“缓冲方式”

使用基于缓冲区的工作流程,您正在使用的文件沿一个维度分布。您可以循环浏览缓冲区,可以通过键入其名称的一部分(带有补全)或编号来访问特定缓冲区,可以在缓冲区之间交替,可以轻松地定位它们。基本上没有摩擦。

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

    八个缓冲区打开

  2. 按数字切换:

    按号码切换

  3. 按名称切换:

    按名称切换

缓冲区是Vim的文件代理。如果考虑文件,就考虑缓冲区。

“窗口方式”

使用基于窗口的工作流,您的“文件”都沿着相同的单个“虚拟”维度分布,就像您仅使用缓冲区时一样,也沿着其他两个“物理”维度分布。但是找到这些尺寸的笛卡尔空间几乎完全分开:移动到另一个缓冲区仍然意味着“移动到另一个文件”,但是移动到另一个窗口则没有。对应于所需文件的缓冲区可以显示在该窗口中,但也可以显示在另一个窗口中,也许在另一个选项卡页面中,或者根本不显示。

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

Windows有其用途,如下所述,但它们没有替换任何人的工作流程中的缓冲区所需的资源。

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

从事色彩设计

Windows并非设计为文件代理,也不能制成文件代理:它们是“容器”或“视口”,旨在为您提供缓冲区视图。不多不少。

“制表方式”

使用基于选项卡的工作流程时,您实际上试图模仿以前的编辑器所习惯的用户体验,同时完全忽略了Vim选项卡页面的本质。如果我们暂时忘记这种策略通常没有效果的,那么就像Windows一样,也不可能迫使Vim遵循“一个文件=一个选项卡”的范例而又不损失很多灵活性。

仍然使用与上述相同的文件,制表位占用了大量空间,几乎没有任何好处。我的所有文件和所有选项卡都被调用,javascript*.vim因此我无法做,3gt并且确信我会在正确的位置结束,并且无法通过名称访问特定的选项卡。此外,它的标签很可能是非常无用的,但却是完全合乎逻辑的事实[Quickfix List]……由于没有将文件/缓冲区绑定到标签页的实用方法,因此基本上只剩下一种在标签页之间导航的实用方法/ buffers / files:循环。

是的,我的选项卡只剩下8个选项卡,想想如果我有20个!

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

    错误

  2. 用于两个特定任务的两个选项卡(右)

    对

标签页是设计为包含一个或多个窗口的“容器”或“视口”,它们本身也是设计为包含缓冲区的“容器”。

结论

“ Vim专家”(假设我可以像我一样说话)不喜欢使用缓冲区而不是制表符:他们只是使用Vim,因为它是设计而成的,并且对这种设计非常满意:

  • “ Vim专家”加载了2、30或97个缓冲区,很高兴他们不必处理空间分布;

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

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


10
对于一些额外的链接看到我使用缓冲区有效
彼得Rincker

7
@DavidEG,拥有20个缓冲区根本没有问题,因此实际上并不需要插件。另一方面,无论是否支持说服文件代理,都无法在20个标签页上显示大多数屏幕(无论插件与否)。
romainl 2014年

2
@Kache,是的,这正是我要说的核心:您可以使用窗口和标签页来显示它们的内容,但不能用作文件代理。因此,争论不是人们应该使用标签页还是缓冲区,而是人们是否应该使用标签页作为文件代理。
romainl 2014年

14
作为“Vim的专家”我可以说,超过4 缓冲区“开”(真“上市,但卸载,除了少数的人”)是一个普通的情况,当我处理类似NeoVim项目(我干脆打开所有*.c*.hscripts/*test/**/*.lua文件)。鉴于我的终端只有239列宽,“每个选项卡一个文件”的方法无法使用。
ZyX

3
并且考虑到有许多插件(Command-T等),对于任何相对较大的项目,使用选项卡更容易在缓冲区和/或文件之间切换。具有≈500个“有趣”文件的neovim是一个大项目,但不是最大的项目。当您面对处理此类项目的必要性时,总是使用某种搜索来进行导航(使用Command-T和朋友进行文件/标签搜索,以及使用多种符号定义方法),因此您绝对没有理由使用制表符这样:无论如何,您都不会使用制表符绑定功能来浏览项目。
ZyX

88

我以前把所有的缓冲区在一个单独的标签,但我厌倦了不断gtgT-ing到处。

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

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

这是我的典型工作流程:

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

我觉得在强迫这些新模式大约一周后,可以轻松地看到我打开了哪些缓冲区,以及如何仅用几次自动操作就可以找到其中的任何一个。


24
像这样的用户/新手友好的解释获得了非常有见地,贬义的,过于复杂的答案(例如此处的最高票数)的大约3%的投票,这真是令人遗憾。我什gT至不知道那是切换标签的命令,我一直在寻找的替代品ctrl+tab。因此,感谢您真正真正地在帮助新用户,而不仅仅是让他们感到愚蠢。
icc97

11
我不得不说我的评论对@romainl的回答不公平,他很高兴回答我对此的疑问。但是可以肯定的是,作为一个尝试学习Vim的人,您的答案会更容易理解,但是,一旦您知道更多,他的答案就会更加完整。
icc97

3
我认为@romainl的答案非常有用,它使我们清楚地了解了缓冲区,窗口和选项卡的设计方式以及如何使用它们。即便如此,我认为Vim用户抓住了机会,以一种不熟悉vi的方式来回答问题,这可能令人沮丧。
keyofnight

3
不记得我从哪里得到的,但是nnoremap <leader>b :ls<CR>:b<space>对于快速切换缓冲区非常有用,因为它显示了当前打开的缓冲区的列表。同样,接受部分名称(只要只有一个匹配项)。
naught101 '19

1
这种方法还具有vim的自动完成的真正优势(默认,没有其他插件)。由于您使用多个缓冲区,因此当您处于插入模式并执行a ctrl Nctrl P(P通常是我使用的)时,它将为您提供一个单词列表以完成您输入的内容...它基于当前的智能缓冲区,拆分中的内容,您刚刚查看的内容以及其他所有打开的文件!
g19fanatic

12

标签的缺点是您一次只能看到一个的内容。因此,如果像在浏览器中一样使用它们,那么您将失去并排查看多个缓冲区的机会,甚至无法拆分查看同一文件的各个部分。因此,许多人建议仅使用选项卡来分隔不同的工作空间(例如,一个用于Java项目,另一个用于待办事项列表,第三个用于侧击脚本)。

您所描述的问题似乎使您使用Vim错误。要么都有(大多数)单个专用实例。然后,如果重新编辑它们,隐藏的缓冲区将简单地“重新出现”(现在您可以使用缓冲区列表来调用它们),并且不会有交换文件消息。或者,在每个项目/文件/编辑会话中使用单独的Vim实例,但是:quit在使用完文件后,养成完全使用每个实例的习惯。


我偶尔使用拆分。我不知道它们被认为是“使用缓冲区”。对我而言,这确实是一个神秘的概念。
2c2c 2014年

1
作为有趣的选项卡重新发现,tabman可以生成类似NerdTree的侧面板,该面板详细显示了每个选项卡中显示的所有缓冲区。
llinfeng

7

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

缓冲区名称的任何片段均可用于匹配。例如,如果您有缓冲区request_manager.javaqueue_manager.java然后将:buffer que:b que匹配,则两者将匹配,但是在开头匹配时将切换到queue_manager.java。


3

我在工作流程中使用选项卡,Ctrl- P和Vim会话,并且已经使用了一年多:

  • 我已经)(映射分别“进入下一个标签”和“去前面的标签”。tn打开一个新标签。我还利用tabm来帮助使事情井井有条。

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

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


1

将2c扔到桩中。

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

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

缓冲区用于文件。

有效:

  • 从精心选择的根目录中打开重要的第一个文件
  • 使用打开文件 :e
  • ls ALL当你第一次开始获得良好的心理模型(你不能神交你看不到的东西,精神或字面意思)的时间
  • 永不: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
  • gt还是gT肌肉记忆的最爱

窗口分割用于视觉比较信息

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

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

答案非常有用,应该有更多的方法。感谢您的提示,尤其是洞察与您的工作流程:b#:bd#
Alacritas

0

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

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

这样,您可以通过/ 在正常模式下向前/向后循环浏览它们。TabShiftTab


5
不要那样做 您将失去的映射<C-I><C-Tab>如果您确实想映射,请映射。

6
另外,:n:N参数列表有关,而不是打开缓冲区。您需要:bn:bp:bnext:bprev)。tpope的未受损伤提供映射]b[b这个(和其他的好东西),如果你想要的。(),或<left><right>箭头,将无疑是不太有用的键覆盖比标签,如果你真的想要一个简短的映射。
Vaz

1
@jeyoung同意-使用它也更有意义,Ctrl + Tab因为大多数其他GUI编辑器和浏览器都使用它。
icc97

0

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

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

这是一个神奇的重新发现这个魔术插件的消息,它应该也已经在我的Vim配置中保留了很多年。尽管我会继续寻找一些可以显示所有隐藏缓冲区的东西,但在鸟瞰如何在不同选项卡之间布置缓冲区时,TabMan是我的超人。



0

我将“选定的”缓冲区作为选项卡加载,以便在它们之间快速(TAB / S-TAB)切换。对于我来说,工作区框架适合这里,缓冲区VS选项卡主要是可见性。我可以在窗口和选项卡中弹出重要/工作文件,并在后台动态隐藏我当前不需要的文件,而不必记住路径或花时间搜索并在需要时重新加载它们。这允许在一个VIM会话中处理多个任务或项目,我想这在低内存计算机中曾经很重要,但也有利于将所有编辑任务集中在一个应用程序框架下。我还将缓冲区移位快捷方式设置为Ctrl-Right / Left,因此我也可以快速切换各种缓冲区。

最重要的是,一个人最多只能拆分一些窗口以供其使用,就像屏幕使用权一样,但是一个人可以在多个选项卡中保留多个窗口设置,从而扩展了一个人的工作空间并改善了工作流程,从而可以方便地分割涉及多个文件的复杂任务。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.