0

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

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 替换的正确方法是什么?有没有更好的方法来做我试图完成的事情?

4

3 回答 3

2

您必须替换|<bar>.

如果插入|到映射中,vim 会将后面的字符解释|为新命令。

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

实现映射的另一种方法是

nnoremap SOME_KEY :call system("java $(echo ". expand('%') ." | sed 's/\.java//')")<CR>
于 2013-07-26T14:02:55.133 回答
2

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

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

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

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

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

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

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

于 2013-07-26T14:08:43.480 回答
0

尝试:

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

Vim 已经有一种方法来剥离扩展expand("%:r")。Usingexec是基于连接字符串做某事的好方法。

于 2013-07-26T16:45:08.550 回答