Gvim中有多个可能的查找替换

时间:2017-08-06 13:54:20

标签: vim replace

我想创建一个命令或函数来组合多个查找和替换。我试过以下命令:

command MyFR %s/first/1st/g | %s/second/2nd/g | %s/third/3rd/g

它有效,但如果没有“第一次”中途停止或者'秒'找到了。错误是:

E486: Pattern not found: <pattern>

如何使此命令适用于&#39; second&#39;和第三个&#39;要被替换,即使没有第一个&#39;在文字?谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

您可以为每个替换命令添加e标记,:h :s_flags中描述了

[e]     When the search pattern fails, do not issue an error message and, in
    particular, continue in maps as if no error occurred.  This is most
    useful to prevent the "No match" error from breaking a mapping.  Vim
    does not suppress the following error messages, however:
        Regular expressions can't be delimited by letters
        \ should be followed by /, ? or &
        No previous substitute regular expression
        Trailing characters
        Interrupted

它会给:

com! MyFR %s/first/1st/ge | %s/second/2nd/ge | %s/third/3rd/ge

另一种解决方案是将所有替换合并为一个替换:

com! MyFR %s/\vfirst|second|third/\={'first': '1st', 'second': '2nd', 'third': '3rd'}[tolower(submatch(0))]/g

这一次,在替换部分中,您将使用表达式(请参阅:h s/\=),而不是使用文字字符串。这里,表达式是字典的给定值。

字典中的键是所有可能匹配的文本,值是它们的替代品。

从字典中检索的值是tolower(submatch(0)),它评估匹配的文本(请参阅:h submatch()),以小写版本标准化(所有大写字符通过{{1转换为小写字母对应) }})。