386

我已经研究了在 Vim 中使用选项卡(使用 、 等)的能力:tabe:tabnew以替代我目前在隐藏缓冲区中的同一窗口中打开许多文件的做法。

我希望我打开的每个不同文件始终位于其自己的选项卡中。但是,有些事情会阻碍这一点。我该如何解决这些问题:

  1. 当命令喜欢gf^]跳转到另一个文件中的某个位置时,该文件会在当前选项卡的新缓冲区中打开。有没有办法让所有这些类型的命令在新选项卡中打开文件,或者如果文件已经打开,则切换到带有文件的现有选项卡?

  2. 当我可以使用切换缓冲区时 :b <part of filename><tab> ,它将完成现有缓冲区中的文件名。<part of filename>甚至可以是文件名的中间而不是开头。是否有切换标签的等价物?

4

10 回答 10

680

停,停,停。

这不是 Vim 选项卡的设计用途。事实上,他们的名字是错误的。更好的名称是“viewport”或“layout”,因为这就是选项卡——它是所有现有缓冲区的窗口的不同布局。

试图将 Vim 打入 1 个选项卡 == 1 个缓冲区是徒劳的。Vim 不知道也不关心,它不会在所有命令上都尊重它——特别是,任何使用 quickfix 缓冲区(:make, :grep,并且:helpgrep是那些浮现在脑海中的)的东西都会很高兴地忽略制表符,而且你无法停止那。

反而:

  • :set hidden
    如果你还没有这一套,那就去做吧。它使 vim 像地球上所有其他多文件编辑器一样工作。您可以编辑在某个窗口中不可见的缓冲区。
  • 使用:bn, :bp, :b #, :b name, 和ctrl-6在缓冲区之间切换。我喜欢ctrl-6我自己(单独它切换到以前使用的缓冲区,或#ctrl-6切换到缓冲区号#)。
  • 用于:ls列出缓冲区,或MiniBufExplBufExplorer 之类的插件。
于 2008-09-19T16:44:57.077 回答
284

在这里聚会有点晚了,但很惊讶我没有在这个列表中看到以下内容:

:tab sball- 这将为每个打开的缓冲区打开一个新选项卡。

:help switchbuf- 这控制缓冲区切换行为,请尝试:set switchbuf=usetab,newtab。这应该意味着如果缓冲区打开,则切换到现有选项卡,否则创建一个新选项卡。

于 2010-08-13T11:36:57.070 回答
189

Vim:help window很好地解释了“选项卡与缓冲区”的混淆。

缓冲区是文件的内存文本。
窗口是缓冲区上的视口。
标签页是窗口的集合。

在 vim 中使用buffers实现打开多个文件。在其他编辑器(例如 notepad++)中,这是通过选项卡完成的,因此 vim 中的选项卡名称可能会产生误导。

Windows的目的是拆分工作区并在一个屏幕上同时显示多个文件(缓冲区)。在其他编辑器中,这可以通过打开多个 GUI 窗口并在桌面上重新排列它们来实现。

最后,在这个类比中,vim 的标签页将对应多个桌面,即窗口的不同重新排列。

正如 vimhelp: tab-page解释的那样,当一个人想要临时编辑一个文件,但不想改变当前窗口和缓冲区布局中的任何内容时,可以使用标签页。在这种情况下,可以使用另一个标签页来仅用于编辑该特定文件。

当然,您必须记住,在许多标签页或窗口中显示相同的文件会导致显示相同的工作副本(缓冲区)。

于 2012-01-23T15:05:38.093 回答
58

与此处的其他一些答案相反,我说您可以根据需要使用标签。vim 被设计为多功能和可定制的,而不是强迫您根据预定义的参数工作。我们都知道程序员喜欢把我们的“道德”强加给其他人,所以这个成就肯定是一个主要特征。

<C-w>gf是缓冲区gf命令的选项卡等效项。 <C-PageUp>并将<C-PageDown>在选项卡之间切换。(在 Byobu 中,这两个命令对我不起作用,但它们在 Byobu/tmux 之外工作。替代方法是gtgT。) <C-w>T会将当前窗口移动到新标签页。

如果您希望 vim 尽可能使用现有选项卡,而不是创建重复的选项卡,请添加:set switchbuf=usetab到您的 .vimrc 文件中。您可以添加newtab到列表 ( :set switchbuf=usetab,newtab) 以强制显示编译错误的 QuickFix 命令在单独的选项卡中打开。相反,我更喜欢split它在拆分窗口中打开编译错误。

如果您启用了鼠标支持:set mouse=a,您可以通过单击它们与选项卡进行交互。默认情况下还有一个+按钮将创建一个新选项卡。

对于选项卡上的文档,请:help tab-page在正常模式下键入。(完成此操作后,您可以练习使用 将窗口移动到选项卡<C-w>T。)有很长的命令列表。一些窗口命令与选项卡有关,因此您可能还想通过:help windows.

补充:2013-12-19

要在 vim 中打开多个文件,每个文件在单独的选项卡中,请使用vim -p file1 file2 .... 如果你和我一样总是忘记添加-p,你可以在最后添加,因为 vim 遵循正常的命令行选项解析规则。或者,您可以将 bash 别名映射添加vimvim -p.

于 2012-11-11T05:27:00.470 回答
14

我遇到了同样的问题。我希望标签像缓冲区一样工作,但我从来没有设法让它们发挥作用。我最终确定的解决方案是让缓冲区表现得像制表符!

查看名为Mini Buffer Explorer的插件,一旦安装和配置,您将能够以与选项卡相同的方式使用缓冲区,而不会丢失任何功能。

于 2008-09-19T15:12:05.473 回答
10

对于那些不熟悉 Vim 并且来自其他文本编辑器(在我的例子中是 Sublime Text)的人来说,这是一个答案。

我通读了所有这些答案,但仍然不清楚。如果您阅读了足够多的内容,那么事情就会开始变得有意义,但是我花了几个小时在问题之间来回走动。

正如其他人所解释的那样,第一件事是:

Tab Pages听起来很像tabs,它们的行为类似于选项卡,并且看起来很像大多数其他 GUI 编辑器中的选项卡,但事实并非如此。我认为这是在 Vim 中构建的一个糟糕的心理模型,不幸的是,它掩盖了您在标签页中拥有的额外功能。

我理解的第一个描述来自@crenate 的回答是它们相当于多个桌面。从这方面来看,您只会打开几个桌面,但每个桌面内都会打开许多​​ GUI 窗口。

我会说它们与其他编辑器/浏览器中的相似:

  1. 选项卡分组
  2. Sublime Text 工作区(即项目中打开的文件的列表)

当您看到它们时,您会意识到它们的强大之处在于您可以轻松地将文件集(缓冲区)组合在一起,例如不同标签页中的 CSS 文件、HTML 文件和 JS 文件。这实际上非常棒。

其他让我感到困惑的描述

视口

这对我来说毫无意义。一个视口,虽然它确实有一个定义的字典术语,但我只听说过在:help window文档中提到 Vim 窗口。对于 Sublime Text、Visual Studio、Atom、Notepad++ 等编辑器,我从未听说过 Viewport 一词。事实上,在我开始尝试使用标签页之前,我从未听说过 Vim。

如果您像查看多个桌面一样查看标签页,那么将桌面称为单个窗口似乎很奇怪。

工作区

这可能更有意义,字典定义是:

临时使用的内存存储设施。

所以它就像一个存储一组缓冲区的地方。

我最初听起来不像Sublime Text 的工作空间概念,它是您在项目中打开的所有文件的列表:

sublime-workspace 文件,其中包含用户特定的数据,例如打开的文件和对每个文件的修改。

然而仔细想想,这确实是一致的。如果你将 Vim 选项卡页面视为 Sublime Text 项目,那么在每个项目中只打开一个文件并在项目之间不断切换似乎很奇怪。因此,为什么使用标签页只打开一个文件是奇怪的。

窗户的集合

以这种:help window方式引用标签页。加上许多其他答案使用相同的概念。但是,除非您了解 vim 窗口是什么,否则它并没有多大用处,就像在沙子上建造城堡一样。

正如我上面提到的,vim 窗口与视口相同,并且在这篇linux.com 文章中得到了很好的解释:

Vim 中一个非常有用的功能是能够在一个或多个文件之间分割可视区域,或者只是分割窗口以更轻松地查看同一文件的两个位。Vim 文档将其称为视口或窗口,可以互换。

如果您曾经通过使用 :help topic 或按 F1 键使用过 Vim 的帮助功能,您可能已经熟悉此功能。当您输入帮助时,Vim 会拆分视口并在顶部视口中打开帮助文档,而您的文档会在底部视口中打开。

我觉得很奇怪标签页被称为窗口集合而不是缓冲区集合。但我想你可以打开两个单独的标签页,每个标签页都有多个窗口都指向同一个缓冲区,至少到目前为止我是这样理解的。

于 2017-03-30T18:15:36.017 回答
4

看着 :help 选项卡,vim 似乎不想像你那样工作......

缓冲区在选项卡之间共享,因此似乎不可能将给定缓冲区锁定为仅出现在某个选项卡上。

不过,这是个好主意。

通过使用支持选项卡的终端(如 multi-gnome-terminal),然后在每个终端选项卡中运行 vim 实例,您可能会获得您想要的效果。虽然不完美...

于 2008-09-19T14:50:18.270 回答
4
  • 您可以映射通常操作缓冲区的命令来操作选项卡,就像我在 .vimrc 中使用 gf 所做的那样:

    map gf :tabe <cfile><CR>
    

    我相信你也可以用 [^

  • 我不认为 vim 支持这个选项卡(还)。我分别使用 gt 和 gT 移动到下一个和上一个选项卡。您也可以使用 Ngt,其中 N 是选项卡编号。我的一个烦恼是,默认情况下,选项卡编号不会显示在选项卡行中。为了解决这个问题,我在.vimrc 文件的末尾添加了几个函数(我没有粘贴到这里,因为它很长并且格式不正确)。

于 2008-09-19T14:53:33.990 回答
4

我使用像选项卡这样的缓冲区,使用BufExplorer插件和一些宏:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

使用 BufExplorer,您的顶部没有标签栏,但另一方面,它可以节省屏幕空间,而且您可以打开无限数量的文件/缓冲区,并且可以搜索缓冲区列表......

于 2008-09-19T22:46:12.463 回答
2

如果您希望缓冲区像选项卡一样工作,请查看tabline 插件

它使用单个窗口,并在顶部添加一行来模拟选项卡(仅显示缓冲区列表)。这是很久以前出现的,当时只在 GVim 中支持选项卡,但在命令行 vim 中不支持。由于它只使用缓冲区操作,所以一切都与 vim 的其余部分很好地集成在一起。

于 2013-06-27T21:12:55.770 回答