如何在vim中调用带有2个参数的system()

时间:2012-08-29 10:01:36

标签: system vim

function! ReName()
   let old_name = expand("<cword>")
    let new_name = input("new name: ",old_name)
    let cmd = "ref.sh ".expand(old_name).expand(" ").expand(new_name)
   :call system(cmd)
endfunction

ref.sh是一个bash文件,上下文是

#! /bin/bash
find . -name '*.[ch]' | xargs sed -i s/$1/$2/g

但现在,当我在vim中使用ReName函数时,它不起作用。

2 个答案:

答案 0 :(得分:2)

那么,你期望它做什么,错误是什么/在哪里?

首先,您忽略了对system()的调用的输出。如果有输出,请使用:echo代替:call,将其分配给变量或:return。否则,请检查v:shell_error变量以获取命令的退出状态。


更多批评:而不是

let cmd = "ref.sh ".expand(old_name).expand(" ").expand(new_name)

忽略多余的expand()

let cmd = "ref.sh ".old_name." ".new_name

或通过printf()汇总命令:

let cmd = printf("ref.sh %s %s", old_name, new_name)

您的功能仅适用于某些表现良好的参数。在Vim中使用shellescape(),在shell脚本中使用正确的引用。

答案 1 :(得分:1)

我同意 Ingo Karkat 。其他方式可以替代

:call system(cmd)

vimrc中的冒号与

不一致
exe "!" . cmd

假设您的cmd没有像空格这样的特殊字符,换句话就像那样。