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

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

vi main.pl maintenance.pl

然后在他们之间跳来跳去

:n
:prev

然后查看哪个文件是打开的:

:args

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

:n test.pl

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

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


当前回答

我使用以下,这给了你很多功能,你会期望在其他编辑器,如Sublime文本/ Textmate

Use buffers not 'tab pages'. Buffers are the same concept as tabs in almost all other editors. If you want the same look of having tabs you can use the vim-airline plugin with the following setting in your .vimrc: let g:airline#extensions#tabline#enabled = 1. This automatically displays all the buffers as tab headers when you have no tab pages opened Use Tim Pope's vim-unimpaired which gives [b and ]b for moving to previous/next buffers respectively (plus a whole host of other goodies) Have set wildmenu in your .vimrc then when you type :b <file part> + Tab for a buffer you will get a list of possible buffers that you can use left/right arrows to scroll through Use Tim Pope's vim-obsession plugin to store sessions that play nicely with airline (I had lots of pain with sessions and plugins) Use Tim Pope's vim-vinegar plugin. This works with the native :Explore but makes it much easier to work with. You just type - to open the explorer, which is the same key as to go up a directory in the explorer. Makes navigating faster (however with fzf I rarely use this) fzf (which can be installed as a vim plugin) is also a really powerful fuzzy finder that you can use for searching for files (and buffers too). fzf also plays very nicely with fd (a faster version of find) Use Ripgrep with vim-ripgrep to search through your code base and then you can use :cdo on the results to do search and replace

其他回答

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

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

I have it working this way on both my mac and linux machines and I find it better than the native window pane switching mechanism that's provided (on Macs). I find the switching easier and only with tmux have I been able to get the 'new page at the same current directory' 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's is critical for me and a bonus for all for future personal compatibility. Aside from multiple tmux panes, I've also tried using multiple tabs, e.g. and multiple new windows, e.g. and ultimately I've found that multiple tmux panes to be the most useful for me. I am very 'visual' and like to keep my various contexts right in front of me, connected together as panes.

Tmux还支持水平和垂直窗格,这是旧屏幕所不支持的(尽管mac的iterm2似乎支持它,但是,当前的目录设置对我来说不管用)。tmux 1.8

这里有很多答案!我不用重新发明轮子——最著名的插件(不会很快消亡,被很多人使用)是超快和极客的。

ctrlpvim / ctrlp。Vim -查找文件的名称模糊搜索的位置或只是它的名称 jlanzarotta/bufexplorer -用来浏览打开的缓冲区(当你不记得最近打开和修改了多少文件,也不记得它们在哪里时,可能是因为你用Ag搜索了它们) rk / ag)。Vim搜索关于gitignore的文件 Scrooloose /nerdtree查看目录结构,查找,添加/删除/修改文件

编辑:最近我一直在使用dyng/ctrlsf。vim搜索上下文视图(像Sublime搜索),我把引擎从ag切换到ripgrep。演出非常出色。

EDIT2:与CtrlSF一起,您可以使用mg979/vim-visual-multi,一次更改多个文件,然后在最后一次保存它们。

:ls

用于打开缓冲区的列表

:bp前一个缓冲区 :bn下一个缓冲区 :bn (n个数字)移动到第n个缓冲区 :b <filename-part> with tab-key提供自动补全功能(太棒了!!)

在某些版本的vim中,bn和bp实际上分别是bnext和bprevious。Tab自动补全在这种情况下很有用。

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

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

:mksession! ~/today.ses

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

vim -S ~/today.ses

记起昨天讲到哪里就不麻烦了。;)

清单

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

:ls

开放

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

:e ../myFile.pl

增强的TAB补全功能(将set wildmenu放在你的.vimrc中)。

注意:你也可以使用:find,它会为你搜索一组路径,但是你需要先自定义这些路径。


切换

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

:b myfile

增强选项卡完成(仍然设置野生菜单)。

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


使用windows

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。

我对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表示上一个;无论您使用的是制表符还是缓冲区,都将得到预期的结果。