Categories

在 VIM 中打开加号开头的文件

我在上一篇文章中提到 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 高手有没有更彻底的解决方案?