gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:20:27 24 4
gpt4 key购买 nike

考虑以下 Vim ex 命令,

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

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

我不明白为什么这个命令可以作为从所选行的第一行到最后一行的循环。即如何 g可以重复 let i+=1再三,一而再再而三。

最佳答案

全局命令的模式是:

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

全局命令首先扫描行的 [范围] 并标记发生匹配的每一行。在第二次扫描中,对每个标记的行执行 [cmd],并在其前面加上行号。如果一行被更改或删除,它的标记就会消失。 [range] 的默认值是整个文件。 (请参阅 http://vimregex.com/#global 了解更多详情)

现在我们来分析
:let i=1 | '<,'>g/^/ s/^\ *-/\=i/ | let i+=1

一步步。
  • let i=1是为循环设置基本数字所执行的单个命令。我们可以在一开始就单独执行它。然后'<,'>g/^/ s/^\ *-/\=i/ | let i+=1看起来更像是一个全局命令。
  • '<,'>g定义范围。 '<代表第一行和 '>代表所选区域的最后一行。 ( :help '< 了解更多详情)
  • ^当然匹配范围内的每一行。
  • s/^\ *-/\=i/ | let i+=1是[cmd],执行的次数等于选中区域的行数,这也是循环发生的最重要原因。
  • 之前的部分|是一个典型的替代命令 :range s[ubstitute]/pattern/string/ (有关更多详细信息,请参阅 http://vimregex.com/#substitute)
  • ^\ *-匹配 0 个或多个空格,后跟一行开头的破折号。我们代替\=i对于这种模式。 ( :help :s\= 了解更多详情)
  • s/^\ *-/\=i/ , let i+=1被执行。然后下一行, ... ,直到选定区域的最后一行。
  • 为了更好地理解 s/^\ *-/\=i/ | let i+=1是一个[cmd]整体,我们可以改变两个[sub-cmd]的顺序,得到let i+=1 | s/^\ *-/\=i/ .但为了同样的效果,let i=0一开始是必不可少的。
  • 关于vim - g 如何在 Vim ex 命令脚本中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28403622/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com