我正在尝试在vim中定义一个新命令,该命令使用当前文件的名称调用外部脚本,但稍作修改。这是我定义命令的方式:
:command MyNewCommand !/tmp/myscript.sh substitute(expand("%:p"), "-debug", "", 'g')
换句话说, myscript.sh 接受一个参数,该参数是正在编辑的文件的完整路径名,并删除了路径名中的字符串“-debug”。我的命令定义不起作用,因为vim似乎不是传递路径名,而是传递整个字符串本身,从“替换”一词开始,到 myscript.sh 。如何定义命令以执行我想要的操作?谢谢:)。
答案 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")
调用execute
。 execute
将评估表达式,因此expand()
将被评估为文件名并连接到'OldCommand '
,从而生成'OldCommand myfilename'
形式的字符串。该字符串然后由Ex
作为execute
命令执行。