在 Vim 中,每次写入文件时,我都希望重新生成项目的 ctags,但前提是.ctags
项目的根目录中存在配置文件。为了实现这一点,我尝试将以下内容添加到我的~/.vimrc
map <Leader>w :w | !test -f .ctags && ctags --options=.ctags .<CR>
然而,当我尝试运行它时,我回到了 bash,并显示以下输出:
$ vim .
shell returned 1
Press ENTER or type command to continue
&&
我怀疑这是由于中没有正确解析而导致的~/.vimrc
,但是在摆弄了相当多的语法之后,我被难住了。有什么想法吗?
答案1
Vim 看到一个映射定义(map <Leader>w :w
)和一个单独的 shell 调用(!test -f .ctags && ctags --options=.ctags .<CR>
);|
分隔符必须在映射内部进行转义;cp。:help map-bar
map <Leader>w :w<Bar>!test -f .ctags && ctags --options=.ctags .<CR>
还,你应该使用:noremap
;它使映射不受重新映射和递归的影响,并且可能将映射限制为正常模式:
nnoremap <Leader>w :w<Bar>!test -f .ctags && ctags --options=.ctags .<CR>
为了避免shell returned 1
标签数据库不存在的情况,实际上,在这种情况下跳过整个 shell 调用,最好在 Vimscript 中执行文件存在检查:
nnoremap <Leader>w :w<Bar>if filereadable('.ctags')<Bar>execute '!ctags --options=.ctags .'<Bar>endif<CR>
我们必须将:!
命令包装在执行中,这样它就不会吞下:endif
;cp。:help :bar
。
作为最后的调整,我将用 进行替换:write
,:update
如果缓冲区内容已经保留,则不会重写它:
nnoremap <Leader>w :update<Bar>if filereadable('.ctags')<Bar>execute '!ctags --options=.ctags .'<Bar>endif<CR>