使用像缓冲区这样的Vim标签

时间:2008-09-19 14:42:05

标签: vim editor tabs

我已经看过在Vim中使用标签的功能(包括:tabe:tabnew等)作为我当前在隐藏缓冲区中在同一窗口中打开多个文件的做法的替代

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

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

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

10 个答案:

答案 0 :(得分:597)

停止,停止,停止。

这不是Vim的标签设计使用的方式。事实上,他们的名字不好。一个更好的名称是“视口”或“布局”,因为这是一个标签 - 它是现有缓冲区的所有窗口的不同布局。

试图将Vim击败到1个标签== 1缓冲区是徒劳的。 Vim不知道或关心它并不会在所有命令上尊重它 - 特别是,任何使用quickfix缓冲区(:make:grep:helpgrep的东西都是春天的我很乐意忽略标签,你无能为力。

相反:

  • :set hidden
    如果您还没有此设置,请执行此操作。它使vim像地球上的其他多文件编辑器一样工作。您可以拥有在某个窗口中看不到的已编辑缓冲区。
  • 使用:bn:bp:b #:b namectrl-6在缓冲区之间切换。我自己喜欢ctrl-6(单独切换到之前使用的缓冲区,或#ctrl-6切换到缓冲区编号#)。
  • 使用:ls列出缓冲区,或使用MiniBufExplBufExplorer等插件。

答案 1 :(得分:268)

这里的派对迟到了,但很惊讶我在这个列表中没有看到以下内容:

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

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

答案 2 :(得分:155)

Vim :help window很好地解释了“标签与缓冲区”之间的混淆。

  

缓冲区是文件的内存文本    窗口是视口    在缓冲区上。
  标签页是一组窗口。

使用缓冲区在vim中打开多个文件。在其他编辑器(例如notepad ++)中,这是使用制表符完成的,因此vim中的名称选项卡可能会产生误导。

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

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

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

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

答案 3 :(得分:50)

与此处的其他一些答案相反,我说您可以根据需要使用制表符。 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

答案 4 :(得分:15)

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

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

答案 5 :(得分:8)

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

我仔细阅读了所有这些答案,但仍然不清楚。如果你仔细阅读它们,那么事情开始变得有意义了,但是我花了好几个小时在问题之间来回走动。

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

标签页,听起来很像标签,它们就像标签一样,在大多数其他GUI编辑器中看起来很像标签,但它们并非如此。我认为这是一个基于Vim构建的糟糕的心理模型,遗憾的是它在标签页中覆盖了你额外的力量。

我理解的第一个描述来自@crenate's answer,它们相当于多个桌面。在这方面看来,您只打开了几个桌面,但每个桌面都打开了很多GUI窗口。

我想说它们与其他编辑器/浏览器类似:

  1. 标签分组
  2. Sublime Text工作区(即项目中打开的文件列表)
  3. 当你看到它们时你意识到它们的力量,你可以轻松地将文件组(缓冲区)组合在一起,例如您的CSS文件,HTML文件和JS文件在不同的标签页中。这实际上非常棒。

    我觉得令人困惑的其他描述

    视口

    这对我没有意义。虽然它确实有defined dictionary term的视口,但我只听说过:help window doc中的Vim窗口。对于像Sublime Text,Visual Studio,Atom,Notepad ++这样的编辑器,Viewport并不是我所听过的术语。事实上,在我开始尝试使用标签页之前,我从未听说过Vim。

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

    工作区

    这可能更有意义,dictionary definition是:

      

    临时使用的记忆储存设施。

    所以它就像是存放一组缓冲区的地方。

    我最初听起来不像工作区的Sublime Text's concept,它是您在项目中打开的所有文件的列表:

      

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

    然而,考虑更多,这确实同意。如果您将Vim标签页视为Sublime Text项目,那么在每个项目中只打开一个文件并在项目之间切换似乎很奇怪。因此,为什么使用标签页只打开一个文件是奇怪的。

    Windows的集合

    :help window以这种方式引用标签页。还有许多其他答案使用相同的概念。然而,直到你了解一下vim窗口是什么,那就没什么用了,就像在沙滩上建造一座城堡一样。

    正如我上面提到的,vim窗口与视口相同,并且在linux.com article中出色地解释了安静:

      

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

         

    如果您曾经使用过:帮助主题或按F1键,那么您可能已经熟悉此功能。当您输入帮助时,Vim会拆分视口并在顶部视口中打开帮助文档,使文档在底部视口中保持打开状态。

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

答案 6 :(得分:4)

看着    :帮助标签 它看起来不像vim想要像你那样工作......

缓冲区在选项卡之间共享,因此似乎无法锁定给定缓冲区以仅显示在某个选项卡上。

但这是一个好主意。

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

答案 7 :(得分:4)

  • 您可以映射通常操作缓冲区的命令来操作标签,就像我在.vimrc中使用gf一样:

    map gf :tabe <cfile><CR>
    

    我相信你可以用[^

  • 做同样的事情
  • 我认为vim不支持这个标签(尚未)。我使用gt和gT分别移动到下一个和上一个选项卡。您也可以使用Ngt,其中N是标签号。我有一个问题是,默认情况下,标签行中没有显示标签号。为了解决这个问题,我在my .vimrc file的末尾放了几个函数(我没有在这里粘贴,因为它很长并且格式不正确)。

答案 8 :(得分: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,顶部没有标签栏,但另一方面它可以节省屏幕空间,而且可以打开无限数量的文件/缓冲区,缓冲区列表可搜索...

答案 9 :(得分:2)

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

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