如何获得替代命令的预览?


9

我经常发现自己需要执行替换操作,该替换操作将使整个大文件中的匹配稀疏并且具有非平凡的搜索和替换表达式。

例如,说我有一些函数调用,例如okFunction(arg1, arg2 arg3)。当然,每个函数调用的args都会不同。现在说我发现了一个不需要的更好的功能arg2。我可以轻松地调整整个文件

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

尽管从概念上讲很简单,但我不确定在这种较长的模式中语法是否正确。该c标志在这里确实有帮助,但是问题是当要求确认时,vim不会显示匹配项将被替换为什么。我的意思是,它将显示替换表达式,但不显示评估结果。如果我用确认替换y,vim会立即跳到下一场比赛,而且我也不会看我是否犯了任何错误。

我发现vim-over插件可以部分解决问题,但前提是您在键入命令时所有数学都在屏幕上可见。按下Enter键后,其行为与我上面描述的完全相同,并且没有得到预览。

因此,在要求对替代命令进行确认时,有没有办法使vim评估替代表达式?


2
这是vim-bug跟踪器中的收藏夹项(很抱歉,目前无法找到它)
Christian Brabandt

2
为了值得,我通常在第一行使用替换来替换不带的%,检查结果是否符合我的期望,然后使用替换%(只有几次击键:):<up><c-b>%。显然,预览选项会比这有效得多。虽然没有可用的修补程序,也许有人可以用这种选项将替换包包装到vimscript函数中,但这听起来像是很多工作……
statox

2
@ChristianBrabandt 找到了。截至目前,它仍具有未分类的优先级……
Vitor Eiji 2016年

2
@VitorEiji并不是我在想的那个。但这实际上并不重要,因为目前尚不可能。Neovim提供了“ inccommand”选项,该选项可能会起作用(或者无效,我现在不是真的)
Christian Brabandt

邪恶预示着替换;我不知道它是怎么做到的。
Geremia

Answers:


2

一种解决方法是宏。突出显示所有问题区域,然后一次替换一行。然后决定是否要。一旦完成n下一个区域。

针对您的情况:

  1. 搜索区域: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. 开始录制宏qq
  3. 应用 :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. 停止录制宏 q
  5. 撤消(u)或转到下一个搜索结果(n)。
  6. 应用宏@q
  7. 根据需要重复步骤5和6。

显然不是您要找的东西,但这通常是我要做的。


这很酷!我从来没有意识到,当您使用/它进行搜索时,它也表现为视觉选择-很好。
the_velour_fog

@the_velour_fog“ /...表现为视觉选择。” 其实不是。之所以起作用,是因为:s//在当前行上进行操作并使用n将您带入下一个事件。
Tumbler41年

1
如果您不指定模式,:s/pattern/replacement它将使用最后一个搜索字符串,因此在步骤3中,您实际上可以申请:s//betterFunction(\1, \3)/g保存一些键入内容。
海因

@ Tumbler41啊,感谢您的澄清。是的,我也执行此基本搜索技术,然后应用宏,我通常首先填充arglist并先使用:vimgrep /pattern/ ##然后应用宏,这样,如果事实证明我的模式实际上始终一致且宏内容太繁琐,那么我可以很快恢复操作:argdo %s/.../..../gc并开始执行操作
the_velour_fog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.