ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

当 gf 和 ^] 之类的命令跳转到另一个文件中的某个位置时,该文件会在当前选项卡的新缓冲区中打开。有没有办法让所有这些类型的命令在新选项卡中打开文件,或者如果文件已经打开,则切换到带有文件的现有选项卡?切换缓冲区时,我可以使用 :b 它将完成现有缓冲区中文件的名称。 甚至可以是文件名的中间而不是开头。是否有切换标签的等价物?


O
OliverUv

停,停,停。

这不是 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 列出缓冲区,或 MiniBufExpl 或 BufExplorer 之类的插件。


对我来说,这是一个错误,而不是“用户错误”。在网上搜索“vim tabs”表明几乎所有其他人都不同意你,或者不知道使用 Vim tabs 的“真实”方式。此外,如果选项卡真的是“布局”视图,那么为什么默认选项卡标题是当前文件名?如果我想要同一个文件的多个视图,那么我所有的标签标题都将是相同的名称(不是很有帮助?)。所以无论你怎么看,Vim 中的默认选项卡实现都是有缺陷的。
您还要在标签标题中显示什么?它显示当前缓冲区名称(不是“文件名”)。无论如何,您都可以更改选项卡标题中显示的内容。
请记住,在非美式键盘上,CTRL-^ 可能比 CTRL-6 更容易使用。在德语键盘上,^ 位于 1 的左侧——非常方便。 :h CTRL-^: Mostly the ^ character is positioned on the 6 key, pressing CTRL and 6 then gets you what we call CTRL-^. But on some non-US keyboards CTRL-^ is produced in another way.
为“停止,停止,停止”+1。 Vim 既是一种工具,也是一种心态。向新用户传授这种心态很重要,这样他们才能充分利用该工具。
Drew Neil 在 How to use tabs 上的 vimcast 对 Textmate 中的标签页与 Vim 中的标签页进行了出色的比较
p
phs

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

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

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


+1 for switchbuf - set switchbuf=useopen 可以很好地避免 :make:vimgrep 和类似命令的烦人行为,这些命令会更改窗口布局中的缓冲区,即使缓冲区已经显示。
为什么不适合我?设置:se switchbuf=usetab,newtab后,当使用bn切换缓冲区时,它仍然在当前选项卡中打开缓冲区文件而不是切换到现有选项卡?有什么不对?
switchbuf 仅适用于缓冲区拆分命令 (:sb) 和快速修复命令 (:cc)。来源:vim 文档。
i
icc97

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

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

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

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

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

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

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


这实际上是一个很棒的答案,但需要阅读几次才有意义。 buffers = tabs, windows = gui windows, tab pages = desktops 到目前为止,我为不熟悉这些概念的人找到了最好的意义
我倾向于认为它们是透过窗户进入房间 - buffer = objectwindow = panetab = window 。我可以在房间里四处走动,从不同的窗口 (tabs) 往里看。不同的窗口可以有不同的窗格的数量、排列和大小。同一个object可以在不同的windows中同时从不同的panes查看。
如果您熟悉 Linux 工作区和 Windows 范例,那么您将看到 vim 用法的传统。一开始只有一个窗口。然后,窗口管理器允许您将窗口拆分为窗格(平铺 WM)或重叠窗格(浮动 WM),但它们仍将每个窗格称为窗口。现在添加工作区的概念,其中窗格可以显示在多个工作区中。因此,在此范例中,buffer = appwindow = windowtab = workspace
kd 考虑的另一种方式,其他人(如 NotePad++)仍在使用多个缓冲区,选项卡只是将其呈现给用户的方式。真正不同的是,Vim 的 :ls 输出并不总是可见的。 (参见上文提到的 BufExplorer 和 MiniBufExpl)
Z
Zenexer

与此处的其他一些答案相反,我说您可以根据需要使用标签。 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 别名映射 vim 添加到 vim -p


+1 为 vim -p 但请注意,默认情况下最多只能显示 10 个标签。额外的文件被加载到缓冲区中,但不会显示在它们自己的选项卡中。
@IanB:如何克服将其限制为 10 个选项卡的默认设置?
@0xC0000022L 见 tabpagemax 设置
D
Dominic Dos Santos

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

查看名为 Mini Buffer Explorer 的插件,一旦安装和配置,您就可以像使用选项卡一样使用缓冲区,而不会丢失任何功能。


C
Community

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

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

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

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

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

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

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

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

其他让我感到困惑的描述

视口

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

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

工作区

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

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

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

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

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

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

窗户的集合

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

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

Vim 中一个非常有用的功能是能够在一个或多个文件之间分割可视区域,或者只是分割窗口以更轻松地查看同一文件的两个位。 Vim 文档将其称为视口或窗口,可以互换。如果您曾经通过使用 :help topic 或按 F1 键使用过 Vim 的帮助功能,您可能已经熟悉此功能。当您输入帮助时,Vim 会拆分视口并在顶部视口中打开帮助文档,而您的文档会在底部视口中打开。

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


最后,在全职使用 Vim 一年之后,我遇到了一个我想使用多个标签页的案例。目前缓冲区对我来说非常适合我,因为我会在其他编辑器中使用选项卡。但是有一个大显示器,我正在比较一大堆 3-4 个不同的缓冲区。然后一位同事要我在代码库的其他地方搜索一些代码。我可以创建一个新的标签页,而不是丢失我的一组比较窗口,然后允许我像正常使用 Vim 时那样进行单独的搜索,然后我可以在完成后关闭标签页并返回到我的初始设置
M
Mike G.

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

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

不过,这是个好主意。

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


我试过了,除了难以在选项卡之间导航之外,问题在于不能在终端选项卡之间共享被拉出的文本,因为它们本质上是两个不同的终端/外壳
@puk:试试 YankRing vim 插件。它将抽出的文本保存在文件中,因此可以跨 vim 实例共享。
@Pixelastic 我在这里找到了一个合适的解决方案来拉到系统剪贴板。此外,Vim 在一种情况下效果最好。我不再让它做我想做的事,而是学会了如何正确使用 vim :-) stackoverflow.com/a/8757876/654789
@puk:谢谢,我没想到使用系统剪贴板也意味着在 vim 实例之间共享它:)
L
Lucas Oman

您可以映射通常操作缓冲区的命令来操作选项卡,就像我在 .vimrc 中对 gf 所做的那样: map gf :tabe 我相信您可以对 [^

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


<c-w>gf 将在新标签中打开光标下的文件名
j
jkramer

我使用像标签这样的缓冲区,使用 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,顶部没有标签栏,但另一方面它可以节省屏幕空间,此外,您可以打开无限数量的文件/缓冲区,并且可以搜索缓冲区列表...


i
icc97

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

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


G
Good Pen

相关:Vim: can global marks switch tabs instead of the file in the current tab?

可能对解决 OP 问题的一小部分有用:

    nno \ <Cmd>call To_global_mark()<cr>
    fun! To_global_mark()
       -tab drop /tmp/useless.md
        exe 'normal! `' .. toupper(input("To global mark: "))
    endf