在 Vim 中运行带有布尔检查的 bash 命令

在 Vim 中运行带有布尔检查的 bash 命令

在 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>

相关内容