我已经看到了在Vim中使用选项卡(使用:table,:tabnew等)的能力,以取代我目前在隐藏缓冲区的同一个窗口中打开多个文件的做法。

我想每个不同的文件,我已经打开,总是在自己的选项卡。然而,有一些事情阻碍了这一点。我如何解决这些问题:

When commands like gf and ^] jump to a location in another file, the file opens in a new buffer in the current tab. Is there a way to have all of these sorts of commands open the file in a new tab, or switch to the existing tab with the file if it is already open? When switching buffers I can use :b <part of filename><tab> and it will complete the names of files in existing buffers. <part of filename> can even be the middle of a filename instead of the beginning. Is there an equivalent for switching tabs?


当前回答

停,停,停。

这不是Vim标签的设计用途。事实上,它们的名字是错的。更好的名字应该是“viewport”或“layout”,因为这就是标签的含义——它是所有现有缓冲区窗口的不同布局。

试图将Vim转换为1个tab == 1缓冲区是徒劳的。Vim不知道也不关心,它不会在所有命令上都尊重它——特别是任何使用快速修复缓冲区的命令(:make、:grep和:helpgrep是首先想到的缓冲区)都会很高兴地忽略制表符,而且您无法阻止这种情况。

而不是:

:设置隐藏 如果您还没有这个集合,那么就这样做。它使vim像地球上所有其他多文件编辑器一样工作。你可以编辑在某个窗口中不可见的缓冲区。 使用:bn,:bp,: b#,:b name和ctrl-6来切换缓冲区。我自己喜欢ctrl-6(单独切换到以前使用的缓冲区,或者#ctrl-6切换到缓冲区编号#)。 使用:ls列出缓冲区,或者像MiniBufExpl或BufExplorer这样的插件。

其他回答

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

:tab sball -这将为每个打开的缓冲区打开一个新标签。

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

如果你想让缓冲区像制表符一样工作,请查看tabline插件。

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

我使用像标签一样的缓冲区,使用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,你不会在顶部有一个标签栏,但另一方面,它节省了屏幕上的空间,此外,你可以有无限的文件/缓冲区打开,缓冲区列表是可搜索的…

这是给那些不熟悉Vim和来自其他文本编辑器的人的答案(在我的例子中是Sublime text)。

我把所有的答案都看了一遍,还是不明白。如果你读得足够多,事情就开始有意义了,但我花了几个小时来来回回地回答问题。

首先,正如其他人解释的那样:

标签页,听起来很像标签页,它们的行为和外观很像大多数其他GUI编辑器中的标签页,但它们不是。我认为这是建立在Vim上的一个糟糕的思维模型,不幸的是,它掩盖了你在标签页中拥有的额外功能。

我从@crenate的回答中了解到的第一个描述是,它们相当于多个桌面。从这方面来看,你只打开了几个桌面,但每个桌面中都打开了许多GUI窗口。

我想说的是,它们类似于其他编辑器/浏览器:

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

当你看到它们时,你会意识到它们的力量,你可以很容易地将文件(缓冲区)组在一起,例如你的CSS文件,你的HTML文件和你的JS文件在不同的标签页。这实际上是非常棒的。

其他让我感到困惑的描述

视窗

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

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

工作区

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

临时使用的存储设备。

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

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

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

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

窗口集合

帮助窗口以这种方式引用页签。还有许多其他的答案使用相同的概念。然而,在您了解vim窗口是什么之前,它并没有多大用处,就像在沙子上建造城堡一样。

正如我上面提到的,一个vim窗口和一个视口是一样的,在这篇linux.com的文章中有很好的解释:

A really useful feature in Vim is the ability to split the viewable area between one or more files, or just to split the window to view two bits of the same file more easily. The Vim documentation refers to this as a viewport or window, interchangeably. You may already be familiar with this feature if you've ever used Vim's help feature by using :help topic or pressing the F1 key. When you enter help, Vim splits the viewport and opens the help documentation in the top viewport, leaving your document open in the bottom viewport.

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

停,停,停。

这不是Vim标签的设计用途。事实上,它们的名字是错的。更好的名字应该是“viewport”或“layout”,因为这就是标签的含义——它是所有现有缓冲区窗口的不同布局。

试图将Vim转换为1个tab == 1缓冲区是徒劳的。Vim不知道也不关心,它不会在所有命令上都尊重它——特别是任何使用快速修复缓冲区的命令(:make、:grep和:helpgrep是首先想到的缓冲区)都会很高兴地忽略制表符,而且您无法阻止这种情况。

而不是:

:设置隐藏 如果您还没有这个集合,那么就这样做。它使vim像地球上所有其他多文件编辑器一样工作。你可以编辑在某个窗口中不可见的缓冲区。 使用:bn,:bp,: b#,:b name和ctrl-6来切换缓冲区。我自己喜欢ctrl-6(单独切换到以前使用的缓冲区,或者#ctrl-6切换到缓冲区编号#)。 使用:ls列出缓冲区,或者像MiniBufExpl或BufExplorer这样的插件。