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' 不经过实际的搜索直接高亮某些匹配。
    不能把抽出或者删除命令的内容放到该寄存器上。

posted @ 2012-07-03 08:20  小兔有点乖  阅读(1463)  评论(0)    收藏  举报