vim substitute()和expand()在新命令定义中调用

时间:2011-09-13 00:33:25

标签: vim

我正在尝试在vim中定义一个新命令,该命令使用当前文件的名称调用外部脚本,但稍作修改。这是我定义命令的方式:

:command MyNewCommand !/tmp/myscript.sh substitute(expand("%:p"), "-debug", "", 'g')

换句话说, myscript.sh 接受一个参数,该参数是正在编辑的文件的完整路径名,并删除了路径名中的字符串“-debug”。我的命令定义不起作用,因为vim似乎不是传递路径名,而是传递整个字符串本身,从“替换”一词开始,到 myscript.sh 。如何定义命令以执行我想要的操作?谢谢:)。

3 个答案:

答案 0 :(得分:3)

更改命令定义,如下所示。

:command! MyNewCommand call system('/tmp/myscript.sh ' .
\   shellescape(substitute(expand('%:p'), '-debug', '', 'g')))

要查看命令的输出,请将call替换为echo

答案 1 :(得分:2)

您可以使用类似于@ ib的解决方案,但使用!将显示shell命令的输出(并且还将处理expand('%:p')包含换行符的情况(如果FS是完全符合POSIX标准)):

command MyNewCommand execute '!/tmp/myscript.sh' shellescape(substitute(expand('%:p'), '-debug', '', 'g'))

答案 2 :(得分:0)

通用方法是构建一个字符串然后execute。您的命令中的问题是substitute(expand(...未被评估,并且它按原样传递。

所以在一个通用的例子中

command MyNewCommand OldCommand expand("%:p")

应转换为

command MyNewCommand execute 'OldCommand '.expand("%:p")

这样MyNewCommand只会使用表达式'OldCommand '.expand("%:p")调用executeexecute将评估表达式,因此expand()将被评估为文件名并连接到'OldCommand ',从而生成'OldCommand myfilename'形式的字符串。该字符串然后由Ex作为execute命令执行。