【问题标题】:How can I recursively use the Global in VIM?如何在 VIM 中递归使用 Global?
【发布时间】:2009-04-10 08:45:02
【问题描述】:

":g-2-g/3/" 中是否有问题,或者是否缺少全局递归?我无法理解错误的原因:

E147: 不能:全局递归

如何在 VIM 中进行递归全局搜索?

[尼尔对运营商的初步建议\| ]

g/1.*2\|2.*1/

一个缺点是组合会扩展为 n 个数字。对于三个数字,组合数为 3! (=6) 那是

g/1.*2.*3\|2.*1.*3\|3.*1.*2\|1.*3.*2\|2.*3.*1\|3.*2.*1/ 

对于 n 个数字,组合的数量是 n!。

[使用运算符\&的解决方案]

Brian Carper 和 Neil Butterworth 找到了解决方案。非常感谢他们!

g/.*1\&.*2\&.*3/

整行:

g/.*1\&.*2\&.*3\&.*/

【问题讨论】:

  • 你的例子应该做什么?
  • Neil Butterworth:我用 2 选择每一行,然后我尝试从最后结果的每一行中选择 3。
  • 不是每行包含 2 和 3 都一样吗?
  • Neil Butterworth:不。:g=12= 不会匹配像“234oeu1”和“21”这样的行。如果该功能在 VIM 中,我可以通过编写 :g=1=g/2/ 来匹配它们。它将每一行与 1 匹配,然后将每一行与最后结果中的 2 匹配。显然,它是不同的。
  • 不,尼尔说得对。他并不是说每一行都包含“23”,只是说它们在某处包含 2 和 3。这和你想要的一样。

标签: vim recursion global


【解决方案1】:

新信息:这就是你想要的——“\&”序列是“与”运算符:

g/.*1\&.*2\&.*3/

Brian Carper(参见 cmets,再次感谢)的解释:

/1\&2/ 不起作用,因为两者 分支需要同时匹配“ 位置”。/.*1\&.*2/ 让比赛 将自己锚定在线的前面 然后根据需要扩展 来查找数字

【讨论】:

  • 3个数字你会怎么做? g/1.*2.*3\|2.*1.*3\|3.*1.*2\|1.*3.*2\|2.*3.*1\|3.* 2.*1/你能看到组合的数量是n!为 n 数?递归全局搜索对于 n 个数字只有 n 个组合。对于 n,它只是:g-1-g/2/g@3@...g$n$。会很酷!
  • \& 可能是您想要的,是的。 /1\&2/ 不起作用,因为两个分支都需要“在同一位置”匹配。 /.*1\&.*2/ 让 match 将自身锚定在行的前面,然后扩展它需要找到的数字。
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2015-05-21
  • 1970-01-01
相关资源
最近更新 更多