如何在Vim中有效地处理多个文件?
我已经开始使用Vim开发Perl脚本,并开始发现它非常强大。
我喜欢的一件事就是能够使用例如vi main.pl maintenance.pl
一次打开多个文件,然后在它们之间跳转:
:n :prev
并查看哪个文件是打开的
:args
而要添加一个文件,我可以这样说:
:n test.pl
我期望将被添加到我的文件列表中,而是它抹去了我目前的文件列表,当我input:args
我只有test.pl
打开。
那么我怎样才能添加和删除文件到我的参数列表?
为什么不使用标签(在Vim 7中引入)? 您可以在tab之间切换:tabn
和:tabp
,使用:tabe <filepath>
可以添加一个新的tab; 并与一个常规:q
或:wq
你closures一个选项卡。 如果您将:tabn
和:tabp
到您的F7 / F8键,则可以轻松地在文件之间切换。
如果没有那么多文件,或者你没有Vim 7,你也可以将你的屏幕分割成多个文件:sp <filepath>
。 然后,您可以在按住Ctrl + W的分屏之间切换,然后按您想要移动的方向(或者不是方向键, w为下一个, W为之前的分屏)
清单
要查看当前缓冲区的列表,我使用:
:ls
开盘
要打开一个新文件,我使用
:e ../myFile.pl
增强了选项卡的完成(将set wildmenu
放入.vimrc
)。
注意:您也可以使用:find
哪一个会为您search一组path,但是您需要先定制这些path。
交换
要在所有打开的文件之间切换,我使用
:b myfile
与增强标签完成(仍然set wildmenu
)。
注意: :b#
select上次访问的文件,所以你可以用它来快速切换两个文件。
使用Windows
Ctrl-W s
和Ctrl-W v
水平和垂直分割当前窗口。 你也可以使用:split
和:vertical split
( :sp
和:vs
)
Ctrl-W w
在打开的窗口之间切换,而Ctrl-W h
(或者j
或k
或l
)在打开的窗口中导航。
Ctrl-W c
closures当前窗口, Ctrl-W o
closures除当前窗口以外的所有窗口。
用-o
或-O
标志启动vim会打开每个文件在自己的分割中。
所有这些我都不需要Vim中的标签,我的手指find了我的缓冲区,而不是我的眼睛。
注意:如果你想让所有的文件都进入Vim的同一个实例,用--remote-silent
选项启动Vim。
:ls
打开缓冲区列表
-
:bp
前一个缓冲区 -
:bn
下一个缓冲区 -
:bn
(n
是数字)移到第n个缓冲区 -
:b <filename-part>
与提供自动完成(真棒!!)的制表键
在某些版本的vim中, bn
和bp
实际上分别是bnext
和bprevious
。 标签自动完成在这种情况下是有帮助的。
或者当您处于正常模式时,使用^
切换到您正在处理的最后一个文件。
另外,你可以保存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
或者你可以通过input数字来分割你的屏幕,但使用sb而不是b。
另外,%表示当前可见的文件,#表示备用文件。
您可以通过按Ctrl Shift 6轻松切换这两个文件
编辑:如:ls
你可以使用:reg
来查看你的寄存器的当前内容,包括包含你已经删除的内容的0-9寄存器。 如果要重新使用以前删除的某些文本,这特别有用。
Vim(但不是原来的Vi!)有我find的选项卡(在许多情况下)优于缓冲区。 你可以说:tabe [filename]
在一个新的选项卡中打开一个文件。 选项卡之间的循环是通过单击选项卡或键组合[ n ] gt
和gT
。 graphicsVim甚至有graphics标签。
像: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/*
这里有很多答案! 我使用的时候没有重新发明轮子 – 最着名的插件(不会很快死亡,被许多人使用)是超快速和令人讨厌的。
- ctrlpvim / ctrlp.vim – 按名称查找文件模糊search的位置或只是其名称
- jlanzarotta / bufexplorer – 浏览打开的缓冲区(当你不记得最近打开和修改了多less个文件,你不记得它们在哪里,可能是因为你用Agsearch了它们)
- rking / ag.vim来search关于gitignore的文件
- scrooloose / nerdtree查看目录结构,查看,添加/删除/修改文件
更新 :最近我使用dyng / ctrlsf.vimsearch与上下文视图(如Sublimesearch),我把引擎从ag切换到ripgrep 。 performance突出。
当在vim中使用多个文件时,我主要使用这些命令(打开大约350个文件):
-
:b <partial filename><tab>
(跳转到缓冲区) -
:bw
(缓冲区擦除,删除缓冲区) -
:e <file path>
(编辑,打开一个新的缓冲区> -
pltags
– 启用跳转到子程序/方法定义
在这个线程中的一些答案build议使用制表符和其他build议使用缓冲区来完成相同的事情。 选项卡和缓冲区是不同的。 我强烈build议你阅读这篇文章Vim Tab疯狂 – 缓冲区与制表符
下面是我从文章中获得的一个很好的总结:
概要:
- 缓冲区是文件的内存中的文本。
- 窗口是缓冲区上的视口。
- 一个标签页是一个窗口的集合。
您可能想要使用Vim全局标记 。
这样,您可以快速在文件之间跳动,甚至可以在文件中标记的位置之间跳动。 另外,关键命令也很简短: 'C
把我带到我正在使用的代码中, 'T
带我到我正在使用的unit testing。
当你改变位置时,重置标记也很快: mC
标记新的代码点, mT
标记新的testing点。
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” 无论您是使用制表符还是缓冲区,您都将获得预期的结果。
如果你要使用多个缓冲区,我认为最重要的是设置隐藏,这样即使你在离开的时候没有保存更改,它也可以让你切换缓冲区。
我有效地使用多个文件的方法是使用tmux。
它允许您垂直和水平地拆分窗口,如下所示:
我已经在我的Mac和Linux机器上以这种方式工作,我发现它比在Mac上提供的本机窗口切换机制更好。 我发现切换更容易,只有使用tmux我已经能够在我的mac上得到“在同一当前目录下的新页面”(尽pipe在同一目录中似乎有选项可以打开新的窗格),这是一个惊人的关键一块。 当前位置的即时新窗格非常有用。 一个方法,使用相同的键组合对于两个操作系统的新窗格对我来说是至关重要的,并为所有未来的个人兼容性的奖金。 除了多个tmux窗格,我还尝试使用多个选项卡,例如 和多个新窗口,例如 最终我发现多个tmux窗格对我来说是最有用的。 我非常“视觉化”,喜欢把我的各种背景放在我面前,作为窗格连接在一起。
tmux还支持旧screen
没有的水平和垂直窗格(尽pipemac的iterm2似乎支持它,但是同样,当前的目录设置对我来说不起作用)。 tmux 1.8
如果只使用vim内置的命令 ,我所见过的在多个缓冲区中切换的最好的命令是:
nnoremap <Leader>f :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>
它完美地结合了:ls
和:b
命令 – 列出所有打开的缓冲区并等待您input命令切换缓冲区。
在vimrc中给出上面的映射,一旦你input<Leader>f
,
- 显示所有打开的缓冲区
- 您可以:
- 键入
23
到缓冲区23, - 键入
#
去替代/ MRU缓冲区, - 键入文件的部分名称,然后键入
<Tab>
或<Ci>
自动完成, - 或只是
<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
,前一个,空的for,尚未切换到。 - 第三列:
+
进行修改。
另外,我强烈build议set hidden
。 看:help 'hidden'
。
我使用隐藏在我的~/.vimrc
文件中的多个缓冲区。
迷你缓冲区浏览器脚本也很好,以获得一个漂亮的紧凑的缓冲区列表。 然后:b1
或:b2
…转到相应的缓冲区,或通过缓冲区使用迷你缓冲区资源pipe理器和选项卡。
为了方便编辑多个文件,请尝试下图
“拆窗户
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 <Cj> <Cw>j
nmap <Ck> <Cw>k
nmap <Cl> <Cw>l
nmap <Ch> <Cw>h
我使用命令行和git了很多,所以我在我的bashrc中有这个别名:
alias gvim="gvim --servername \$(git rev-parse --show-toplevel || echo 'default') --remote-tab"
这将在现有窗口的新选项卡中打开每个新文件,并为每个git存储库创build一个窗口。 所以如果你从repo A打开两个文件,从repo B打开两个文件,你将会得到两个窗口,一个用于repo A,两个用tab,一个用repo B用三个tab。
如果你打开的文件没有包含在一个git仓库中,它将会进入一个默认窗口。
要跳转标签我使用这些映射:
nmap <Cp> :tabprevious<CR> nmap <Cn> :tabnext<CR>
要一次打开多个文件,您应该将其与其他解决scheme之一结合使用。
我使用以下内容,这给了你很多的function,你希望在其他编辑,如崇高的文本/文本
- 使用缓冲区而不是“标签页”。 在几乎所有其他编辑器中,缓冲区和标签是一样的。
- 如果你想要有相同的标签,你可以在你的
.vimrc
使用vim-airline插件和下面的设置:let g:airline#extensions#tabline#enabled = 1
。 当您没有打开标签页时,这会自动将所有缓冲区显示为标签标题 - 使用Tim Pope的vim-unimpaired可以让[ b和] b分别移动到上一个/下一个缓冲区(加上其他一些好东西)
- 在你的
.vimrc
set wildmenu
,然后当你键入:b <file part>
+一个缓冲区的Tab ,你将得到一个可能的缓冲区列表,你可以使用左/右箭头滚动 - 使用蒂姆·波普的vim-obsession插件存储与航空公司很好玩的会话(我有很多会话和插件的痛苦 )
- 使用蒂姆·波普的vim-vinegar插件。 这与原生
:Explore
但更容易处理。 您只需键入-
打开资源pipe理器,这与在资源pipe理器中的目录相同。 使导航速度更快(但fzf我很less使用这个) - fzf (可以作为一个vim插件安装)也是一个非常强大的模糊查找器,你可以用它来search文件(也是缓冲区)。 fzf也可以很好地与fd(find的更快的版本)
- 使用Ripgrep和vim-ripgrep来search你的代码库,然后你可以在结果中使用
:cdo
做search和replace
我做了一个非常简单的video,展示了我使用的工作stream程。 基本上我使用Ctrl-P Vim插件,并将缓冲区导航映射到Enter键。
通过这种方式,我可以在普通模式下按Enter,查看打开的文件列表(显示在屏幕底部的一个小的新窗口中),select我要编辑的文件,然后再次按Enter键。 要快速search多个打开的文件,只需input文件名的一部分,select该文件,然后按Enter键。
我没有在video中打开很多文件,但是当你开始有很多文件的时候,它会变得非常有帮助。
由于插件使用MRUsorting对缓冲区进行sorting,因此只需按两次Enter键并跳转到正在编辑的最新文件。
安装插件后,您需要的唯一configuration是:
nmap <CR> :CtrlPBuffer<CR>
当然,你可以把它映射到一个不同的键,但我觉得映射进入非常方便。
如果你在OSX上,并希望能够点击你的标签,使用MouseTerm和SIMBL(取自这里 )。 另外,看看这个相关的讨论 。
当我开始使用VIM时,我没有意识到制表符应该被用作不同的窗口布局,缓冲区起到了多个文件之间编辑/切换的作用。 其实在开始标签是甚至没有V7.0之前,我刚刚打开一个terminal选项卡(我当时使用GNOMEterminal)一个VIM,并切换标签之间使用ALT +数字,因为我认为使用命令:缓冲区,:bn和:bp对我来说太多了。 当VIM 7.0发布时,我发现pipe理大量文件并切换到它更容易,但是最近我才意识到缓冲区应该总是一路走下去,除非有一件事:您需要configuration它以使其正常工作。
所以我尝试了vim-airline,并启用了可视化顶部选项卡式缓冲区,但graphics与我的iTerm2有问题,所以我尝试了其他几个,似乎MBE对我来说最适合。 我还设置了shift + h / l作为快捷键,因为原来的(移动到当前页面的头部/尾部)对我来说并不是很有用。
map <Sh> :bprev<Return>
map <Sl> :bnext<Return>
它似乎比gt和gT更容易,而且:e比tabnew更容易。 我发现:bd不像以下那样方便:q尽pipe(MBE有一些问题,但是我可以用缓冲区中的所有文件来生活。
添加另一个答案,因为这不包括在任何答案
将所有缓冲区更改为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
更多at :help arglist
在这个线程中的大部分答案都使用简单的vim命令,这当然是好的,但我想我会提供一个广泛的答案使用插件和function的组合,我觉得特别有用(至less有一些这些技巧来自加里·伯恩哈特的文件导航提示 ):
-
要切换最后两个文件,只需按
<leader>
两次。 我build议将<leader>
分配给空格键:nnoremap <leader><leader> <c-^>
-
为了快速移动项目,答案是CtrlP等模糊匹配解决scheme。 我将它绑定到
<leader>a
以便快速访问。 -
在这种情况下,我想看到当前打开的缓冲区的可视化表示,我使用了BufExplorer插件 。 简单而有效。
-
如果我想浏览文件系统,我会使用命令行或外部工具(Quicklsilver,Afred等),但是看看当前的项目结构NERD树是一个经典的。 尽pipe在
2
的地方不要使用这个作为你主要的文件查找方法。 它会真的放慢你的速度。 我使用绑定<leader>ff
。
这些应该足以查找和打开文件。 从那里当然使用水平和垂直分割。 关于分裂,我觉得这些function特别有用:
-
在没有足够空间的情况下,在较小的区域内打开新的分割区域,并在导航区域中展开。 请在这里提供关于这些操作的意见:
set winwidth=84 set winheight=5 set winminheight=5 set winheight=999 nnoremap <Cw>v :111vs<CR> nnoremap <Cw>s :rightbelow split<CR> set splitright
-
从拆分轻松拆分:
nnoremap <CJ> <CW><CJ> nnoremap <CK> <CW><CK> nnoremap <CL> <CW><CL> nnoremap <CH> <CW><CH>
你可以成为一个绝对的疯子和别名vim
vim -p
通过在你的.bashrc
join:
alias vim="vim -p"
这将导致从标签中的shell中打开多个文件,而不必从vim之后调用:tab ball
。