10

我正在尝试创建一个简单的 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 文字。我注意到我的 vim 语法高亮甚至没有将它们突出显示为变量,所以我似乎有一个基本的语法问题。

我的问题是:

  1. 正确的语法是什么?我将不胜感激解释原因而不仅仅是答案。为什么上面的不正确?
  2. 无论如何允许这被称为

    :调用 FindAndReplaceAll(test, test2)

所以我不必添加引号......

4

2 回答 2

18

你需要改变

:%s/a:from/a:to/gc

到:

exe '%s/' . a:from . '/' . a:to . '/gc'

你的陈述是按字面意思解释的。即它将在当前缓冲区中将字符串“a:from”替换为字符串“a:to”。

但是您打算将评估的字符串替换为评估的a:from字符串a:to。这可以通过内置exe[cute]函数来实现(您可以通过键入::h exe在命令行模式下获得帮助)。

至于您的第二个问题,您必须使用引号,否则它们将被视为变量。

于 2013-03-07T02:08:11.843 回答
1

命令行应该用 `execute' 调用,而不是直接文本:

 function! FindAndReplaceAll(from, to)                                           
     echo    a:from                                                                   
     execute "%s/" . a:from . "/" . a:to . "/gc"                                                            
 endfunction  
于 2013-03-07T02:07:41.993 回答