VIM功能参数传递

标签 vim

我试图创建一个简单的vim脚本函数,但遇到了麻烦。此函数需要采用两个输入字符串,然后运行搜索并替换它们的所有实例。我现在有以下几点:

  function! FindAndReplaceAll(from, to)                                           
     echo a:from                                                                   
     :%s/a:from/a:to/gc                                                            
  endfunction   

当我做:
:call FindAndReplaceAll("test", "test2")

回显a:from可以正常工作,但:%s ...却作用于from和to文字。我注意到我的vim语法高亮甚至没有突出显示它们作为变量,因此我似乎有一个基本的语法问题。

我的问题是:
  • 正确的语法是什么?我会很乐于解释原因,而不只是答案。为什么上述不正确?
  • 无论如何,它被称为

    :call FindAndReplaceAll(test,test2)

  • 因此,我不必添加引号...

    最佳答案

    你需要改变
    :%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获得帮助)。

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

    关于VIM功能参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15261708/

    相关文章:

    vim - 分割 View 和调整文件大小时无法切换到文件

    vim - 打开拆分时,vim如何在路径中查找或搜索文件?

    javascript - ctags, jsctags/doctorjs, Tagbar 一步一步

    vim - 忽略 VIM 插件的错误和警告

    vim - 在 gVim 上使用 Alt-Space 组合键

    perl - 为什么 vim 折叠中第一个哈希标记消失了?

    vim - 使用 jk 移动键在 vim 自动完成框中滚动

    vim - 如何从在腻子中运行的tmux复制到Windows剪贴板

    vim - 如何 append 到剪贴板

    windows - 在 VIM 中保存整个文件