如何在Vim函数中进行搜索和替换?

3
我试图编写一个函数,对一定范围内的内容进行搜索和替换。
我知道可以使用vim命令:2,5 s/某个模式/另一个内容/来执行此操作,但我不知道如何在函数定义中使用它。最初,我尝试了以下代码:
function! MyFunc() range
  a:firstline,a:lastline s/some pattern/something else/
endfunction

但是当我试图加载该函数时,出现了Missing :endfunction错误。我还尝试了使用call,因为我注意到在其他教程和示例中,有时会在这种情况下使用call。我尝试了call a:firstline,a:lastline s/some pattern/something else/a:firstline,a:lastline call s/some pattern/something else/。这样,函数就被加载了。但是当我尝试使用:2,4 call MyFunc()来调用该函数时,搜索/替换行处出现了Missing parenthesis错误。
有人能帮我解决这个问题吗?我还没有找到任何如何在函数调用中执行搜索和替换的示例。
谢谢
1个回答

11
您遇到了错误 Missing :endfunction,因为函数定义不完整。尝试使用下面给出的代码,应该可以解决问题。
function! MyFunc() range
  execute a:firstline . "," . a:lastline . 's/some pattern/something else/'
endfunction

1
缺少 :endfunction 是因为虚拟解析器记录函数体时认为 a:firstline 开始了 :append 命令,该命令会吃掉一切直到带有单个点的行。如果您添加这样的行并在其后添加另一个 endfunction,则会得到预期的错误,因为 :append 命令不能跟随 :firstline - ZyX
啊...执行...不错。就我所知,我终于找到了一个很好的教程来讲解这个 - http://learnvimscriptthehardway.stevelosh.com/chapters/28.html。感谢你帮我突破了这个难关! - metasoarous
值得注意的是,最好使用单引号...虽然...我不完全确定为什么。当我使用双引号时,\n被解释为null,这是vim文档中记录的行为,但是当使用单引号时,它被解释为换行符。 - 4Z4T4R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接