题 如何在Vim中有效地处理多个文件?


我已经开始使用Vim来开发Perl脚本,并开始发现它非常强大。

我喜欢的一件事是能够一次打开多个文件,例如 vi main.pl maintenance.pl 然后在它们之间跳转:

:n
:prev

并查看打开的文件

:args

要添加文件,我可以说:

:n test.pl

我希望将其添加到我的文件列表中,但它会清除我当前的文件列表以及何时键入 :args 我只有 test.pl 打开。

那么如何将文件添加到我的args列表中并将其删除?


972
2017-09-10 09:03


起源


tmux ...在每个窗格中使用vim - Tommy
@Tommy:这样你就无法在文件(vims缓冲区)之间粘贴被删除/删除的内容。如果可用,只有剪贴板可能有帮助(参见接受的答案: stackoverflow.com/questions/5532878/...) - ChristophS


答案:


为什么不使用标签(在Vim 7中引入)? 您可以在标签之间切换 :tabn 和 :tabp, 同 :tabe <filepath> 你可以添加一个新标签;并定期 :q 要么 :wq 你关闭一个标签。 如果你映射 :tabn 和 :tabp 到你的 F7/F8 键可以轻松切换文件。

如果没有那么多文件或者您没有Vim 7,您还可以将屏幕拆分为多个文件: :sp <filepath>。然后你可以切换分屏幕 按Ctrl+w ^ 然后在你想要移动的方向上的箭头键(或代替箭头键, w ^ 为下一个和 w ^ 以前的分屏)


1055
2017-09-10 09:09



要保存并关闭选项卡,您也可以使用 ZZ 代替 :wq (就像通常保存和关闭一样) - Andreas Grech
我正在使用Ubuntu 10.10中的vim-gnome软件包,我可以使用Ctrl + PageUp和Ctrl + PageDown在标签之间切换。我没有配置任何东西;这是默认的。 - Joey Adams
此外,在编辑模式下 gt 转到下一个标签,然后 gT 转到上一个标签。 - Dean
您可以使用ngt跳转到任何选项卡,其中n是选项卡的索引(以1开头)。我认为有一个选项可以显示文件名附近的每个标签的索引,但我不知道它是什么。如果有人知道,我很乐意听到它。 - void-pointer
另请注意,您可以使用 -p 标志从命令行打开选项卡中的多个文件。例如, gvim -p main.pl maintenance.pl 将在选项卡中打开这两个文件。 - Matthew Strawbridge


清单

要查看当前缓冲区列表,我使用:

:ls

开盘

要使用,要打开新文件

:e ../myFile.pl

增强的标签完成(放 set wildmenu 在你的 .vimrc)。

注意:您也可以使用 :find 它将为您搜索一组路径,但您需要首先自定义这些路径。


交换

要在所有打开的文件之间切换,我使用

:b myfile

增强的标签完成(仍然 set wildmenu)。

注意: :b# 选择上次访问的文件,以便您可以使用它在两个文件之间快速切换。


使用Windows

Ctrl-W s 和 Ctrl-W v 水平和垂直分割当前窗口。你也可以使用 :split 和 :vertical split (:sp 和 :vs

Ctrl-W w 在打开的窗口和之间切换 Ctrl-W h (要么 j 要么 k 要么 l)浏览打开的窗口。

Ctrl-W c 关闭当前窗口,然后 Ctrl-W o 关闭除当前窗口之外的所有窗口。

用a开始vim -o 要么 -O flag以自己的分割方式打开每个文件。


有了这些,我不需要Vim中的标签,我的手指找到我的缓冲区,而不是我的眼睛。

注意:如果您希望所有文件都转到相同的Vim实例,请使用。启动Vim --remote-silent 选项。


493
2017-09-10 09:47



如果你正在玩多个缓冲区,我建议你 LustyJuggler。 - Arun M
感谢您为处理多个文件时最常使用的vim命令提供了非常好的快速参考。 - quanticle
要么 :b# 其中#是缓冲区中的文件索引,而不仅仅是上次访问的文件索引 - Brian
:b 是一个非常强大的命令,因为它可以接受缓冲区编号和缓冲区名称作为参数。还有什么?它还支持文件名的任何部分的制表符完成。比如,你在缓冲区2中打开了foo.txt,你可以输入 :b 2<Enter> 要么 :b foo.txt 要么 :b oo<Tab><Enter> 编辑该文件。是的,当您按<Tab>键时,最后一个将完成'oo'到'foo.txt'。 - Susam Pal
我的.vimrc中有这一行: nnoremap gb :ls<cr>:b<space>。当我打字 gb 在命令模式下,它列出了我的打开缓冲区和类型 :b ,准备好我开始输入缓冲区名称/号码。 - nkorth


:ls

用于打开缓冲区列表

  • :bp 上一个缓冲区
  • :bn 下一个缓冲区
  • :bn (n 一个数字)移动到第n个缓冲区
  • :b <filename-part> 使用tab键提供自动完成功能(真棒!!)

在某些版本的vim中, bn 和 bp 实际上是 bnext 和 bprevious 分别。在这种情况下,选项卡自动完成很有帮助。

或者当您处于正常模式时,请使用 ^ 切换到您正在处理的最后一个文件。

另外,您可以保存vim的会话

:mksession! ~/today.ses

以上命令将当前打开的文件缓冲区和设置保存到 ~/today.ses。您可以使用加载该会话

vim -S ~/today.ses

没有麻烦记住昨天你离开的地方。 ;)


202
2017-09-15 19:03



@shyam:在哪里使用命令:vim -S~ / today.ses - Sagar Jain
来自命令行的@SagarJain - shyam
转到特定的缓冲区:N CTRL- ^ - showise
@shyam我想我爱你!不知怎的,我从来都不确定mksession命令,但今天突然之间,我决定必须有一些方法来保存文件列表以轻松打开它们。这甚至更好,因为它甚至似乎存储完整的状态(窗口分割,缓冲区位置等)。那谢谢啦! - Kasapo
另外,使用 " 标记为上次跳转到文件中的位置。 - Chromium


添加到 args 列表:

:argadd

要从中删除 args 列表:

:argdelete

在您的示例中,您可以使用 :argedit test.pl将test.pl添加到 args 一步列出并编辑文件。

:help args 提供更多细节和高级用法


96
2017-09-10 09:34



这确实是问题的答案,尽管给出了标题,其他答案是完全公平的。 - Soren Bjornstad


我使用缓冲命令 - :bn (下一个缓冲区), :bp (上一个缓冲区) :buffers (列出打开的缓冲区) :b<n> (开放缓冲区n) :bd (删除缓冲区)。 :e <filename> 将只是打开一个新的缓冲区。


45
2017-09-10 09:43



:ls比:缓冲区更快 - aehlke


我认为您可能使用错误的命令查看已打开的文件列表。

尝试做一个 :ls 要查看已打开的文件列表,您将看到:

   1 %a   "./checkin.pl"            line 1
  2 #    "./grabakamailogs.pl"     line 1
  3      "./grabwmlogs.pl"         line 0
  etc.

然后,您可以通过列出的数字引用它们来反弹文件,例如: :3B

或者您可以通过输入数字来分割屏幕,但使用sb而不是b。

旁边%表示当前可见的文件,#表示备用文件。

按下即可轻松切换这两个文件 按Ctrl  转移  6

编辑:喜欢 :ls 您可以使用 :reg 查看寄存器的当前内容,包括包含已删除内容的0-9寄存器。如果您想重复使用之前删除的某些文本,这将非常有用。


36
2017-09-10 09:34



很高兴看到像%和#这样的相关信息。 +1 - Ashish Ojha


Vim(但不是原来的Vi!)有一些标签,我发现(在许多情况下)优于缓冲区。你可以说 :tabe [filename] 在新选项卡中打开文件。通过单击选项卡或组合键完成选项卡之间的循环[ñ]gt 和 gT。 Graphical Vim甚至还有图形标签。


30
2017-09-10 09:07



谢谢,听起来不错,但遗憾的是我们只在服务器上安装了VIM 6.1。 - Edward Tanguay
选项卡非常方便使用通配符: vim -p dir/*。最大标签大小为10,但您可以更改它 ~/.vimrc 设置 tabpagemax 其他一些价值。 - Campa


:e 和 :badd 只会接受一个参数,因此以下内容将失败

:e foo.txt bar.txt
:e /foo/bar/*.txt
:badd /foo/bar/*

如果要从vim中添加多个文件,请使用 arga[dd]

:arga foo.txt bar.txt
:arga /foo/bar/*.txt
:argadd /foo/bar/*

23
2017-12-08 19:43