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

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

我喜欢的一件事是能够一次打开多个文件:

vi main.pl maintenance.pl

然后在它们之间跳跃:

:n:prev

并查看打开的文件:

:args

要添加一个文件,我可以说:

:n test.pl

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

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

643540 次浏览

Vim(但不是原始的Vi!)有选项卡,我发现(在许多情况下)优于缓冲区。您可以说:tabe [filename]在新选项卡中打开文件。选项卡之间的循环是通过单击选项卡或通过按键组合[n]gtgT完成的。图形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 12 #    "./grabakamailogs.pl"     line 13      "./grabwmlogs.pl"         line 0etc.

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

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

作为备用文件,%表示当前可见的文件,#表示备用文件。

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

编辑:与: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#选择最后访问的文件,因此您可以使用它在两个文件之间快速切换。


使用windows

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。

如果你打算使用多个缓冲区,我认为最重要的是设置隐藏因此,它将允许您切换缓冲区,即使您在要离开的缓冲区中有未保存的更改。

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

  • :b <partial filename><tab>(跳转到缓冲区)
  • :bw(缓冲区擦除,删除缓冲区)
  • :e <file path>(编辑,打开一个新的缓冲区>
  • pltags-启用跳转到子例程/方法定义
:ls

打开缓冲区列表

  • :bp上一个缓冲区
  • :bn下一个缓冲区
  • :bnn一个数字)移动到第n个缓冲区
  • :b <filename-part>与制表符键提供自动完成(真棒!!)

在某些版本的vim中,bnbp实际上分别是bnextbprevious。制表符自动完成在这种情况下很有帮助。

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

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

:mksession! ~/today.ses

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

vim -S ~/today.ses

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

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

迷你缓冲区资源管理器脚本也很不错,可以获得缓冲区的漂亮紧凑列表。然后:b1:b2…转到适当的缓冲区或使用迷你缓冲区资源管理器并通过缓冲区选项卡。

我对gVim和命令行Vim使用相同的. vimrc文件。我倾向于在gVim中使用制表符,在命令行Vim中使用缓冲区,所以我设置了我的. vimrc以使它们更容易使用:

" Movement between tabs OR buffersnnoremap L :call MyNext()<CR>nnoremap H :call MyPrev()<CR>
" MyNext() and MyPrev(): Movement between tabs OR buffersfunction! MyNext()if exists( '*tabpagenr' ) && tabpagenr('$') != 1" Tab support && tabs opennormal gtelse" No tab support, or no tabs openexecute ":bnext"endifendfunctionfunction! MyPrev()if exists( '*tabpagenr' ) && tabpagenr('$') != '1'" Tab support && tabs opennormal gTelse" No tab support, or no tabs openexecute ":bprev"endifendfunction

这会破坏HL的现有映射,但它使文件之间的切换非常快速和容易。只需按H下一步,按L上一步;无论您使用制表符还是缓冲区,您都将获得预期的结果。

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

如果您在osx上并且希望能够单击您的选项卡,请使用MouseTerm和SIMBL(取自这里)。另外,请查看此相关讨论

您可能希望使用vim全局标记

这样您就可以在文件之间快速弹跳,甚至跳转到文件中标记的位置。此外,键命令很短:'C将我带到我正在使用的代码,'T将我带到我正在使用的单元测试。

当您更改位置时,重置标记也很快:mC标记新代码点,mT表示新的测试点。

尝试以下地图以方便编辑多个文件

”拆分窗口

nmap <leader>sh :leftabove vnew<CR>

nmap <leader>sl :rightbelow vnew<CR>

nmap <leader>sk :leftabove new<CR>

nmap <leader>sj :rightbelow new<CR>

“四处走动

nmap <C-j> <C-w>j

nmap <C-k> <C-w>k

nmap <C-l> <C-w>l

nmap <C-h> <C-w>h

我有效地处理多个文件的方法是使用tmux。

它允许您垂直和水平拆分窗口,如:

输入图片描述

我在我的mac和linux机器上都有这种工作方式,我发现它比(在Mac上)提供的本机窗口窗格切换机制更好。我发现切换更容易,只有使用tmux,我才能在我的mac上获得“同一当前目录下的新页面”(尽管事实上似乎有在同一目录下打开新窗格的选项),这是一个令人惊讶的关键部分。当前位置的即时新窗格非常有用。一种为两个操作系统使用相同键组合的新窗格的方法对我来说至关重要,也是未来个人兼容性的奖励。除了多个tmux窗格外,我还尝试使用多个选项卡,例如在此处输入图像描述和多个新窗口,例如在此处输入图像描述,最终我发现多个tmux窗格对我最有用。我非常“视觉化”,喜欢把我的各种上下文放在我面前,作为窗格连接在一起。

tmux还支持水平和垂直窗格,而旧的screen没有(尽管mac的iterm2似乎支持它,但同样,当前的目录设置对我不起作用)。tmux 1.8

我经常使用命令行和git,所以我在bashrc中有这个别名:

alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"

这将在现有窗口的新选项卡中打开每个新文件,并为每个git存储库创建一个窗口。因此,如果您从存储库A打开两个文件,从存储库B打开3个文件,您最终将有两个窗口,一个用于存储库A,有两个选项卡,一个用于存储库B,有三个选项卡。

如果您打开的文件未包含在git存储库中,它将转到默认窗口。

要在选项卡之间跳转,我使用这些映射:

nmap <C-p> :tabprevious<CR>nmap <C-n> :tabnext<CR>

要一次打开多个文件,您应该将其与其他解决方案之一相结合。

当我开始使用VIM时,我没有意识到选项卡应该被用作不同的窗口布局,缓冲区扮演着多个文件编辑/相互切换的角色。实际上,在开始的时候,选项卡甚至在v7.0之前都没有,我只是在终端选项卡中打开了一个VIM(我现在使用的是gnome终端),并使用alt+数字在选项卡之间切换,因为我认为使用: Buffers、: bn和: bp等命令对我来说太多了。当VIM 7.0发布时,我发现管理大量文件并切换到它更容易,但最近我才意识到缓冲区应该始终是要走的路,除非有一件事:您需要配置它以使其正常工作。

因此,我尝试了vim-航空公司并启用了视觉上的标签状缓冲条,但图形是与我的iTerm2有问题,所以我尝试了其他几个,似乎MBE对我最有效。我还设置了Shift+h/l作为快捷方式,因为原始的(移动到当前页面的头部/尾部)对我不是很有用。

map <S-h> :bprev<Return>
map <S-l> :bnext<Return>

它似乎比gt和gT更容易,而且: e也比: tabnew更容易。我发现: bd不如: q方便(MBE有一些问题),但我认为我可以使用缓冲区中的所有文件。

这个线程中的一些答案建议使用选项卡,而另一些建议使用缓冲区来完成同样的事情。选项卡和缓冲区是不同的。我强烈建议您阅读这篇文章“Vim Tab疯狂-缓冲区与标签”。

这是我从文章中提取的一个很好的总结:

总结:

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

我做了一个非常简单的视频显示我使用的工作流程。基本上我使用Ctrl-P Vim插件,并将缓冲区导航映射到回车键。

通过这种方式,我可以在正常模式下按回车键,查看打开的文件列表(显示在屏幕底部的一个小新窗口中),选择我要编辑的文件并再次按回车键。要快速搜索多个打开的文件,只需键入文件名的一部分,选择文件并按回车键。

我在视频中打开的文件不多,但当您开始拥有很多文件时,它会变得非常有用。

由于该插件使用MRU排序对缓冲区进行排序,因此您只需按两次回车键并跳转到您正在编辑的最新文件。

安装插件后,您需要的唯一配置是:

nmap <CR> :CtrlPBuffer<CR>

当然,您可以将其映射到不同的键,但我发现要输入的映射非常方便。

这个线程中的大多数答案都使用普通的vim命令,这当然很好,但我想我会使用我觉得特别有用的插件和函数的组合来提供一个广泛的答案(至少其中一些技巧来自Gary Bernhardt的文件导航提示):

  1. 要在最后两个文件之间切换,只需按<leader>两次。我建议将<leader>分配给空格键:

    nnoremap <leader><leader> <c-^>
  2. For quickly moving around a project the answer is a fuzzy matching solution such as CtrlP. I bind it to <leader>a for quick access.

  3. In the case I want to see a visual representation of the currently open buffers I use the BufExplorer plugin. Simple but effective.

  4. If I want to browse around the file system I would use the command line or an external utility (Quicklsilver, Afred etc.) but to look at the current project structure NERD Tree is a classic. Do not use this though in the place of 2 as your main file finding method. It will really slow you down. I use the binding <leader>ff.

These should be enough for finding and opening files. From there of course use horizontal and vertical splits. Concerning splits I find these functions particularly useful:

  1. Open new splits in smaller areas when there is not enough room and expand them on navigation. Refer here for comments on what these do exactly:

    set winwidth=84set winheight=5set winminheight=5set winheight=999
    nnoremap <C-w>v :111vs<CR>nnoremap <C-w>s :rightbelow split<CR>set splitright
  2. Move from split to split easily:

    nnoremap <C-J> <C-W><C-J>nnoremap <C-K> <C-W><C-K>nnoremap <C-L> <C-W><C-L>nnoremap <C-H> <C-W><C-H>

这里有很多答案!我在没有重新发明轮子的情况下使用的东西-最着名的插件(不会很快死亡并且被许多人使用)是超快速和极客。

  • ctrlpvim/ctrlp.vim-按名称查找文件,按其位置或仅按其名称模糊搜索
  • j lanza rotta/bu f Explorer-浏览打开的缓冲区(当您不记得最近打开和修改了多少文件并且不记得它们在哪里时,可能是因为您使用Ag搜索它们)
  • RKING/ag.vim搜索关于gitignore的文件
  • scrooloose/nerdtree查看目录结构、查找、添加/删除/修改文件

编辑:最近我一直在使用DIGN/ctrlsf.vim来搜索上下文视图(如Sublime搜索),我将引擎从ag切换到Ripgrep。性能非常出色。

编辑2:CtrlSF一起,您可以使用mg 979/vim-视觉-多,一次更改多个文件,然后一次保存它们。

如果仅使用vim内置命令,我见过的在多个缓冲区之间切换的最佳方法是:

nnoremap <Leader>f :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

它完美地结合了:ls:b命令——列出所有打开的缓冲区并等待您输入命令以切换缓冲区。

在vimrc中给出上面的映射,一旦你输入<Leader>f

  • 显示所有打开的缓冲区
  • 您可以:
    • 键入23进入缓冲区23,
    • 键入#以转到替代/MRU缓冲区,
    • 键入文件的部分名称,然后键入<Tab><C-i>以自动完成,
    • 或者只是<CR><Esc>留在当前缓冲区

上述键映射的输出快照为:

:set nomore|:ls|:set more1  h    "script.py"    line 12 #h  + "file1.txt"    line 6  -- '#' for alternative buffer3 %a    "README.md"    line 17 -- '%' for current buffer4       "file3.txt"    line 0  -- line 0 for hasn't switched to5     + "/etc/passwd"  line 42 -- '+' for modified:b '<Cursor> here'

在上面的快照中:

  • 第二列:%a表示当前,h表示隐藏,#表示上一个,空表示尚未切换到。
  • 第三列:+表示修改。

另外,我强烈建议set hidden。见:help 'hidden'

将所有缓冲区更改为tab视图。

 :tab sball

将打开选项卡视图的所有缓冲区。然后我们可以使用任何与选项卡相关的命令

gt or :tabn           "    go to next tabgT or :tabp or :tabN  "    go to previous tab

细节在:help tab-page-commands

我们可以指示vim通过vim -p file1 file2打开多个文件,作为选项卡视图。alias vim='vim -p'会很有用。
同样的事情也可以通过在~/.vimrc

中使用以下自动命令来实现
 au VimEnter * if !&diff | tab all | tabfirst | endif

回答这个问题:添加到参数列表:arga file

要从arg列表中删除:argd pattern

更多:help arglist

我使用以下内容,这为您提供了许多您希望在其他编辑器中拥有的功能,例如Sublime Text/Textate

  1. 使用缓冲区而不是选项卡页面。缓冲区与几乎所有其他编辑器中的选项卡是相同的概念。
  2. 如果您想要具有标签的相同外观,您可以在.vimrclet g:airline#extensions#tabline#enabled = 1中使用vim航空插件并进行以下设置。当您没有打开标签页时,这会自动将所有缓冲区显示为标签头
  3. 使用Tim Pope的未受损,它给出了[b]b分别移动到上一个/下一个缓冲区(加上一大堆其他好东西)
  4. 在你的.vimrc中有set wildmenu,然后当你输入:b <file part>+Tab作为缓冲区时,你会得到一个可能的缓冲区列表,你可以使用左/右箭头滚动
  5. 使用Tim Pope的vim痴迷插件来存储与航空公司很好地合作的会话(我有会话和插件的很多痛苦
  6. 使用Tim Pope的维姆醋插件。这适用于本机:Explore,但使用起来更容易。您只需键入-即可打开资源管理器,这与在资源管理器中查找目录的键相同。使导航更快(然而对于fzf,我很少使用这个)
  7. fzf(可以作为vim插件安装)也是一个非常强大的模糊查找器,您可以使用它来搜索文件(以及缓冲区)。fzf也弹得非常好和fd(查找的更快版本)
  8. 使用Ripgrepvim-ripgrep搜索您的代码库,然后您可以在结果上使用:cdo进行搜索和替换

您可以通过添加.bashrc来成为绝对的疯子和别名vimvim -p

alias vim="vim -p"

这将导致在选项卡中从shell打开多个文件,而不必在之后从vim中调用:tab ball

我建议使用插件

NERDtree

这是带有说明的github链接。

Nerdtree

我使用vim插件作为插件管理器,但您也可以使用Vundle。

vim插件

Vundle

在我和其他许多vim用户中,最好的选择是,

  • 使用打开文件,

efile_name.extension

然后只需Ctrl+6即可更改为最后一个缓冲区。或者,您可以随时按

: ls列出缓冲区,然后使用b后跟缓冲区号更改缓冲区。

  • 我们使用垂直或水平分割

: vsp垂直分割

: sp用于水平分割

然后<C-W><C-H/K/L/j>更改工作拆分。

您当然可以编辑任意数量的拆分中的任何文件。

  1. 打开2个或更多vim类型的文件:vim -p file1 file2

  2. 在该命令后,您可以使用CTRL+Shift+抛出该文件,它将更改您在vim中的文件。

  3. 如果你想添加一个文件vim并使用它::tabnew file3

  4. 你也可以使用它不会创建一个新标签,并将在屏幕上打开文件切片你的屏幕::new file3

  5. 如果你想使用一个可以帮助你处理目录的插件和文件我建议uNERDTree

  6. 要下载它,你需要有vim插件,所以要下载其他插件,也需要NERDTree在你的~/.vimrc中输入这个命令。

    let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'if empty(glob(data_dir . '/autoload/plug.vim'))silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirshttps://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'autocmd VimEnter * PlugInstall --sync | source $MYVIMRCendif
call plug#begin('~/.vim/plugged')Plug 'scrooloose/nerdtree'call plug#end()
  1. 然后通过命令:wq保存. vimrc,返回并键入::PlugInstall

之后,插件将被安装,你可以使用你的NERDTree与其他插件。