我在上一篇文章中提到 Matlab 以加号开头的目录来表示一个 package ,但是文件名开头的加号对于 VIM 来说有特殊的意义,每次打开 +foo/bar.m
这样的文件的时候都要用 ./+foo/bar.m
这样的方式,非常麻烦。
虽然 VIM 那个脚本语言甚至比 Matlab 的脚本语言还要丑陋许多,但是至少也是号称扩展性超强的编辑器,我觉得这样的任务至少应该能自动化一下。Google 了一下,很快就找到了一个类似的帖子:vim: Modifying filename in bufreadpre? ,似乎和我这里遇到的问题如出一辙,问问题的人是想要用 :
来代替 $TMPDIR
,每次打开 :/foo
的时候能自动变成 $TMPDIR/foo
。
根据后面人的回帖,我仿制了一段代码,如下:
autocmd BufNewFile,BufReadPre +* \ exe 'file ' . substitute(expand('%'), '^', './', '') | edit |
然而经过试用发现并不能工作,似乎是 VIM 在进入 BufReadPre
这一步的时候已经处理过文件名了,也就是说已经将加号当做它自己认为的特殊意义来理解过了,因此不会有那个以加号开头的文件名,这里的 autocmd
也不会被触发了。所以似乎要解决这个问题得更早下手。
不过最后我也找到了一个 workaround ,因为我平时打开文件基本上都是用 FuzzyFinder.vim 的,而 FuzzyFinder 在打开文件之前会调用它自己的一个 EscapeFilename
函数,我只要在里面把加号也加入到 escape
列表中:
function! s:EscapeFilename(fn) return escape(a:fn, " \t\n*?[{`$%#'\"|!<+") endfunction |
这样至少在用 FuzzyFinder 打开文件的时候就没有这样麻烦的困扰了。不知道各位 VIM 高手有没有更彻底的解决方案?