现在的位置: 首页 > 综合 > 正文

Vim重复命令

2019年10月31日 ⁄ 综合 ⁄ 共 2293字 ⁄ 字号 评论关闭

1. 单次重复 *single-repeat*

*.*
. 重复上次改变,有计数前缀的重复 [count] 次。
如果 'cpoptions' 包括 'y' 标志, 也可以用来重复一个抽
出 (yank) 操作。不能重复命令行命令。

简单的改变操作可以用 "." 重复。如果没有数字前缀,使用上次的改变的重复次数。如
果输入一个重复次数,就用它取代上次的计数。如果上次改变的操作使用数字编号的寄存
器,则逐次递增使用寄存器的序号。一个使用的示例可以参见 |redo-register|。注意,
如果重复的命令涉及可视的选择区域,使用相同_大小_的区域。参见 |visual-repeat|。

*@:*
@: 重复上次命令行 [count] 次。
{仅当编译时加入 |+cmdline_hist| 特性才可用}

==============================================================================
2. 多次重复 *multi-repeat*

*:g* *:global* *E147* *E148*
:[range]g[lobal]/{pattern}/[cmd]
在 [range] 界定的匹配模式 {pattern} 的文本行上执行
Ex 命令 |cmd| (缺省是 ":p")。

:[range]g[lobal]!/{pattern}/[cmd]
在 [range] 界定的_不_匹配模式 {pattern} 的文本行上执
行 Ex 命令 |cmd| (缺省是 ":p")。

*:v* *:vglobal*
:[range]v[global]/{pattern}/[cmd]
等同于 :g!。

除了用 '/' 来包围 {pattern} 以外,你可以用任何其它单字节字符,但不包括字母数
字、'\'、'"' 或 '|'。这对你想在搜索模式或者替代字符串里包含 '/' 很有用。

模式的定义见 |pattern|。

global 命令先扫描 [range] 界定的行,然后对每个匹配的行进行标记 (对于一个跨行的
匹配,则只针对开始的一行)。
第二次扫描对每个标记的行,并在其之前附加上行号,执行指定的 |cmd| 命令。 ":v"
和 ":g!" 命令针对未标记的行进行。如果一行被删除,其标记也自动消失。
缺省的 [range] 是整个缓冲区 (1,$)。用 "CTRL-C" 中断该命令。如果某行的执行给
出错误,该行的执行被中断,但 global 命令仍从下一个被标记或未被标记的行继续。

要重复一个非 Ex 的命令, 你可以使用 ":normal" 命令:
:g/pat/normal {commands}
要确保 {commands} 以完整的命令结束,不然 Vim 会等待你输入该命令余下的部分,对
每次匹配都将如此。由于屏幕此时还未更新,你恐怕会因此不知所措。参见 |:normal|。

撤销/重做命令将会针对整个 global 命令。换而言之,前次上下文标记只有在命令开头
会设一次 (用 "''" 可以回到 global 之前的光标位置)。

global 命令也设置最近使用的搜索模式和最近使用的替换模式 (后者是 vi 兼容的),以
便于全局替换一个字符串: >
:g/pat/s//PAT/g
该命令替换所有的 "pat" 为 "PAT"。同样的功能也可以用: >
:%s/pat/PAT/g
实现。这样省下了两个字符!

Ex 模式下执行 "global" 时,使用 ":visual" 命令是特例。该命令移动到匹配行,进入
普通模式并在该模式下执行命令,直到你用 |Q| 回到 Ex 模式为止。对每个匹配行重复
此操作。此时不能再用 ":global"。要中止,按 CTRL-C 两次。

==============================================================================
3. 重复组合操作 *complex-repeat*

*q* *recording*
q{0-9a-zA-Z"} 在寄存器 {0-9a-zA-Z"} 里记录键入的字符 (大写名字的寄存
器表示附加键入的内容)。'q' 命令不能在执行寄存器时使
用。同样,在映射里也不能。{Vi: 没有记录功能}

q 停止记录。(注意 实现细节: 停止记录的 'q' 不会被保存在
寄存器里,除非它是映射的结果) {Vi: 没有记录功能}

*@*
@{0-9a-z".=*} 执行寄存器 {0-9a-z".=*} 的内容 [count] 次。 注意 不能
用寄存器 '%' (当前文件名) 和 '#' (轮换文件名) 。"@="
则会提示你输入一个表达式。这个表达式的结果会被执行。参
见 |@:|。{Vi: 只有命名寄存器可用}

*@@* *E748*
@@ 执行上次执行的 @{0-9a-z":*} [count] 次。

:[addr]*{0-9a-z".=} *:@* *:star*
:[addr]@{0-9a-z".=*} 把寄存器 {0-9a-z".=*} 里的内容看成一个 Ex 命令执行。首
先,把光标放在 [addr] 行 (缺省是当前行) 上。如果
'cpoptions' 设定了 'e' 标志位而寄存器的内容最后一行没
有 <CR>,会自动加上。
注意 ":*" 命令只有在 'cpoptions' 设置 '*' 标志位时才会
识别。如果用 'nocompatible',这_并_非缺省。
":@=" 使用最近使用的表达式。表达式执行的结果被当作 Ex
命令执行。
这些命令里,不识别映射。
{Vi: 只有某些版本有此功能}
将来: 会对地址范围里每一行执行寄存器的命令。

*:@:*
:[addr]@: 先把光标放在 [addr] 行 (缺省是当前行) 上,然后重复上次
的命令行。 {Vi 无此功能}

*:@@*
:[addr]@@ 先把光标放在 [addr] 行 (缺省是当前行) 上,然后重复上次
的 :@{0-9a-z"}。 {Vi 只有某些版本有此功能}

【上篇】
【下篇】

抱歉!评论已关闭.