Vim常用命令小记(5)——删除和修改文本命令
删除文本
["x]<Del> 或 ["x]x 删除 [count] 个光标之下和之后的字符 [到寄存器 x 里]。(非行动作)
和 "dl" 相同。
<Del> 键不使用 [count] 计数。如果有计数,它删除该计数的最后一位。
["x]X 删除 [count] 个光标之前的字符 [到寄存器 x 里]。(非行动作)。
和 "dh" 相同。
["x]d{motion} 删除 {motion} 动作跨越的文本 [到寄存器 x 里]。
["x]dd 删除 [count] 行 [到寄存器 x 里]。(行动作)
["x]D 删除光标所在的字符到行尾及其后的 [count]-1 行 [到寄存器 x 里]。(非行动作)。
和 "d$" 相同。
如果 'cpoptions' 里有 '#' 标志位,忽略计数。
{Visual}["x]x 或 {Visual}["x]d 或 {Visual}["x]<Del> 删除高亮文本 [到寄存器 x 里]。
{Visual}["x]CTRL-H 或 {Visual}["x]<BS> 选择模式下,删除高亮文本 [到寄存器 x 里]。
{Visual}["x]X 或 {Visual}["x]D 删除高亮行 [到寄存器 x 里]。
在可视列块模式里,"D" 删除高亮的文本直到行尾。
:[range]d[elete] [x] 删除 [range] 范围的行 (缺省: 当前行) [到寄存器 x 里]。
:[range]d[elete] [x] {count} 从 [range] 指定的范围开始,删除 {count} 行 (缺省: 当前行) [到寄存器 x 里]。
J 连接 [count] 行,但至少包含两行。删除缩进,插入不多于两个的空格。
{Visual}J 连接高亮行,但至少包含两行。删除缩进,插入不多于两个的空格。
gJ 连接 [count] 行,但至少包含两行。不插入或删除任何空格。
{Visual}gJ 连接高亮行,但至少包含两行。不插入或删除任何空格。
[range]j[oin][!] [flags] 连接 [range] 范围的行。
和 "J" 相同,但如有 [!] 时,连接不插入或删除任何空格。
如果 [range] 包括相同的开始和结束行,该命令不做任何事。
缺省行为是连接当前行与下一行。
:[range]j[oin][!] {count} [flags] 连接 [range] 开始的 {count} 行 (缺省: 当前行)。
和 "J" 相同,但如有 [!] 时,连接不插入或删除任何空格。
删除并插入
R 进入替换模式: 每个输入的字符替代一个现有的字符,从光标所在的位置开始。
重复输入的文本 [count] - 1 次。
gR 进入虚拟替换模式: 每个输入的字符替代屏幕位置一个现有的字符。
因而,一个 <Tab> 可以一次替换若干个字符。
重复输入的文本 [count]-1 次。
["x]c{motion} 将 {motion} 跨过的文本删除 [到寄存器 x 里] 并开始插入。
如果 'cpoptions' 包括 'E' 标志位并且没有任何文本实际需要删除时报错并拒绝开始插入模式。
如果 'cpoptions' 没有 'E',"c" 命令总是启动插入模式,即使没有文本要删除也是如此。
["x]cc 删除 [count] 行 [到寄存器 x 里] 并开始插入。(行动作)
如果置位 'autoindent',保留首行的缩进。
["x]C 从当前光标位置删除到行尾,再删除 [count]-1 行 [到寄存器 x 里],并开始插入。(非行动作)
和 c$ 等价。
["x]s 删除 [count] 个字符 [到寄存器 x 里],并开始插入。(非行动作)
和 "cl" 等价。
["x]S 删除 [count] 行 [到寄存器 x 里] 并开始插入。(行动作)
和 "cc" 等价。
{Visual}["x]c or {Visual}["x]s 删除高亮文本 [到寄存器 x 里],并开始插入。
{Visual}["x]r{char} 把所有高亮的字符替换成 {char}。
{Visual}["x]C 删除高亮行 [到寄存器 x 里] 并开始插入。
在可视列块模式下有所不同。
{Visual}["x]S 删除高亮行 [到寄存器 x 里] 并开始插入。
{Visual}["x]R 现在和 {Visual}["x]S 相同。以后的版本可能会有所改变。
:{range}c[hange][!] 用另外的文本替换若干文本行。
输入只包含 "." 的行结束替换。
如果没有 {range},该命令只置换当前行。
加上 [!] 后,在本命令的执行期间切换 'autoindent'。
简单修改
r{char} 把光标下的字符换成 {char}。
如果 {char} 是 <CR> 或者 <NL>,则把该字符变成换行符。
要换成一个真正的 <CR>,使用 CTRL-V <CR>。CTRL-V <NL> 则换成 <Nul>。
当 {char} 为 <CR> 或者 <NL>,Vim 会自动缩进。
{char} 可以输入二合字母。
gr{char} 替换光标下的虚拟字符。
替换发生在屏幕位置而不是文件位置上。
~ 'notildeop' 选项: 切换光标下字符的大小写,并把光标向右移。
如果给出 [count],应用在那么多数目的字符上。
~{motion} 'tildeop' 选项: 切换 {motion} 跨越的文本的大小写。
g~{motion} 切换 {motion} 跨越的文本的大小写。
~~ 或 g~g~ 或 g~~ 切换当前行的大小写。
{Visual}~ 切换高亮文本的大小写
{Visual}U 使高亮文本成为大写
gU{motion} 使 {motion} 跨越的文本成为大写。
gUgU 或 gUU 使得当前行成为大写。
{Visual}u 使高亮文本成为小写。
gu{motion} 使 {motion} 跨越的文本成为小写。
gugu 或 guu 使得当前行成为小写。
g?{motion} 用 Rot13 对 {motion} 跨越的文本进行编码。
{Visual}g? 用 Rot13 对高亮文本进行编码。
g?g? 或 g?? 用 Rot13 对当前行进行编码。
递 增 与 递 减 ~
CTRL-A 把当前光标之上或之后的数值或者字母加上 [count]。
CTRL-X 把当前光标之上或之后的数值或者字母减去 [count]。
将 文 本 左 移 或 右 移
<{motion} 将 {motion} 跨越的行左移 'shiftwidth' 列。
<< 将 [count] 行左移 'shiftwidth' 列。
{Visual}[count]< 将高亮行左移 [count] 个 'shiftwidth' 列。
>{motion} 将 {motion} 跨越的行右移 'shiftwidth' 列。
>> 将 [count] 行右移 'shiftwidth' 列。
{Visual}[count]> 将高亮行右移 [count] 个 'shiftwidth' 列。
:[range]< 将 [range] 指定的行左移 'shiftwidth' 列。
多个 '<' 左移多个 'shiftwidth' 列。
:[range]< {count} 左移 [range] 开始的 {count} 行 'shiftwidth' 列 (缺省从当前行)。
多个 '<' 左移多个 'shiftwidth' 列。
:[range]le[ft] [indent] 左对齐 [range] 指定的行。设置缩进距离为 [indent] (缺省为 0)。
:[range]> [flags] 将 [range] 指定的行右移 'shiftwidth' 列。
多个 '>' 右移多个 'shiftwidth' 列。
:[range]> {count} [flags] 右移 [range] 开始的 {count} 行 'shiftwidth' 列 (缺省从当前行开始)。
多个 '>' 右移多个 'shiftwidth' 列。
过滤命令
!{motion}{filter} 将 {motion} 跨越的行用外部程序 {filter} 过滤。
!!{filter} 将 [count] 行用外部程序 {filter} 过滤。
{Visual}!{filter} 将高亮行用外部程序 {filter} 过滤。
:{range}![!]{filter} [!][arg] 将 {range} 指定的行用外部程序 {filter} 过滤。
Vim 把可选的感叹号替换成最后一次使用的命令,并附加上可选的参数 [arg]。
={motion} 把 {motion} 跨越的行用 'equalprg' 选项指定的外部程序过滤。
如果 'equalprg' 选项为空 (缺省),使用内部的排版机制。
如果 'indentexpr' 非空,则使用之。
== 和 ={motion} 类似,过滤 [count] 行。
{Visual}= 和 ={motion} 类似,过滤高亮行。
替代
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count] 对 [range] 指定的行把 {pattern} 的匹配替代成 {string}。
{string} 可以是按字面意义的,也可以包含特殊字符。
如果不指定 [range] 和 [count],仅在当前行进行替代。
如果指定 [count],在 [range] 最后一行开始的 [count] 行进行替代。
如果不指定 [range] ,则从当前行开始。
如果 {pattern} 为空,该命令使用上次的 substitute 或者 ":global" 命令用过的模式。
如果 {string} 省略,替代命令假定它为空。这样就把匹配文本删除了。这时,{pattern} 之后的分隔符也可省略。
:[range]s[ubstitute] [flags] [count] 或 :[range]&[&][flags] [count] 使用最后一次 :substitute 相同的模式和替代字符串,但不包括相同的标志位。
:[range]~[&][flags] [count] 使用最后一次 :substitute 相同的替代字符串,但使用最近使用的搜索模式作为匹配模式。类似于 ":&r"。
& 等价于 ":s" (重复上次的 substitute)。
这里不记住标志位,所以实际工作方式可能不尽相同。
你可以用 ":&&" 来保持相同的标志位。
g& 等价于 ":%s//~/&" (在所有行上重复上次的 substitute,并使用相同的标志位)。
:[range]sno[magic] ... 和 ":substitute" 相同,但总使用 'nomagic'。
:[range]sm[agic] ... 和 ":substitute" 相同,但总使用 'magic'。
搜索与替代
:promptf[ind] [string] 弹出搜索对话框。如果给出 [string],它被用作初始的搜索字符串。
:promptr[epl] [string] 弹出搜索/替代对话框。如果给出 [string],它被用作初始的搜索字符串。
改变制表
:[range]ret[ab][!] [new_tabstop] 把所有包含 <Tab> 的空白序列替代成由新的制表位 [new_tabstop] 确定的空白序列。
如果你不指定新的制表位,或者它为 0,Vim 使用原来的制表位 'tabstop'。
已有的 Tab 的宽度总是用 'tabstop' 的当前值来计算。
如果有 !,在合适的时候,把只包含正常空格的字符串换成 Tab。
如果置位了 'expandtab',Vim 把所有的 Tab 换成相当的空格。
该命令把 'tabstop' 设为新值。
复制并移动文本
"{a-zA-Z0-9.%#:-"} 指定下次的删除、抽出和放置命令使用的寄存器 {a-zA-Z0-9.%#:-"}。
大写字符使得删除和抽出命令附加到该寄存器。
{.%#:} 只能用于放置命令。
:reg[isters] 显示编号和命名寄存器的内容。但不列出用于目的地的寄存器。
:reg[isters] {arg} 显示 {arg} 里提到的编号和命名寄存器的内容。
:di[splay] [arg] 和 :registers 相同。
["x]y{motion} 抽出 {motion} 跨越的文本 [到寄存器 x]。
如果没有字符被抽出并且 'cpoptions' 里包括 'E' 标志位,这是一个错误。
["x]yy 抽出 [count] 行 [到寄存器 x]。(行动作)
["x]Y 抽出 [count] 行 [到寄存器 x],等同于 yy。(行动作)
{Visual}["x]y 抽出高亮文本 [到寄存器 x]
{Visual}["x]Y 抽出高亮行 [到寄存器 x]
:[range]y[ank] [x] 抽出 [range] 所指定的行 [到寄存器 x]。
:[range]y[ank] [x] {count} 从 [range] 的最后一行开始 (缺省: 当前行) 抽出 {count} 行 [到寄存器 x]。
["x]p 放置文本 [从寄存器 x] 在光标之后 [count] 次。
["x]P 置文本 [从寄存器 x] 在光标之前 [count] 次。
["x]<MiddleMouse> 从一个寄存器放置文本在光标之前 [count] 次。
除非另外指定,否则用 "* 寄存器。
光标停留在新文本的尾部。
只有在 'mouse' 包含 'n' 或者 'a' 时鼠标才会工作。
["x]gp 如同 "p",但光标停留在新文本之后。
["x]gP 如同 "P",但光标停留在新文本之后。
:[line]pu[t] [x] 放置文本 [从寄存器 x] 在行号 [line] (缺省为当前行) 之后。(总是行动作)
这个命令可以用来把抽出的块放置在新行上。
光标停留在新行末行的第一个非空白处。
寄存器也可以是 '=',跟随一个可选的表达式。表达式继续到该命令结束为止。
:[line]pu[t]! [x] 放置文本 [从寄存器 x] 在行号 [line] (缺省为当前行) 之前。
["x]]p 或 ["x]]<MiddleMouse> 类似 "p",但调整当前行的缩进。
只有在 'mouse' 包含 'n' 或者 'a' 时鼠标才会工作。
["x][P 或 ["x]]P 或 ["x][p 或 ["x][<MiddleMouse> 类似 "P",但调整当前行的缩进。
只有在 'mouse' 包含 'n' 或者 'a' 时鼠标才会工作。
:[range]co[py] {address} 把 [range] 指定的行复制到 {address} 给出的行之下。
:t 和 :copy 等价。
:[range]m[ove] {address} 把 [range] 指定的行移动到 {address} 给出的行之下
xp 交换两个字符
ddp 交换两行
deep 换两个单词 (光标在第一个单词之前的空白上)
文本排版
:[range]ce[nter] [width] 在 [range] 指定范围的行和 [width] 限定的列范围内的文本居中对齐。
列宽缺省为 'textwidth',如其为 0,则取 80。
:[range]ri[ght] [width] 在 [range] 指定范围的行和 [width] 限定的列范围内的文本靠右对齐。
列宽缺省为 'textwidth',如其为 0,则取 80。
:[range]le[ft] [indent] 在 [range] 指定范围的行的文本靠左对齐。其缩进的距离可由 [indent] 设置 (缺省为 0)。
gq{motion} 对 {motion} 动作跨越的行进行排版。
排版使用如下三种方式之一:
- 如果 'formatexpr' 不为空,计算该表达式。每个缓冲区的值可以不同。
- 如果 'formatprg' 不为空,使用外部程序。否则,使用内部排版机制。
- 使用 'textwidth' 选项控制所有待排版行的行宽。
如果 'textwidth' 选项为 0,则排版行宽设为屏幕的宽度(但最大宽度不超过 79)。
'formatoptions' 选项控制排版的方式。光标停留在排版行末行的第一个非空白处。
gqgq 或 gqq 排版当前行。如带计数排版相应多行。{Vi 无此功能}
{Visual}gq 排版高亮文本。
gw{motion} 对 {motion} 动作跨越的行进行排版。
和 "gq" 类似,但排版后光标恢复原位。而且不使用 'formatprg' 和 'formatexpr' 选项。
gwgw 或 gww 对当前行排版,其它和 "gw" 类同。
{Visual}gw 排版高亮文本,其它和 "gw" 类同。
文本排序
:[range]sor[t][!] [i][u][r][n][x][o] [/{pattern}/]
给 [range] 里的行排序。如果没有给出行范围,给所有行排序。
[!]:反向排序。
[i]:忽略大小写。
[n]:排序基于每行的第一个十进制数(在 {pattern} 匹配之后或之内)。数值包含前导的 '-'。
[x]:排序基于每行的第一个十六进制数 (在 {pattern}匹配之后或之内)。忽略引导的 "0x" 或 "0X"。数值包含前导的 '-'。
[o]:排序基于每行的第一个八进制数 (在 {pattern} 匹配之后或之内)。
[u]:只保留完全相同的行的第一行 (如果带 [i],忽略大小写的区别)。没有这个标志位,完全相同的行的序列会按照它们原来的顺序被保留下来。
引导和拖尾的空白差异会导致不相同的行。
如果指定 /{pattern}/ 并且没有 [r] 标志位,跳过匹配 {pattern} 的文本,使得排序在匹配之后的内容上进行。 除了斜杠以外,任何非字母的字符都可以。
如果 {pattern} 为空 (例如指定 //),则使用最近使用的搜索模式。这样你可以先试好模式,然后在执行。
相关概念
过滤程序:
接受文本作为标准输入,作某些修改,并把结果放到标准输出的程序。
substitute 命令使用的标志位:
[&] 必须是首个使用的标志位: 保留和上次 substitute 相同的标志位。例如: >
[c] 确认每个替代。Vim 高亮匹配的字符串。
你可以输入: *:s_c*
'y' 来替代这次匹配
'l' 来替代这次匹配并退出
'n' 来跳过这次匹配
<Esc> 来退出替代过程
'a' 来替代这次和以后所有的匹配
'q' 来退出替代过程
CTRL-E 来上卷屏幕
CTRL-Y 来下卷屏幕
如果 'edcompatible' 选项打开,Vim 记住 [c] 标志位并在每次使用它时切换是否确认,但在给出一个新的匹配模式时复位。
[e] 如果模式搜索不成功,不给出错误信息。因为没产生错误,映射的过程得以继续。
主要用来防止在映射执行过程的无匹配 ("No match") 错误中断映射。
Vim 不会抑制以下的错误信息:
- Regular expressions can't be delimited by letters (正规表达式不能以字母分隔)
- \ should be followed by /, ? or & (\ 必须后面跟 /、? 或者 &)
- No previous substitute regular expression (没有上次的替代正规表达式)
- Trailing characters (结尾有多余的字符)
- Interrupted (中断)
[g] 对行内所有的匹配进行替代。
如果没有这个参数,替代只对每行的第一个匹配进行。
如果 'edcompatible' 选项打开,Vim 记住这个标志并在你每次使用该标志时切换,但在给出一个新的匹配模式时复位。
如果 'gdefault' 选项打开,这个标志缺省打开,而 [g] 参数关闭之。
[i] 忽略模式的大小写。不使用 'ignorecase' 和 'smartcase' 选项。
[I] 不忽略模式的大小写。不使用 'ignorecase' 和 'smartcase' 选项。
[n] 报告匹配的次数,并不实际进行替代。
忽略 [c] 标志位。匹配报告的发生就像 'report' 总是为零那样。
[p] 显示包含最后一次替代的行。
[#] 类似 [p],且在前面加上行号。
[l] 类似 [p],但显示的方式类似于。
[r] 仅对于不带参数的 ":&" 和 ":s" 有用。
":&r" 和 ":~" 工作的方式相同: 如果匹配模式为空,使用上一次使用的搜索模式,而不是上一次的 substitute 或者 ":global" 所使用的模式。
如果最近一次使用搜索的命令就是 substitute 或者 ":global",那就没有区别了。
如果最近的命令的是 "/" 那样的搜索命令,使用那个命令的搜索模式。
共有九种类型的寄存器:
无名寄存器 ""
用 "d"、"c"、"s"、"x" 等命令删除或者用 "y" 等抽出命令复制的文本都被 Vim 用来填充该寄存器,不管是否用到别的专门寄存器。
使用大写寄存器进行添加时,无名寄存器包含和命名寄存器相同的文本。'_' 寄存器是一个特例。
不指定寄存器的放置命令 (p 或 P) 使用无名寄存器的内容。可以用 '"' 作为名字来访问该寄存器。意味着要输入两个连续的双引号。
写入 "" 寄存器将实际写到寄存器 "0 上。
编号寄存器 "0 到 "9
Vim 把抽出和删除命令的文本保存在这些寄存器里。
编号寄存器 0 包含最近抽出的文本,除非该命令用 ["x] 指定了别的寄存器。
编号寄存器 1 包含了最近删除或者修改的文本,除非该命令用 ["x] 指定了别的寄存器或者该文本小于一行 (该情况下使用行内删除寄存器)。
以下移动命令在应用删除操作符时例外: "%"、"("、 ")"、"`"、"/"、"?"、"n"、"N"、"{" 和 "}"。这时,总是使用寄存器 "1 。
如果文本小于一行,同时使用 "- 寄存器。
每来一次新的删除和修改,Vim 把前一次的寄存器 1 的内容复制到寄存器 2,2 到 3,依此类推。而寄存器 9 的内容就丢失了。
行内删除寄存器 "-
该寄存器保存删除不到一行内容的命令的文本,除非该命令用 ["x] 指定了寄存器。
命名寄存器 "a 到 "z 或者 "A 到 "Z
Vim 只有在你指定的时候才使用这些寄存器。
指定为小写字母时替换原来的内容,指定为大写字母时附加到原来的内容。
如果 'cpoptions' 里有 '>' 标志位,在附加文本前插入一个换行符。
只读寄存器 ":、".、"% 和 "#
它们是 '%'、'#'、':' 和 '.'。你只能在 "p"、"P"、":put" 命令和 CTRL-R 的时候使用它们。
". 包含最近插入的文本 (和插入模式命令 CTRL-A 和 CTRL-@ 插入的一样)。
它不适用于 CTRL-R 在命令行上的操作。它的工作方式稍有不同。
"% 包含当前文件名。
"# 包含轮换文件名。
": 包含最近执行过的命令行。
只有当一个命令行中至少一个字符是键入的,该寄存器才会保存命令行的内容。
如果命令行完全来自映射,该寄存器保持不变。
表达式寄存器 "=
其实并没有这么一个寄存器可以储存文本,但是这是用来在使用寄存器的命令中使用表达式的一个方式。
表达式寄存器是只读的,你不能把文本放置其中。在 '=' 之后,光标移到命令行上,这时你可以输入任何的表达式。
所有普通的命令行编辑命令都可以使用,还有一个表达式专门的历史表。
按回车结束命令行时,Vim 计算表达式的结果。
如果用 <Esc> 结束,Vim 终止表达式。
如果不输入表达式,Vim 使用最近的表达式 (和 "/" 命令的处理相似)。
表达式的计算结果必须是一个字符串。数值结果会自动转化为字符串。对 "p" 和 ":put" 命令而言,浮点数结果也会被转化为字符串。
如果结果为列表,每个成员被转成字符串,然后被单独放在一行上。
字典、函数引用类型的结果则产生错误信息。
如果 "= 寄存器被 "p" 命令使用,该字符串会在 <NL> 字符处断开。如果该字符串以 <NL> 结尾,则它被视为一个面向行的寄存器。
选择和拖放寄存器 "*、"+ 和 "~
这些寄存器用来保存和取得 GUI 界面选择的文本。
如果剪贴板不存在或者不工作,使用无名寄存器。
只读的 "~ 寄存器保存最近一次拖放操作放下的文本。
如果有什么东西被放到 Vim 上,"~ 寄存器被填充,
缺省的动作 (适用于所有模式) 是把 "~ 寄存器的内容插入到当前光标位置。
"~ 寄存器仅用于在 Vim 上拖放普通文本。拖放 URI 列表在内部处理。
黑洞寄存器寄存器 "_
当写到这个寄存器时,什么都不会发生。
这可以用来删除文本,而不影响任何正常的寄存器。
从该寄存器读时,什么都不会返回。
最近搜索模式寄存器 "/
含有最近搜索的模式。它被 "n" 和 'hlsearch' 使用。
可以用 ":let" 来修改。可以改变它使得 'hlsearch' 不经过实际的搜索直接高亮某些匹配。
不能把抽出或者删除命令的内容放到该寄存器上。

浙公网安备 33010602011771号