最近比较眼馋sublime里ctrl+p组合按键快速查找文件的功能。vim里虽然有nerdtree插件能够看到树形目录结构,但是定位文件还是比较难的,经常需要去树上一个个点鼠标或是键盘。所以发现了这个插件:
看名字大概就知道是模仿sublime的啦。简单地尝试了一下,功能还挺强大的,基本上按照github页面里的设置也就可以用起来了。看样子还有很多其他功能,不过我目前只用得到ctrl+p。这里就有一个问题了:当我按ctrl+p,搜索并打开自己想要的文件后,点击回车后,由于nerdtree插件和ctrlp插件是两个独立的插件,因此nerdtree的目录树并没有变化。
我想如果能在搜索并打开想要的文件后,nerdtree也能跟着展开这个文件的路径就完美了。看了看文档,似乎ctrl+p插件本身没有这个功能。幸运的是,在nerdtree的文档中,找到了一个命令:NERDTreeFind,可以将文件树展开到当前文件的位置,而正巧ctrlp插件又可以修改打开文件的函数。
闲话休叙,只贴代码。
function! MyOpenFile(action, line) call call('ctrlp#acceptfile', [a:action, a:line]) NERDTreeFind call feedkeys("\<C-w>p") endfunction let g:ctrlp_open_func = { \ 'files' : 'MyOpenFile' \ }
上面function!定义了一个名叫MyOpenFile的函数,!的作用是让这个函数能够被安全地重载,不加也无所谓。
这个函数首先调用ctrlp自身的打开文件命令,并将两个参数原样传递过去;
而后执行了了NERDTreeFind命令(效果和在vim的n模式下敲入冒号,敲入NERDTreeFind并回车是一样的);
由于NERDTreeFind命令执行后,当前窗口会变成nerd的窗口而不是文件窗口,这样对编辑文件来说显得有些麻烦,因此我们还有必要将当前窗口切换回文件窗口。所以我们调用了feedkeys模拟按键输入。注意要写成"\<C-w>p",引号引起一个字符串,左尖括号左边要加斜杠转义,而右尖括号是不需要的!它模拟了这样一个按键行为:先按下ctrl+w,再按p。它的效果是切换到前一个标签页。这样,nerdtree展开当前文件树以后,就会切回文件窗口,就可以继续编辑了。
虽然两个插件自身都不具备这个功能,不过由于它们各自设计了扩展性,所以稍加改动就可以协同工作了。可喜可和可喜可贺。