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

时间:2008-09-10 09:03:50

标签: vim vi

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

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

:n
:prev

并查看哪个文件已打开

:args

要添加文件,我可以说:

:n test.pl

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

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

29 个答案:

答案 0 :(得分:1117)

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

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

答案 1 :(得分:530)

清单

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

: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。

答案 2 :(得分:220)

:ls

用于打开缓冲区列表

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

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

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

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

:mksession! ~/today.ses

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

加载该会话
vim -S ~/today.ses

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

答案 3 :(得分:105)

添加到args列表:

:argadd

要从args列表中删除:

:argdelete

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

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

答案 4 :(得分:45)

我使用缓冲区命令 - :bn(下一个缓冲区),:bp(前一个缓冲区):buffers(列表打开缓冲区):b<n>(打开缓冲区n){{1 (删除缓冲区)。 :bd只会打开一个新的缓冲区。

答案 5 :(得分:38)

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

尝试执行: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寄存器。如果您想重复使用之前删除的某些文本,这将非常有用。

答案 6 :(得分:34)

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

答案 7 :(得分:24)

这里有很多答案!我使用的是在不重新发明轮子的情况下 - 最着名的插件(不会很快就会死掉并被许多人使用)是超快速和令人讨厌的。

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

更新:最近我使用 dyng / ctrlsf.vim 搜索上下文视图(如Sublime搜索),我从 ag切换引擎 ripgrep 。表现非常出色。

答案 8 :(得分:23)

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

答案 9 :(得分:17)

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

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

答案 10 :(得分:17)

此线程中的一些答案建议使用制表符,其他人建议使用缓冲区来完成同样的事情。标签和缓冲区是不同的。我强烈建议你阅读这篇文章Vim Tab madness - Buffers vs Tabs

这是我从文章中得出的一个很好的总结:

总结:

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

答案 11 :(得分:14)

您可能想要使用Vim global marks

通过这种方式,您可以快速在文件之间跳转,甚至可以跳转到文件中的标记位置。此外,关键命令很简短:    'C带我到我正在使用的代码,    'T带我参加我正在进行的单元测试。

更改地点时,也可以快速重置标记:    mC标记新代码点,    mT标志着新的测试点。

答案 12 :(得分:12)

我为GVim和命令行vim使用相同的.vimrc文件。我倾向于在命令行vim中使用GVim中的选项卡和缓冲区,所以我设置了我的.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”表示前一个;无论您使用制表符还是缓冲区,都可以获得预期的结果。

答案 13 :(得分:10)

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

答案 14 :(得分:10)

添加另一个答案,因为任何答案都没有涵盖

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

 :tab sball

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

gt or :tabn           "    go to next tab
gT 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

无论如何回答这个问题: 要添加到arg列表:arga file

从arg列表中删除:argd pattern

更多:help arglist

答案 15 :(得分:7)

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

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

enter image description here

我在mac和linux机器上以这种方式工作,我发现它比提供的本机窗格切换机制(在Mac上)更好。我发现切换更容易,只有使用tmux我能够在我的mac上运行“在同一个当前目录下的新页面”(尽管事实上似乎有在同一目录中打开新窗格的选项),这是一个令人惊讶的关键作品。当前位置的即时新窗格非常有用。为两个操作系统执行具有相同组合键的新窗格的方法对我来说是至关重要的,并且对于将来的个人兼容性而言是一个奖励。 除了多个tmux窗格,我还尝试使用多个标签,例如enter image description here和多个新窗口,例如enter image description here最终我发现多个tmux窗格对我来说最有用。我非常“视觉化”,喜欢把我的各种情境放在我面前,连在一起作为窗格。

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

答案 16 :(得分:7)

如果仅使用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 more
  1  h    "script.py"    line 1
  2 #h  + "file1.txt"    line 6  -- '#' for alternative buffer
  3 %a    "README.md"    line 17 -- '%' for current buffer
  4       "file3.txt"    line 0  -- line 0 for hasn't switched to
  5     + "/etc/passwd"  line 42 -- '+' for modified
:b '<Cursor> here'

在上面的快照中:

  • 第二栏:%a代表当前,h代表隐藏,#代表之前,空代表尚未切换为。
  • 第三栏:+已修改。

另外,我强烈建议set hidden。请参阅:help 'hidden'

答案 17 :(得分:6)

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

  1. 使用缓冲区不是&#39;标签页&#39;。缓冲区与几乎所有其他编辑器中的选项卡概念相同。
  2. 如果您希望获得相同的标签,可以使用.vimrc插件let g:airline#extensions#tabline#enabled = 1set wildmenu中的vim-airline插件。如果没有打开标签页,则会自动将所有缓冲区显示为标签页眉
  3. 使用Tim Pope的vim-unimpaired,它提供 [ b ] b 分别移动到上一个/下一个缓冲区(加上一大堆其他好东西)
  4. .vimrc中有:b <file part>,然后当您为缓冲区键入:Explore + Tab 时,您将获得可以使用的可能缓冲区列表/右箭头滚动浏览
  5. 使用Tim Pope的vim-obsession插件存储与航空公司合作的会话(我有lots of pain with sessions and plugins
  6. 使用Tim Pope的vim-vinegar插件。这适用于原生-,但使其更容易使用。您只需键入:cdo即可打开资源管理器,该资源管理器与浏览器中的目录相同。使导航速度更快(但是使用fzf我很少使用它)
  7. fzf(可以作为vim插件安装)也是一个非常强大的模糊查找器,可用于搜索文件(以及缓冲区)。 fzf plays very nicely还有fd(更快的发现版本)
  8. 使用Ripgrepvim-ripgrep一起搜索您的代码库,然后您可以对结果使用.rotateWindow { position: absolute; text-align: center; margin: 0 auto; width: 150px; height: 150px; left:50%; top:50%; transform: translate(-50%, -50%); line-height: 32px; border: solid 7px; border-top: #f8f8ff; border-radius: 50%; font-family: 'Lobster', cursive; color: #f8f8ff; font-size: 18px; z-index: -1; -webkit-animation-name: spin; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: ease-in-out; -webkit-animation-duration: 6s; } @-webkit-keyframes spin { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); } } } 进行搜索和替换

答案 18 :(得分:4)

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

  • 使用打开文件

:e file_name.extension

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

:ls列出缓冲区,然后使用b后面加上缓冲区编号来更改缓冲区。

  • 我们使用
  • 进行垂直或水平拆分

:vsp用于垂直分割

:sp用于水平分割

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

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

答案 19 :(得分:3)

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

迷你缓冲区资源管理器脚本也很好,可以获得缓冲区的精简列表。然后:b1:b2 ...转到相应的缓冲区或使用迷你缓冲区资源管理器和缓冲区中的标签。

答案 20 :(得分:3)

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

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

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

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

要在标签之间跳转,我使用这些映射:

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

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

答案 21 :(得分:2)

尝试按照地图方便编辑多个文件

“拆分窗口

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

答案 22 :(得分:2)

我制作了一个显示我使用的工作流程的very simple video。基本上我使用Ctrl-P Vim插件,并将缓冲区导航映射到Enter键。

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

我在视频中没有打开很多文件,但是当你开始使用它们时它会变得非常有用。

由于插件使用MRU排序对缓冲区进行排序,您只需按两次Enter键即可跳转到您正在编辑的最新文件。

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

nmap <CR> :CtrlPBuffer<CR>

当然你可以将它映射到另一个键,但我发现要输入的映射非常方便。

答案 23 :(得分:1)

当我开始使用VIM时,我没有意识到标签应该用作不同的窗口布局,而缓冲区则用于多个文件编辑/相互切换的角色。实际上在开始时标签甚至没有在v7.0之前,我刚刚在终端标签中打开了一个VIM(我此刻正在使用gnome-terminal),并使用alt +数字在标签之间切换,因为我想使用像:buffers,:bn和:bp对我来说太过分了。当VIM 7.0发布时,我发现管理大量文件并切换到它更容易,但最近我才意识到缓冲区应该始终是要走的路,除非有一点:你需要配置它来制作它运作正常。

所以我尝试了vim-airline并启用了可视的顶部标签式缓冲条,但是图形显示我的iTerm2有问题,所以我尝试了其他几个,看起来MBE对我来说效果最好。我还将shift + h / l设置为快捷键,因为原始的(移动到当前页面的头部/尾部)对我来说不是很有用。

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

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

答案 24 :(得分:1)

您可以成为绝对狂人并将vim别名vim -p添加到.bashrc

alias vim="vim -p"

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

答案 25 :(得分:1)

我建议使用插件

  

NERDtree

这是带有说明的github链接。

Nerdtree

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

vim-plug

Vundle

答案 26 :(得分:0)

这个帖子中的大部分答案都是使用普通的vim命令,这当然很好,但我想我会提供一个广泛的答案,使用我觉得特别有用的插件和函数的组合(至少其中一些提示来自Gary Bernhardt's file navigation tips):

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

    nnoremap <leader><leader> <c-^>
    
  2. 为了快速移动项目,答案是模糊匹配解决方案,例如CtrlP。我将其绑定到<leader>a以便快速访问。

  3. 如果我想看到当前打开的缓冲区的可视化表示,我使用the BufExplorer plugin。简单但有效。

  4. 如果我想浏览文件系统,我会使用命令行或外部实用工具(Quicklsilver,Afred等),但查看当前项目结构NERD Tree是经典的。不要使用2作为主要文件查找方法。它会让你失望。我使用绑定<leader>ff

  5. 这些应足以查找和打开文件。从那里当然使用水平和垂直分割。关于拆分,我发现这些功能特别有用:

    1. 当空间不足时,在较小的区域打开新的分割,并在导航时展开它们。请参阅here以获取有关这些内容的评论:

      set winwidth=84
      set winheight=5
      set winminheight=5
      set winheight=999
      
      nnoremap <C-w>v :111vs<CR>
      nnoremap <C-w>s :rightbelow split<CR>
      set splitright
      
    2. 轻松从拆分移动到分割:

      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>
      

答案 27 :(得分:0)

如果你在osx上并希望能够点击你的标签,请使用MouseTerm和SIMBL(取自here)。另外,请查看此related discussion

答案 28 :(得分:0)

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

  2. 在执行该命令后,您可以使用 CTRL+Shift+ ,它会改变你在 vim 中的文件。

  3. 如果您想再添加一个文件 vim 并对其进行处理,请使用::tabnew file3

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

  5. 如果你想使用一个插件来帮助你处理目录 和文件我建议你NERDTree

  6. 要下载它,您需要有 vim-plug,以便下载其他插件以及 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-dirs 
      https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
      autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
    endif

    call plug#begin('~/.vim/plugged')
    Plug 'scrooloose/nerdtree'
    call plug#end()
  1. 然后通过命令 :wq 保存 .vimrc,返回并输入::PlugInstall

之后将安装插件,您可以将 NERDTree 与其他插件一起使用。