vimscript中的bash替换

时间:2013-07-26 13:50:32

标签: bash vim substitution

如何在vimscript中的映射命令中使用bash替换?

Vim与&&运算符配合良好,但它不喜欢bash $(command)运算符和反引号运算符。

在我的.vimrc中,我有一个简化的行:

nnoremap SOME_KEY :!java $(echo % | sed 's/\.java//') <CR>

如果我当前的文件为java Test,我希望在按SOME_KEY时运行Test.java命令。

相反,它会导致以下错误E492: Not an editor command: sed 's/\.java//')

在按下vim中的键时执行的命令中使用bash替换的正确方法是什么?有没有更好的方法去做我想要完成的事情?

3 个答案:

答案 0 :(得分:2)

您必须将|替换为<bar>

如果将|插入映射vim,则将|之后的字符解释为新命令。

因此,在你的情况下,vim正确地抱怨sed 's/\.java//'不是编辑命令。

实现映射的另一种方法是

nnoremap SOME_KEY :call system("java $(echo ". expand('%') ." | sed 's/\.java//')")<CR>

答案 1 :(得分:2)

Vim将|解释为vim中的命令分隔符而不是bash中的管道。

要解决此问题,您可以使用|转义\|或使用<bar>

然而,实际上没有理由在bash中执行此命令。这与viml中的以下内容相同。

nnoremap SOME_KEY :!java shellescape(expand('%:r'))<CR>

%:r是没有扩展名的当前文件名。

这个还具有转义文件名的额外好处,以防名称包含空格或其他一些奇怪的字符。

相关帮助页面:h filename-modifiers:h :bar:h shellescape():h expand()

答案 2 :(得分:0)

尝试:

nnoremap SOME_KEY :exec '!java ' . expand("%:r")<CR>

Vim已经有了剥离扩展程序expand("%:r")的方法。使用exec是一种基于连接字符串的好方法。