使用Vim的选项卡,例如缓冲区


366

我已经研究了在Vim中使用制表符(带有:tabe:tabnew等)的功能,以代替目前在同一窗口中在隐藏缓冲区中打开许多文件的做法。

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

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

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

Answers:


642

停止,停止,停止。

这不是设计Vim标签的方式。实际上,它们的名字是错误的。更好的名称是“ viewport”或“ layout”,因为这就是制表符,它是所有现有缓冲区的窗口的不同布局。

试图将Vim分成1个tab == 1个缓冲区是徒劳的。Vim不知道也不关心它不会尊重它在所有的命令,尤其是,任何使用的quickfix缓冲区(:make:grep,和:helpgrep是那些春天记)将愉快地忽略选项卡并没有什么可以做,以停止那。

代替:

  • :set hidden
    如果您还没有此设置,请这样做。它使vim像地球上所有其他多文件编辑器一样工作。您可以编辑在窗口某处不可见的缓冲区。
  • 使用:bn:bp:b #:b name,和ctrl-6以缓冲区之间切换。我喜欢ctrl-6我自己(单独切换到以前使用的缓冲区,或#ctrl-6切换到buffer number #)。
  • 使用:ls以列表的缓冲区,或者像一个插件MiniBufExplBufExplorer

192
对我来说,这是一个错误,而不是“用户错误”。在网络上搜索“ vim选项卡”表明几乎所有其他人都不认同您,或者没有意识到使用Vim选项卡的“真实”方式。另外,如果选项卡实际上是“布局”视图,那么为什么默认选项卡标题是当前文件名?如果我想要同一个文件的多个视图,那么我所有的标签标题都将是相同的名称(不是很有帮助吗?)。因此,无论以哪种方式查看,Vim中的默认选项卡实现都是有缺陷的。
cmcginty

45
您还将在标签标题中显示什么?它显示当前的缓冲区名称(不是“文件名”)。您仍然可以更改选项卡标题中显示的内容。
aehlke

46
@Casey:FWIW,当我第一次了解Vim的标签时,不得不为它们以及它们的用途包裹住我的头,正是想到了Zathrus给出的定义。(我是Vim新手)。因此,不,我不同意这是一个如此残缺或不直观的功能……甚至更不用说“关于每个人”的观点不同(并认为至少一个或两个引用可以使该断言更具分量)。它具有多个同时显示的屏幕布局,效果非常好。
ata

17
此评论是错误的,我不确定为什么要接受或接受。下面的罗宾斯给出了正确的答案-:tab sball和:switchbuf是您要寻找的。
Roel 2012年

38
+1表示“停止,停止,停止”。Vim既是一种工具,也是一种心态。教会新用户的心态很重要,这样他们就可以充分利用该工具的潜力。
Cody Poll 2013年

273

在这里参加聚会有点晚,但感到惊讶的是我没有在此列表中看到以下内容:

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

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


4
+1 switchbuf- set switchbuf=useopen是伟大的,以避免恼人的行为:make:vimgrep以及类似的命令改变缓冲区中,即使已经显示缓冲区中的窗口布局。
mMontu'2

3
为什么不适合我?设置后:se switchbuf=usetab,newtab,当bn用于切换缓冲区时,它仍在当前选项卡中打开缓冲区文件,而不是切换到现有选项卡吗?有什么不对?
zhiyelee 2012年

173

Vim :help window很好地解释了混淆“制表符与缓冲区”。

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

在vim中使用缓冲区可以打开多个文件。在其他编辑器(例如notepad ++)中,这是通过选项卡完成的,因此vim中的名称选项卡可能会引起误解。

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

最终,在这个类比中,vim的标签页将对应于多个桌面,这是窗口的不同重排。

正如vim所help: tab-page解释的,当一个人想要临时编辑文件,但又不想更改窗口和缓冲区当前布局中的任何内容时,可以使用选项卡页。在这种情况下,可以将另一个选项卡页仅用于编辑该特定文件的目的。

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


11
这实际上是一个了不起的答案,但经过多次阅读才有意义。到目前为止,我发现对于不熟悉概念的人来说,buffers =选项卡,windows = gui Windows,选项卡页=台式机是最好的选择
icc97

4
我倾向于认为它们是从窗户看向房间- buffer= 对象window= 窗格tab= 窗口。我可以在房间里四处移动,并从不同的窗口tabs)进行查找。不同的窗口可以具有不同的窗格数量,排列和大小。相同的对象可以从不同的同时查看窗格在不同的窗口
go2null

如果您熟悉Linux Workspaces和Windows范例,那么您将了解vim用法的传统。一开始只是一个窗户。然后,窗口管理器允许您将窗口分为窗格(平铺WM)或重叠窗格(浮动WM),但它们仍将每个窗格称为窗口。现在添加一个工作区的概念,其中可以在多个工作区中显示窗格。因此,在此范例中,buffer= appwindow= windowtab= 工作空间
go2null

56

与这里的其他一些答案相反,我说您可以根据需要使用选项卡。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


3
vim -p注意,+ 1 是默认情况下最多只能显示10个标签。多余的文件会加载到缓冲区中,但不会显示在它们自己的选项卡中。
IanB 2014年

@IanB:如何克服将其限制为10个标签的默认设置?
0xC0000022L

3
@ 0xC0000022L,请参阅tabpagemax设置
IanB '18年

14

我遇到了同样的问题。我希望选项卡像缓冲区一样工作,但我从来没有设法使它们到达缓冲区。我最终选择的解决方案是使缓冲区的行为像制表符一样!

签出名为Mini Buffer Explorer的插件,安装并配置好后,您将能够以与选项卡相同的方式来使用缓冲区,而不会失去任何功能。


10

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

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

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

选项卡页面,听起来很像选项卡,它们在大多数其他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主题或按F1键来使用Vim的帮助功能,则可能已经熟悉此功能。输入帮助时,Vim会拆分视口并在顶部视口中打开帮助文档,而在底部视口中打开文档。

我感到奇怪的是,选项卡页被称为窗口的集合而不是缓冲区的集合。但是我想您可以打开两个单独的选项卡页面,每个选项卡页面都具有指向相同缓冲区的多个窗口,至少到目前为止,这是我所了解的。


1
最终,经过一年的全天候Vim使用,我遇到了一个案例,其中我想使用多个标签页。目前,缓冲区对我来说非常理想,就像我在其他编辑器中使用制表符一样。但是有一个大显示器,我正在比较3-4个不同的缓冲区。然后一位同事要我在代码库中的其他位置搜索一些代码。我可以创建一个新的选项卡页面,而不是丢失比较窗口集,然后让我像正常使用Vim时那样进行单独的搜索,然后可以在完成后关闭该选项卡页面并返回我的初始设置。
icc97

4

看着:help选项卡,看来vim不想按照您的方式工作...

缓冲区在选项卡之间共享,因此似乎无法将给定的缓冲区锁定为仅出现在特定选项卡上。

不过,这是个好主意。

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


我尝试过,这样做的问题除了使标签之间难以导航外,还在于无法在终端标签之间共享被
选中的

@puk:尝试使用YankRing vim插件。它将选中的文本保存在文件中,因此可以在vim实例之间共享。
pixelastic 2012年

@Pixelastic我在这里找到了拉到系统剪贴板的合适解决方案。而且,Vim在一种情况下效果最好。我停止做它想要的事情,并学会了如何正确使用vim :-) stackoverflow.com/a/8757876/654789
puk 2012年

@puk:谢谢,我没有想到使用系统剪贴板也意味着在vim实例之间共享它:)
pixelastic 2012年

4
  • 您可以映射通常用于操纵缓冲区的命令来操纵选项卡,就像我在.vimrc中使用gf所做的那样:

    map gf :tabe <cfile><CR>
    

    我确定您可以使用[^

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


<c-w>gf将在新标签页中的光标下方打开文件名
Peter Rincker 2011年

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时,顶部没有选项卡栏,但另一方面,它节省了屏幕空间,此外,您可以打开无数个文件/缓冲区,并且可以搜索缓冲区列表...


2

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

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

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.