如何在vim的新选项卡中编辑现有缓冲区?


51

假设我已经开始这样的vim了:

vim foo bar

现在,我决定将每个文件都放在自己的标签中。有没有一种方法可以不退出vim并在-p命令行中添加选项?


你们中的许多人可能正在寻找下面liuyang1的答案tabe %提到的 内容
Mateusz Piotrowski

1
@MateuszPiotrowski就像我在该答案的注释中提到的那样,:tabe %不适用于没有有效文件路径的缓冲区。:tab sb每次都能工作。
JoL

Answers:


30

这样启动vim时,您没有vim客户端,文本编辑器使用的是terminal或cmd提示符-这两个文件位于两个不同的缓冲区中。使用:ls列出缓冲区:

:ls
  1 %a   "foo"                 line 6
  2      "bar"             line 0

%a是活动缓冲区。您可以:b2用来切换到缓冲区2,也:bn可以循环到下一个或:bp上一个。我更喜欢(CTRL-W v)垂直拆分窗口,而不是(CTRL-W s)水平拆分窗口。

如果您已加载2个文件且还没有标签,则可以,:tabnew并在新标签类型中:b2

如果您希望始终将缓冲区加载到自己的标签中,请参阅本文


是的,但是我想要标签。
innaM

因此,您已经以一种将文件保存在vim客户端中而不是在cmd /终端外壳中的方式启动了vim?
DaveParillo

1
我不确定你是什么意思。如上所述,我使用shell启动vim,然后运行vim。
innaM

啊! 我想我从来没有真正了解过缓冲区不是局部于选项卡的。我一直认为(不用考虑太多)每个选项卡都有其自己的缓冲区列表。
innaM

在我的机器上,vim将在外壳中启动编辑器。要获得vim图形用户界面,我必须使用gvim。您是正确的-缓冲区对于vim应用程序是全局的。
DaveParillo

47

您要在新标签页中打开缓冲区吗?

拆分屏幕(Ctrl-W),占据一个窗口,然后按Ctrl-W T


嗯 不完全是我的初衷,但开始时还不错。我不知道Ctrl-w T呢。当然,第一个选项卡仍将以这种方式具有两个缓冲区。
innaM

否。将屏幕拆分为两个窗口,并在新选项卡中打开其中一个窗口后,它将离开第一个选项卡。它不会保留(至少它不在我的gvim72上)。就缓冲区而言,它们没有连接到Windows / tabs ...它们更像是vim存储文件内容的内存。
Rook 2009年

啊! 你是对的。我误解了的输出:ls
innaM

同样,ctrl-w V垂直分割窗口。
香农纳尔逊

1
CTRL-W v是一个分裂的窗户正确的命令垂直
JRM

27

您可以通过将tab命令与sb[uffer]命令结合在一起来完成此操作。

首先,您需要在新选项卡中知道要打开的缓冲区的缓冲区ID。您可以使用以下ls命令找出答案:

:ls
  1 %a   "foo"                          line 1
  2      "bar"                          line 0

获得ID后,您可以使用以下方法在新标签中轻松打开它:

:tab sb 2

sb命令通常会在新的拆分窗口中打开给定的缓冲区,但是该tab命令会使其在新选项卡中打开。

tab命令还允许您指定应在选项卡列表中的何处创建新选项卡。例如,:0tab sb 2将导致新的“栏”标签出现在列表的开头,而不是当前标签的后面。


2
您不需要缓冲区编号,在缓冲区名称中给它明确的部分,VIM会为您完成其余的工作。
甜点

1
这就是我一直在寻找和需要的答案。当我:tab buffer part-of-name没有打开新标签时,我感到非常沮丧!但是:tab sb part-of-name像魅力一样运作。谢谢!!!!
Sukima

这不是OP的确切问题,而是我一直在寻找的东西:)
jackcogdill

25

完成OP要求的更好的方法是:

:bufdo tab split

无论有多少缓冲区,这都会将每个缓冲区打开到自己的选项卡中。如果使用过多,很容易在.vimrc中建立映射。与类似这个小vim插件的东西结合在一起,以下代码将在其自己的选项卡中打开:grep(或:Ack)中的每个项目:

:grep foo
:QuickFixOpenAll
:bufdo tab split

当然,使用插件时,对其进行修改就足够容易了,可以直接在选项卡中打开快速修复列表内容。

更新:我真的必须对下面古斯塔夫松的评论大声疾呼。这无疑是最好的答案,并且很好地说明了Vim倾向于构图行为的趋势。建议是:

 :tab sball

值得一看的是Vim的:tab:sball帮助,以了解发生了什么事。


对于后代,与先前编辑类似的方法是:bufdo execute "tabnew %"。我认为新方法更加清晰。
约翰·惠特利

一个警告:如果vim中的起始缓冲区不为空,则似乎将最后一个缓冲区打开了两次。如果找到简单的修复程序,我将发布更新。
约翰·惠特利

12
:tab sball似乎效果更好。
ggustafsson

6

1.在Vim中打开两个文件。

$ vim foo酒吧

2.检查缓冲区的数量。

:ls
  1%a“ foo”
  2“栏”

3.链接两个命令:tabnew打开一个新选项卡,并b <buffer_number>在选项卡中加载所需的缓冲区。

:tabnew | b 2

8
步骤3的问题在于,它首先创建一个带有空缓冲区的新选项卡,然后打开缓冲区2,从而在缓冲区列表中产生一个额外的无标题缓冲区。更好地使用:tab sb 2
rkjnsn

1
@rkjnsn您应该将其发布为答案-最好回答以下问题:“如何在vim的新选项卡中编辑现有缓冲区?”
JonnyRaa 2015年

1
@JonnyLeeds完成了。
rkjnsn

4

只是添加一些其他人没有提到的观点。

  • 当前窗口到新标签页

如果有多个窗口,<C-W>T则将该窗口移到新选项卡。但是,此快捷方式仅适用于“窗口”,不适用于“缓冲区”。如果更喜欢这种样式,:sp或者<C-W>s将当前缓冲区复制到另一个窗口,则将<C-W>T其移至新选项卡。

4次击键或7次击键。

  • 当前缓冲区到新选项卡

:tabe % 打开当前缓冲区的新标签。

7次击键。

  • 缓冲到新标签

如果使用CtrlP插件,也可以使用“ CtrlPBuffer”,然后用<C-t>快捷方式在新标签页中打开它。这种样式,很容易切换到不同的缓冲区。

使用快捷键“ CtrlPBuffer”,至少需要击键4次。


:tabe %是我很久以来一直在寻找的东西,谢谢!
pevik '17

不,:tabe %实际上不会为当前缓冲区打开新选项卡。发生的事情是%将其扩展到当前缓冲区的文件:tabe路径并打开该路径。Vim会看到您正在尝试打开一个已经打开的文件,并将重用您拥有的缓冲区。这意味着这不适用于没有文件路径的缓冲区。如果您使用打开了一个新文件,:new但尚未保存,则无法使用此文件将其放在新选项卡上。您真正需要的命令是rkjnsn回答的内容::tab sb %或更短的内容::tab sb
JoL
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.