如何在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替换的正确方法是什么?有没有更好的方法去做我想要完成的事情?
答案 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
是一种基于连接字符串的好方法。