通常,用c选项替代给我两个选项:(y)es或(n)o。可能有几个带编号的yes选项可供选择吗?

示例

文件

person: Alice
dog: Tobby
person: Bob


模式1 :%s/person:/woman:/c

模式2 :%s/person:/man:/c

模式1和2的搜索模式相同,但替换模式不同。我想将它们统一为一种模式,可以选择按(1)进行替换1,(2)进行替换2或按(n)进行不替换。

#1 楼

:s//c的实现是固定的;您正在寻找的是用Vimscript表达式(:help sub-replace-expr)替换。您可以通过getchar()查询一个数字,或者通过input()提示输入更长的数字:

:%s/person:/\=get(['woman', 'man'], getchar() - char2nr(1), submatch(0)) . ':'/
:%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/


您可以输入一个更大的数字(在示例中为3)以不执行替换。


如果经常需要此操作,则可以为此定义一个自定义Query()函数。您还可以在其中添加一个:redraw,以便看到已经发生的替换。

评论


该命令似乎有问题。只有添加检查命令后,它才起作用::%s / person:/ \ = get(['woman','man'],input('Your choice:')-1,submatch(0))。 ':'/C

–张磊
17年3月19日在3:15

但是添加c命令将导致我需要两个步骤来替换字符串,我认为这是不必要的。

–张磊
17年3月19日在3:17

#2 楼

感谢您对我的原始问题的所有支持!现在,我已经将:SubstituteChoices命令合并到我的PatternsOnText插件中,该命令提供了可靠的实现。问题中的示例将通过以下方式解决:

:%SubstituteChoices/person:/woman:/man:/