g 如何在 Vim ex 命令脚本中循环

2023-12-28

考虑以下 Vim ex 命令,

:let i=1 | '<,'>g/^/ s/^\ *-/\=i/ | let i+=1

它用选定行中的有序编号替换标题破折号。

我不明白为什么这个命令作为从所选行的第一行到最后一行的循环工作。就是那样g可以重复let i+=1一遍又一遍地。


全局命令的模式是:

:range g[lobal][!]/pattern/cmd

全局命令的工作原理是首先扫描行的[范围]并标记发生匹配的每一行。在第二次扫描中,对每个标记的行执行 [cmd],并在其前面添加行号。如果更改或删除一行,其标记就会消失。 [范围]的默认值是整个文件。 (看http://vimregex.com/#global http://vimregex.com/#global更多细节)

现在我们来分析一下

:let i=1 | '<,'>g/^/ s/^\ *-/\=i/ | let i+=1

一步步。

  1. let i=1是执行的单个命令,设置循环的基本数量。我们可以一开始就单独执行。然后'<,'>g/^/ s/^\ *-/\=i/ | let i+=1看起来更像是一个全局命令。
  2. '<,'>g定义范围。'<代表第一行和'>代表所选区域的最后一行。 (:help '<更多细节)
  3. ^当然匹配范围内的每一行。
  4. s/^\ *-/\=i/ | let i+=1是[cmd],它执行的次数等于所选区域的行数,这就是循环发生的最重要原因。
  5. 之前的部分|是一个典型的替代命令:range s[ubstitute]/pattern/string/ (see http://vimregex.com/#substitute http://vimregex.com/#substitute更多细节)
  6. ^\ *-匹配行首的 0 个或多个空格,后跟破折号。我们替代\=i对于这种模式。 (:help :s\=更多细节)
  7. After s/^\ *-/\=i/, let i+=1被执行。然后下一行,...,直到所选区域的最后一行。
  8. 为了更好地理解s/^\ *-/\=i/ | let i+=1是一个[cmd]整体,我们可以改变两个[sub-cmd]的顺序,得到let i+=1 | s/^\ *-/\=i/。但为了同样的效果,let i=0一开始就至关重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

g 如何在 Vim ex 命令脚本中循环 的相关文章

随机推荐