为什么Vim专家更喜欢缓冲区而不是制表符?

我没有理解缓冲区。当我在同一个选项卡上打开3个文件并关闭我的窗口时,我通常会生气地发现,下次我打开其中一个文件时,有奇怪的交换文件徘徊并给我讨厌的消息。但我一次又一次地读到,这些东西是我错过的生产力天堂,标签是为平民使用的。

所以我问你,Vim专家:使用缓冲区比使用制表符有什么优点?我看不出两者之间的差别有多大,但我认为自己在操作Vim方面只是处于初级-中级水平。:ls :b#真的比gting快很多吗?我觉得事情肯定不止于此。

93811 次浏览

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

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

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

“Vim专家”并不喜欢缓冲区而不是选项卡:他们使用缓冲区作为文件代理,使用选项卡页作为工作空间。缓冲区和选项卡页有不同的用途,因此选择一个而不是另一个没有任何意义 . txt

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

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

  2. Vim在7.0中引入了选项卡页面,作为用户创建临时“工作区”的一种方式。在它们的特性、特定选项、特定命令或:help部分中,没有任何内容表明选项卡页可以或应该用作文件代理。

    当然,除了名字而且和“标签页”的出现,这导致了很多混乱

  3. 如果没有:set hidden(它在默认情况下是禁用的,并且不容易找到),Vim就不可能在不写入当前缓冲区或放弃其更改的情况下切换到另一个缓冲区。新用户没有意识到这个选项,他们别无选择,只能大量使用窗口,或者使用他们能找到的最接近“标签”的功能:标签页。

“Tab page”是该功能的一个不幸的名称选择,特别是在一个被阅读文档是浪费时间的想法所主导的时代。

在Vim中,标签页是建立在窗口之上的抽象,本身也是建立在缓冲区之上的抽象。每个新关卡都添加了有用的功能,但限制了你的工作流程。

“缓冲方式”

使用基于缓冲区的工作流,您正在处理的文件将沿着单个维度分布。你可以在你的缓冲区中循环,你可以通过输入它的名称(带完成)或它的数字来访问一个特定的缓冲区,你可以在缓冲区之间交替,你可以很容易地瞄准它们。基本上没有摩擦。

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

    Eight buffers open < / p >

  2. 切换号码:

    按号码切换 < / p >

  3. 切换名称:

    切换名称 < / p >

缓冲区是Vim的文件代理。如果你从文件的角度考虑,你就会从缓冲区的角度考虑

“窗口”

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

使用窗口,在打开的文件之间导航要么太复杂,要么太简单,即使使用'switchbuf':sb。主要是因为您被迫使用两组命令来完成本质上相同的事情:访问缓冲区。

如下所述,Windows有它们的用途,但它们不具备在任何人的工作流中替换缓冲区所需的东西。

这里我正在做一个Vim配色方案。这两个窗口是同一个缓冲区的不同视图:上面的一个作为参考,有一个配色方案中使用的颜色代码表,下面的一个是我工作的地方:

Working on a colorscheme

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

“tab方式”

使用基于选项卡的工作流,您基本上可以尝试模仿以前的编辑器所使用的用户体验,同时完全忽略Vim选项卡页面的本质。如果我们暂时忘记这个策略通常是非常无效的,它也是不可能的,就像在windows中一样,强迫Vim坚持“一个文件=一个选项卡”范式而不失去很多的灵活性。

仍然使用与上面相同的文件,表行占用了很大的空间,实际上没有任何好处。我所有的文件和所有的选项卡都被称为javascript*.vim,所以我不能做3gt,并确信我将在正确的地方结束,而且不可能通过名称到达特定的选项卡。此外,它的标签可能非常没有帮助,但完全符合逻辑的[Quickfix List]…由于没有实际的方法将文件/缓冲区绑定到标签页,基本上只剩下一种实际的方法来在标签页/缓冲区/文件之间导航:循环。

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

  1. 8个缓冲区在8个选项卡页中打开(错了)

    错误 < / p >

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

    Right < / p >

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

总之

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

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

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

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

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

可以使用缓冲区名称的任何片段进行匹配。例如,如果你有request_manager.javaqueue_manager.java缓冲区,那么:buffer que:b que会匹配它们,但会切换到queue_manager.java,因为它在开始时匹配。

我曾经把每个缓冲区放在一个单独的标签中,但我厌倦了不断地gtgT-ing到处都是。

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

下面这些技巧完全改变了我之前的看法:

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

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

我觉得在强迫使用这些新模式一周左右之后,我更容易想象我打开了哪些缓冲区,以及如何在短短几次自动笔划中到达其中任何一个缓冲区。

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

  • 我有)(分别映射到“转到下一个标签”和“转到上一个标签”。tn打开新选项卡。我还使用tabm来帮助保持内容的组织性。

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

  • 我还没有找到任何比Ctrl-P更好的东西,但它确实需要一些时间来处理所有文件。

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

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

这样你就可以在正常模式中通过选项卡/转变选项卡向前/向后循环遍历它们。

我加载“选定的”缓冲区作为选项卡,以快速(TAB/S-TAB)在它们之间切换。 工作区的框架适合这里,对我来说,缓冲区VS选项卡主要是可见性的东西。我可以在窗口和选项卡中弹出重要的/工作文件,并在后台隐藏那些我目前不需要使用的文件,而不必记住路径或花费时间搜索并在需要时再次加载它们。这允许在一个VIM会话中处理多个任务或项目,我猜这在低内存机器中很重要,但也有利于将所有编辑任务集中在一个应用程序框架下。我还将缓冲区移动快捷方式设置为__abc0 -右/左,这样我也可以快速地在各种缓冲区之间移动。< / p >

底线是,一个人只能根据屏幕的大小划分一些窗口,但他可以在几个选项卡中保留多个窗口设置,从而扩大工作空间,改善工作流程,允许方便地划分旋转多个文件的复杂任务。

对于交换文件,您可以告诉VIM将它们全部保存在您指定的一个文件夹中。为此使用:set directory

我想推荐一个多年前的出色实现:前/ tabman.vim。它澄清了以下内容:

  • 一个人可以有尽可能多的缓冲区,小心地隐藏在某个地方;
  • 从设计上讲,选项卡是为了以创造性的方式显示缓冲区。
    • 使用一些适当的tabline插件,可以显示顶部行(tabline)的所有隐藏缓冲区;
    • 根据我使用vim-airline的经验,当我创建一个新标签时,表行将显示很少的相关信息。
    • 两个标签将并排占据表行槽,浪费了其余的水平空间
    • 更糟糕的是,我不再知道隐藏的缓冲区是什么。
    • 李< / ul > < / >
    这是一个奇妙的重新发现这个神奇的插件,它应该已经在我的Vim配置中呆了很多年了。 当我继续寻找一些东西,也显示所有隐藏的缓冲区,TabMan是我的超人,当它有一个鸟瞰缓冲区是如何安排在不同的选项卡
制表符和缓冲区是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/

把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

制表符用于区分真正不相关的文件。

或者保持一个特定的窗口布局方便(免责声明:我自己从来没有用过)。

或者很少使用,但可以预见需要的文件。对我来说,这通常是一个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关闭所有其他窗口,只保持当前