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

时间:2020-03-05 18:50:36  来源:igfitidea点击:

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

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

:n
:prev

并查看打开哪个文件

:args

要添加文件,我可以说:

:n test.pl

我期望它将被添加到我的文件列表中,但是却清除了当前文件列表,当我键入:args时,我只打开了test.pl

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

解决方案

回答

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

回答

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

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

回答

要添加到args列表中:

:argadd

要从args列表中删除:

:argdelete

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

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

回答

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

尝试执行: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来查看寄存器的当前内容,包括包含已删除内容的0-9寄存器。如果我们想重复使用先前删除的某些文本,此功能特别有用。

回答

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

回答

清单

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

:ls

开场

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

:e ../myFile.pl

增强了制表符的完成效果(将set wildmenu放入.vimrc中)。

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

交换

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

:b myfile

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

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

使用视窗

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关闭当前窗口以外的所有窗口。

-o或者-O标志开头的vim会以自己的分割打开每个文件。

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

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

回答

如果我们要使用多个缓冲区,我认为最重要的是
设为隐藏
这样,即使我们要更改的缓冲区中未保存的更改,也可以让我们切换缓冲区。

回答

在vim中使用多个文件时,我主要使用以下命令(打开约350个文件):

  • :b <部分文件名> <tab>(跳转到缓冲区)
  • :bw(缓冲区擦除,删除缓冲区)
  • :e <文件路径>(编辑,打开一个新的缓冲区>
  • pltags-允许跳转到子程序/方法定义

回答

:ls

有关打开缓冲区的列表

  • :bp前一个缓冲区
  • :bn下一个缓冲区
  • :bn(na number)移到第n个缓冲区
  • :b <filename-part>,带有制表符,可提供自动补全功能(太棒了!)

在某些版本的vim中," bn"和" bp"实际上分别是" bnext"和" bprevious"。标签自动完成在这种情况下很有用。

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

另外,我们可以保存vim的会话

:mksession! ~/today.ses

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

vim -S ~/today.ses

别忘了昨天我们从哪里离开。 ;)

回答

我使用多个设置为隐藏在我的〜/ .vimrc文件中的缓冲区。

迷你缓冲区资源管理器脚本也很不错,可以很好地紧凑地列出缓冲区。然后,:b1或者:b2......转到相应的缓冲区,或者使用迷你缓冲区浏览器并在缓冲区中使用Tab键。

回答

我为GVim和命令行vim使用相同的.vimrc文件。我倾向于在GVim中使用选项卡,在命令行vim中使用缓冲区,因此我设置了.vimrc以便于使用它们更加容易:

" Movement between tabs OR buffers
nnoremap L :call MyNext()<CR>
nnoremap H :call MyPrev()<CR>

" MyNext() and MyPrev(): Movement between tabs OR buffers
function! MyNext()
    if exists( '*tabpagenr' ) && tabpagenr('$') != 1
        " Tab support && tabs open
        normal gt
    else
        " No tab support, or no tabs open
        execute ":bnext"
    endif
endfunction
function! MyPrev()
    if exists( '*tabpagenr' ) && tabpagenr('$') != '1'
        " Tab support && tabs open
        normal gT
    else
        " No tab support, or no tabs open
        execute ":bprev"
    endif
endfunction

这掩盖了H和L的现有映射,但是它使文件之间的切换非常快捷和容易。只需按" H"代表下一个,按" L"代表上一个;无论我们使用制表符还是缓冲区,都将获得预期的结果。