我正在尝试创建一个简单的vim脚本函数,但我遇到了麻烦。此函数需要获取两个输入字符串并运行搜索并替换它们的所有实例。我现在有以下内容:
function! FindAndReplaceAll(from, to)
echo a:from
:%s/a:from/a:to/gc
endfunction
当我这样做时:
:call FindAndReplaceAll("test", "test2")
echo a:from正常工作但是:%s ...代替了from和to literals。我注意到我的vim语法高亮度甚至没有突出显示那些变量,所以我似乎有一个基本的语法问题。
我的问题是:
无论如何要将其称为
:调用FindAndReplaceAll(test,test2)
所以我不必添加引号......
答案 0 :(得分:14)
您需要更改
:%s/a:from/a:to/gc
为:
exe '%s/' . a:from . '/' . a:to . '/gc'
您的陈述被解释为字面。即它将在当前缓冲区中用字符串“a:to”替换字符串“a:from”。
但您打算将a:from
评估的字符串替换为a:to
评估的字符串。这可以通过内置的exe[cute]
函数来实现(您可以通过在命令行模式下键入::h exe
来获得帮助。)
至于你的第二个问题,你必须使用引号,否则它们将被视为变量。
答案 1 :(得分:1)
应该使用`execute'调用命令行,而不是直接文本:
function! FindAndReplaceAll(from, to)
echo a:from
execute "%s/" . a:from . "/" . a:to . "/gc"
endfunction