首页 文章

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

提问于
浏览
1007

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

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

:n
:prev

并查看打开的文件

:args

要添加文件,我可以说:

:n test.pl

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

那么我怎样才能将文件添加到我的args列表中并将其删除?

27 回答

  • 0

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

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

  • 101

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

    以下是我从文章中摘录的一个很好的总结:

    摘要:

    • 缓冲区是文件的内存中文本 .

    • 窗口是缓冲区上的视口 .

    • 标签页是一组窗口 .

  • 2

    上市

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

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

  • 0
    :ls
    

    用于打开缓冲区列表

    • :bp 上一个缓冲区

    • :bn 下一个缓冲区

    • :bnn 一个数字)移动到第n个缓冲区

    • :b <filename-part> 使用tab键提供自动完成功能(真棒!!)

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

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

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

    :mksession! ~/today.ses
    

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

    vim -S ~/today.ses
    

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

  • 5

    要添加到 args 列表:

    :argadd
    

    要从 args 列表中删除:

    :argdelete
    

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

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

  • 12

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

  • 33

    我想您可能正在使用错误的命令来查看已打开的文件列表 .

    尝试执行 :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寄存器,其中包含您之前删除的've deleted. This is especially useful if you want to reuse some text that you' .

  • 16

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

  • 38

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

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

    • ctrlpvim/ctrlp.vim - 按名称查找文件模糊搜索的位置或仅名称

    • jlanzarotta/bufexplorer - 浏览打开的缓冲区(当你不记得你最近打开和修改了多少文件而你不记得它们在哪里时,可能是因为你用Ag搜索了它们)

    • rking/ag.vim 搜索与gitignore相关的文件

    • scrooloose/nerdtree 查看目录结构,环视,添加/删除/修改文件

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

  • 3

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

    • :b <partial filename><tab> (跳转到缓冲区)

    • :bw (缓冲区擦除,删除缓冲区)

    • :e <file path> (编辑,打开新缓冲区>

    • pltags - 启用跳转到子程序/方法定义

  • 2

    您可能想要使用Vim global marks .

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

    更改位置时,重置标记的速度也很快: mC 标记新的代码点, mT 标记新的测试点 .

  • 5

    我为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”表示前一个;无论您使用制表符还是缓冲区,都可以获得预期的结果 .

  • 14

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

  • 22

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

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

    enter image description here

    我在mac和linux机器上以这种方式工作,我发现它比本机窗口窗格切换机制更好's provided (on Macs). I find the switching easier and only with tmux have I been able to get the '在同一当前目录' working on my mac (despite the fact that there seems to be options to open new panes in the same directory) which is a surprisingly critical piece. An instant new pane at the current location is amazingly useful. A method that does new panes with the same key combos for both OS'的新页面对我来说是至关重要的,并为将来的个人兼容性提供奖励 . 除了多个tmux窗格,我还尝试使用多个标签,例如
    enter image description here
    和多个新窗口,例如
    enter image description here
    最终我've found that multiple tmux panes to be the most useful for me. I am very '视觉'并且喜欢把我的各种情境放在我面前,连在一起作为窗格 .

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

  • 1

    如果 using only vim built-in commands ,我见过在多个缓冲区之间切换的最好的是:

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

    It perfectly combines both :ls and :b commands -- listing all opened buffers and waiting for you to input the command to switch buffer.

    在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' .

  • 1

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

    • 使用不是'tab pages'的缓冲区 . 缓冲区与几乎所有其他编辑器中的选项卡相同 .

    • 如果您希望获得相同的标签,可以在 .vimrc 中使用vim-airline插件并使用以下设置: let g:airline#extensions#tabline#enabled = 1 . 如果没有打开标签页,则会自动将所有缓冲区显示为标签页眉

    • 使用Tim Pope的vim-unimpaired,它给[b和] b分别移动到上一个/下一个缓冲区(加上一大堆其他好东西)

    • .vimrc 中有 set wildmenu 然后当您键入 :b <file part> Tab作为缓冲区时,您将获得一个可用缓冲区列表,您可以使用左/右箭头滚动浏览

    • 使用Tim Pope的vim-obsession插件来存储与航空公司很好地合作的会话(我有lots of pain with sessions and plugins

    • 使用Tim Pope的vim-vinegar插件 . 这适用于本机 :Explore ,但使其更容易使用 . 您只需键入 - 即可打开资源管理器,该资源管理器与浏览器中的目录相同 . 使导航更快(但是使用fzf我很少使用它)

    • fzf(可以作为vim插件安装)也是一个非常强大的模糊查找器,可以用来搜索文件(和缓冲区) . fzf也plays very nicely与fd(更快版本的find)

    • 使用Ripgrepvim-ripgrep搜索您的代码库,然后您可以在结果上使用 :cdo 进行搜索和替换

  • 45

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

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

    :tab sball
    

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

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

    详细信息在 :help tab-page-commands .

    我们可以通过 vim -p file1 file2 指示vim以标签视图的形式打开多个文件 . alias vim='vim -p' 会很有用 .
    通过在 ~/.vimrc 中进行以下自动命令也可以实现同样的目的

    au VimEnter * if !&diff | tab all | tabfirst | endif
    

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

    要从arg列表中删除: argd pattern

    更多 :help arglist

  • 7

    我使用命令行和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>
    

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

  • 7

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

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

  • 23

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

    “拆开窗户

    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

  • 214

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

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

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

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

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

    nmap <CR> :CtrlPBuffer<CR>
    

    当然你可以将它映射到不同的键,但我发现输入的映射非常方便 .

  • 10

    当我开始使用VIM时,我没有意识到应该使用标签用作不同的窗口布局,缓冲区用于多个文件编辑/相互切换的角色 . 实际上在开始时标签甚至没有在v7.0之前,我刚刚在终端标签中打开了一个VIM(我此刻正在使用gnome-terminal),并使用alt号在标签之间切换,因为我想使用如下命令:缓冲区,: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对它有一些问题),但我认为我可以使用缓冲区中的所有文件 .

  • 1

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

    alias vim="vim -p"

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

  • 515

    我建议使用插件

    NERDtree

    这是带指令的github链接 .

    Nerdtree

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

    vim-plug

    Vundle

  • 1087

    如果您在osx上并希望能够单击选项卡,请使用MouseTerm和SIMBL(取自here) . 另外,请查看related discussion .

  • 3

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

    • 要在最后两个文件之间切换,只需按 <leader> 两次 . 我建议将 <leader> 分配给空格键:
    nnoremap <leader><leader> <c-^>
    
    • 为了快速移动项目,答案是模糊匹配解决方案,例如CtrlP . 我将它绑定到 <leader>a 以便快速访问 .

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

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

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

    • 当没有足够的空间时,在较小的区域中打开新的分割,并在导航时展开它们 . 请参阅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
    
    • 轻松从拆分移动到拆分:
    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>
    

相关问题