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

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

我喜欢的一件事是能够使用以下方法一次打开多个文件:

vi main.pl maintenance.pl

然后在它们之间跳:

:n
:prev

并查看打开哪个文件:

:args

要添加文件,我可以说:

:n test.pl

我希望将其添加到文件列表中,但是它将清除当前文件列表,并且当我键入:args我只会打开test.pl

那么,如何在 args 列表中添加和删除文件?

答案

为什么不使用选项卡(在 Vim 7 中引入)?您可以使用:tabn:tabp在标签之间切换,使用:tabe <filepath>您可以添加新标签;并使用常规的:q:wq关闭选项卡。如果将:tabn:tabpF7 / F8键,则可以轻松地在文件之间切换。

如果没有那么多文件,或者您没有 Vim 7,也可以将屏幕拆分为多个文件:sp <filepath> 。然后,您可以使用Ctrl + W ,然后按您要移动的方向使用箭头键在拆分屏幕之间进行切换(或者用箭头键代替w ,代表下一个, W代表上一个拆分屏幕,而不是箭头键)

清单

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

:ls

开场

要打开一个新文件,我使用

:e ../myFile.pl

具有增强的制表符完成功能(在.vimrc放入set wildmenu )。

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


交换

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

:b myfile

具有增强的制表符完成功能(仍set wildmenu )。

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


使用视窗

Ctrl-W sCtrl-W v可以水平和垂直拆分当前窗口。您也可以使用:split:vertical split:sp:vs

Ctrl-W w在打开的窗口之间切换,而Ctrl-W h (或jkl )在打开的窗口之间导航。

Ctrl-W c关闭当前窗口,而Ctrl-W o关闭当前窗口以外的所有窗口。

-o-O标志开头的 vim 会以各自的拆分方式打开每个文件。


有了这些,我不需要 Vim 中的选项卡,而且手指可以找到缓冲区,而不是眼睛。

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

:ls

有关打开缓冲区的列表

  • :bp以前的缓冲区
  • :bn下一个缓冲区
  • :bnn一个数字)移动到第 n 个缓冲区
  • :b <filename-part>使用 Tab 键提供自动补全功能(太棒了!)

在某些版本的 vim 中, bnbp实际上分别是bnextbprevious 。标签自动完成在这种情况下很有用。

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

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

:mksession! ~/today.ses

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

vim -S ~/today.ses

不用麻烦记住您昨天离开的地方。 ;)

要添加到args列表中:

:argadd

要从args列表中删除:

:argdelete

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

:help args提供了更多详细信息和高级用法

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

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

尝试执行:ls来查看已打开的文件列表,您将看到:

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

然后,您可以通过列出的数字来引用文件,例如:3b

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

顺便说一句,%是指当前可见的文件,而#是指备用文件。

您可以通过按Ctrl Shift 6轻松在这两个文件之间切换

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

Vim(但不是原始的 Vi!)有一些选项卡,我发现(在许多情况下)这些选项卡比缓冲区更高级。您可以说:tabe [filename]在新标签页中打开文件。通过单击选项卡或组合键 [ n ] gtgT可以完成选项卡之间的循环。图形 Vim 甚至具有图形选项卡。

这里有很多答案!我不用重新设计轮子就能使用的东西 - 最著名的插件(不会很快消失并且被很多人使用)非常快速和令人讨厌。

  • ctrlpvim / ctrlp.vim-按名称查找文件,按位置或名称模糊搜索
  • jlanzarotta / bufexplorer-浏览打开的缓冲区(当您不记得最近打开和修改过多少文件并且不记得它们在哪里时,可能是因为您使用 Ag 搜索它们)
  • rking / ag.vim搜索有关gitignore的文件
  • scrooloose / nerdtree查看目录结构, 环顾四周 ,添加 / 删除 / 修改文件

编辑:最近我一直在使用dyng / ctrlsf.vim进行上下文视图搜索(例如 Sublime 搜索),并且我将引擎从ag切换到ripgrep 。表现出色。

EDIT2:CtrlSF一起,您可以使用mg979 / vim-visual-multi ,一次对多个文件进行更改,然后最后一次保存它们。

: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/*

该线程中的某些答案建议使用制表符,而其他建议使用缓冲区来完成相同的事情。制表符和缓冲区是不同的。我强烈建议您阅读本文 “ Vim Tab 疯狂 - 缓冲区与 Tabs ”。

这是我从文章中摘录的一个不错的摘要:

摘要:

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