Vim常用命令小记(1)——操作符命令和动作命令
操作符命令
c 修改。
d 剪切。
y 复制。
~ 变换大小写。
g~ 变换大小写。
gu 变为小写。
gU 变为大写。
> 右移。
< 左移。
左右动作
h 或 <Left> 或 Ctrl-h 或 <BS> 向左 [count] 个字符。(开动作)
l 或 <Right> 或 <Space> 向右 [count] 个字符。(开动作)
0 或 <Home> 到行的第一个字符。(开动作)
^ 到行的第一个非空白字符。(开动作)
$ 或 <End> 到行尾,如果有 [count] ,则先向下移动 [count-1] 行。(闭动作)
可视模式下,光标移动到紧贴该行最后一个字符之后的位置。
如果置位了'virtualedit',"$"可从行尾之后的空白后退到行尾。
g_ 向下 [count-1] 行并到该行的最后一个非空白字符。(闭动作)
g0 或 g<Home> 'wrap':到屏幕行的第一个字符。(开动作)
'nowrap':到该行屏幕显示范围的最左边的字符。
g^ 'wrap':到屏幕行的第一个非空白字符。(开动作)
'nowrap':到该行屏幕显示范围的最左边的非空白字符。
gm 和"g0"类似,但尽可能的向右移动到屏幕的中间位置。
g$ 或 g<End> 'wrap':往下[count-1]屏幕行并到该屏幕行的行尾。(闭动作)
'nowrap':到该行屏幕显示范围的最右面的字符。垂直移动保持所在的列,而不是移到行尾。
f{char} 到右侧第 [count] 次出现的字符 {char} 。光标放在 {char} 上。(闭动作)
F{char} 到左侧第 [count] 次出现的字符 {char} 。光标放在 {char} 上。(开动作)
t{char} 到右侧第 [count] 次出现的字符 {char} 之前。光标放在 {char} 左边的位置。(闭动作)
T{char} 到左侧第 [count] 次出现的字符 {char} 之后。光标放在 {char} 右侧的位置。(开动作)
; 重复上次的 f、t、F 或者 T 命令 [count] 次。
, 反方向重复上次的 f、t、F 或者 T 命令 [count] 次。
上下动作
k 或 <Up> 或 Ctrl-p 向上[count]行。(行动作)
j 或 <Down> 或 Ctrl-j 或 <Ctrl-n> 向下[count]行。(行动作)
gk 或 g<Up> 向上[count]屏幕行。(开动作)
gj 或 g<Down> 向下[count]屏幕行。(开动作)
- 向上[count]行,停在第一个非空白字符止。(行动作)
+ 或 Ctrl-m 或 <CR> 向下[count]行,停在第一个非空白字符上。(行动作)
_ 向下[count-1]行,停在第一个非空白字符上。(行动作)
G 到第[count]行,缺省是最后一行。(行动作)
'startofline':停在第一个非空白字符上。
'nostartofline':保持在相同的列上。
<C-End> 到第[count]行,缺省是最后一行并停在最后一个字符上。(闭动作)
<C-Home> 或 gg 到第[count]行,缺省是第一行。(行动作)
'startofline':停在第一个非空白字符上。'nostartofline':保持在相同的列上。
:[range] 把光标移到[range]的最后一行。
[range]是“,”分隔的范围,也可以是单独一个行号或标记。此命令不修改跳转列表。
{count}% 到文件的{count}百分比处。(行动作)
计算方法:({count} * 总行数 + 99) / 100
'startofline':停在第一个非空白字符上。'nostartofline':保持在相同的列上。
:[range]go[to] [count] 或 [count]go 到缓冲区的第 {count} 个字节。缺省的 [count] 是 1,即文件开始处。
如果给定 [range],则最后一个数字用作偏移量。
单词动作
w 或 <S-Right> 正向 [count] 个单词。(开动作)
W 或 <C-Right> 正向 [count] 个字串。(开动作)
e 正向到第 [count] 个单词的尾部。不停留在空行上。(闭动作)
E 正向到第 [count] 个字串的尾部。不停留在空行上。(闭动作)
b 或 <S-Left> 反向 [count] 个单词。(开动作)
B 或 <C-Left> 反向 [count] 个字串。(开动作)
ge 反向到第 [count] 个单词的尾部。不停留在空行上。(闭动作)
gE 反向到第 [count] 个字串的尾部。不停留在空行上。(闭动作)
文本对象动作
( 反向 [count] 个句子。(开动作)
) 正向 [count] 个句子。(开动作)
{ 反向 [count] 个段落。(开动作)
} 正向 [count] 个段落。(开动作)
]] 正向 [count] 个小节或到出现在首列的 '{'。如果带操作符,则同时停留在首列的 '}' 的下方。(开动作)
][ 正向 [count] 个小节或到出现在首列的 '}'。(开动作)
[[ 反向 [count] 个小节或到出现在首列的 '{'。(开动作)
[] 反向 [count] 个小节或到出现在首列的 '}'。(开动作)
文本对象选择
文本对象选择命令只能在可视模式或操作符后使用。以 "a" 开头的命令,代表选择一个包含空白的对象;以 "i" 开头的命令,代表选择内含对象,即不包含空白的对象。空白本身也是内含对象。
aw 选择 [count] 个单词。在可视面向行模式下,"aw" 切换到可视面向字符模式。
iw 选择 [count] 个单词。在可视面向行模式下,"iw" 切换到可视面向字符模式。
aW 选择 [count] 个字串。在可视面向行模式下,"aW" 切换到可视面向字符模式。
iW 选择 [count] 个字串。在可视面向行模式下,"iW" 切换到可视面向字符模式。
as 选择 [count] 个句子。可视模式下切换为面向字符模式。
is 选择 [count] 个句子。可视模式下切换为面向字符模式。
ap 选择 [count] 个段落。特例:空白行 (只包含空白的行) 也被视为段落边界。可视模式下切换为面向行模式。
ip 选择 [count] 个段落。特例: 空白行 (只包含空白的行) 也被视为段落边界。可视模式下切换为面向行模式。
a] 或 a[ 选择 [count] 层 '[' ']' 块。可视模式下它切换为面向字符模式。
先反向查找第 [count] 个未匹配的 '[',然后查找其相应的 ']',包括 '[' 和 ']'。
i] 或 i[ 选择 [count] 层 '[' ']' 块。可视模式下它切换为面向字符模式。
先反向查找第 [count] 个未匹配的 '[',然后查找其相应的 ']',不包括 '[' 和 ']'。
a) 或 a( 或ab 选择 [count] 层块。可视模式下它切换为面向字符模式。
从 "[count] [(" 到其相应的 ')',包括 '(' 和 ')'。它并不包括括号之外的空白。
i) 或 i( 或 ib 选择 [count] 层块,可视模式下它切换为面向字符模式。
从 "[count] [(" 到其相应的 ')',但不包括 '(' 和 ')'。
a> 或 a< 选择 [count] 层 <> 块。可视模式下它切换为面向字符模式。
从反向第 [count] 个未匹配的 '<' 到其匹配的 '>',包括 '<' 和 '>'。
i> 或 i< 选择 [count] 层 <> 块。可视模式下它切换为面向字符模式。
从反向第 [count] 个未匹配的 '<' 到其匹配的 '>',但不包括 '<' 和 '>'。
at 选择 [count] 层标签块。可视模式下它切换为面向字符模式。
从反向第 [count] 个未匹配的 "<aaa>" 到其匹配的 "</aaa>",包括 "<aaa>" 和 "</aaa>"。
it 选择 [count] 层标签块。可视模式下它切换为面向字符模式。
从反向第 [count] 个未匹配的 "<aaa>" 到其匹配的 "</aaa>",但不包括 "<aaa>" 和 "</aaa>"。
a} 或 a{ 或 aB 选择 [count] 层大块。可视模式下它切换为面向字符模式。
从 "[count] [{" 到其相应的 '}',包括 '{' 和 '}'。
i} 或 i{ 或 iB 选择 [count] 层大块。可视模式下它切换为面向字符模式。
从 "[count] [{" 到其相应的 '}',但不包括 '{' 和 '}'。
a" 或 a' 或 a` 选择上一个引号开始到下一个引号结束的文本。可视模式下它切换为面向字符模式。
'quoteescape' 选项用于跳过转义的引号。只在同一行内有效。
如果开始时光标在引号上,Vim 会从该行行首开始搜索,以决定哪个引号对构成字符串。
包含任何拖尾的空白,如果没有拖尾的,也包含开头的空白。
在可视模式下重复此对象会包含另一个字符串。目前不使用计数。
i" 或 i' 或 i` 类似于 a"、a' 和 a`,但不包括引号,而重复也不会扩展可视选择区。
特例: 计数为 2 时包含引号,但不包括 a"/a'/a` 包含的额外的空白。
位置标记
跳转到一个位置标记有两种方法:
1. 用 ` (反引号): 光标放在指定的位置。(开动作)
2. 用 ' (单引号): 光标放在指定位置所在行的第一个非空字符上(行动作)
m{a-zA-Z} 把位置标记 {a-zA-Z} 设在当前光标位置(不移动光标,这不是动作命令)。
m' 或 m` 设置前次上下文标记。以后可以用 "''" 或者 "``" 跳转到这个位置(不移动光标,这不是动作命令)。
m[ 或 m] 设置 '[ 或者 '] 标记。可以用在执行多个命令的操作符的定义中。(不移动光标,这不是动作命令)。
:[range]ma[rk] {a-zA-Z'} 把位置标记 {a-zA-Z'} 设在 [range] 的最后一行,第 0 列。缺省的 [range] 是当前行。
:[range]k{a-zA-Z'} 和 ":mark" 相同, 但是标记名之前的空格可以省略。
'{a-z} 或 `{a-z} 跳转到当前缓冲区的位置标记 {a-z}。
'{A-Z0-9} 或 `{A-Z0-9} 跳转到设置位置标记 {A-Z0-9} 的文件所在的标记位置(如果切换到另外一个文件,这就不是动作命令)
g'{mark} 或 g`{mark} 跳转到指定的位置标记 {mark},但在当前缓冲区内跳转时,不改变跳转表。
:marks 列出所有的位置标记 (这不是动作命令),但不包括 '(,'),'{ 和 '} 标记。第一列的编号为零。
:marks {arg} 列出所有 {arg} 中所包含的位置标记,标记之间无须任何分隔符,如有则忽略(这不是动作命令)。
:delm[arks] {marks} 删除指定的位置标记。可以删除的位置标记也包括 A-Z 或 0-9。不能删除 ' 位置标记。
指定的方式包括给出位置标记名的列表和使用连字符分隔的范围。忽略空格。
:delm[arks]! 删除当前缓冲区所有的位置标记,不包括 A-Z 或 0-9 位置标记。
'[ 或 `[ 到上次修改、复制或者粘贴的文本的第一个字符。
'] 或 `] 到上次修改、复制或者粘贴的文本的最后一个字符。
'< 或 `< 到上次当前缓冲区选择的可视区域首行或第一个字符。
对于列块模式而言,可能也是第一行的最后一个字符 (为了能定义列块)。
'> 或 `> 到上次当前缓冲区选择的可视区域末行或最后一个字符。
对于列块模式而言,可能也是末行的第一个字符 (为了能定义列块)。
这里适用 'selection',该位置可能是刚刚在可视区域之后的位置。
'' 或 `` 到上次跳转的位置,或者上次 "m'" 或者 "m`" 命令给出的位置。
如果使用了 ":keepjumps" 命令修饰符,这个前次上下文标记不会被改变。
'" 或 `" 到上次离开本缓冲区时的光标位置。缺省是第一行的第一个字符。
每个缓冲区,只有一个记住的位置。只要这个缓冲区在某一个窗口可见,这个标记是不会改变的。
'^ 或 `^ 到上次插入模式关闭的光标位置。"gi" 命令用到这个标记。
如果使用了 ":keepjumps" 命令修饰符,这个标记不会改变。
'. 或 `. 到上次改变的位置。这个位置位于或者接近于改变开始的地方。
有些命令引起几个改变,那么这个位置应该是接近于这个命令最后改变的地方。
'( 或 `( 到当前句子的开始处,就像 ( 命令。
') 或 `) 到当前句子的结尾处,就像 ) 命令。
'{ 或 `{ 到当前段落的开始处,就像 { 命令。
'} 或 `} 到当前段落的结尾处,就像 } 命令。
]' [count] 次到当前行之后下一个包含小写位置标记的行的第一个非空白字符。
]` [count] 次下一个小写位置标记。
[' [count] 次到当前行之前上一个包含小写位置标记的行的第一个非空白字符。
[` [count] 次上一个小写位置标记。
:loc[kmarks] {command} 执行命令 {command},并且不调整位置标记。这可以用于不影响行的数目的文本改变。
如果行数发生变化,那么改变之后的标记将仍然保持它们的行号,从而实际上移到了别的行上。
以下各项对于插入/删除行不会被调整:
- 小写位置标记 'a - 'z
- 大写位置标记 'A - 'Z
- 数字位置标记 '0 - '9
- 上次插入位置 '^
- 上次改变位置 '.
- 可视选择区域 '< 和 '>
- 已设定的标号 sign 的行号
- quickfix 位置的行号
- 跳转表 jumplist 里的位置
- 标签堆栈 tagstack 里的位置
以下各项则总会被调整:
- 前次上下文标记 ''
- 光标位置
- 窗口或者缓冲区的视图
- 折叠 folding
- 差异视图 diff
:kee[pmarks] {command} 目前,这只对过滤命令 :range! 有效:
- 如果过滤后的行数不少于过滤之前,那么所有的过滤行中的标记保持行号不变。
- 如果行数减少,那么消失了的行中的标记就被删除掉。
在任何情况下,过滤文本之后的标记需要调整行号,以保持和文本同步。
如果 'cpoptions' 中没有 'R' 标志,那么直接执行过滤命令和使用 ":keepmarks" 的效果一样。
:keepj[umps] {command} 在 {command} 的移动不改变 '' '. '^ 标记和跳转表 jumplist,也不改变表 changelist。
这对于自动改变或者插入文本而不需要用户跳转到那个位置有用。
必须在每个命令里使用。如果在命令里调用了函数,则该函数里的命令仍然可能改变跳转表。
跳转
CTRL-O 转到跳转表里第 [count] 个较旧的光标位置
<Tab> 或 CTRL-I 转到跳转表里第 [count] 个较新的光标位置。
在一个出错窗口里,该命令带你到光标所在的错误所指的位置。
:ju[mps] 查看跳转表。
g; 转到改变表里第 [count] 个较旧的位置。
如果 [count] 比所有的较旧的改变位置都多,回到最老的那个。
如果没有较旧的改变,给出一个错误消息。
g, 转到改变表里第 [count] 个较新的位置。
和 "g;" 类似,但朝向相反的方向。
:changes 查看改变表。
其它动作
% 找到本行的光标所在或其后的下一个项目,并跳转到它的匹配。(闭动作)
项目可以是:
- ([{}]) 小括号或者 (花/方) 括号。(这可以用 'matchpairs' 选项改变)
- /* */ C-风格的注释的开始或结尾
- #if、#ifdef、#else、#elif、#endif C 预处理条件宏 (光标在 # 上,或者其后没有 "("、"["、"{" 的时候)。
要匹配其它的项目可以用 matchit 插件。此插件也可用于跳过注释中的匹配。
在 'cpoptions' 包含 "M" 时,忽略反斜杠。否则,那么括号之前反斜杠数目的奇偶性相同才能匹配。
如果 'cpoptions' 里没有 '%' 字符,忽略单双引号里的括号,除非一行里的括号数目不对称,而且该行和前一行不以反斜杠结尾。
对注释中的匹配并无特殊处理。可以用 matchit 插件或者用引号括起匹配。
这里不能用计数,{count}% 跳转到文件里百分之 {count} 的那行。
在 #if/#else/#endif 上用 % 使该动作面向行。
[( 反向第 [count] 个的未匹配的 '('。(开动作)
[{ 反向第 [count] 个的未匹配的 '{'。(开动作)
]) 正向第 [count] 个的未匹配的 ')'。(开动作)
]} 正向第 [count] 个的未匹配的 '}'。(开动作)
]m 正向第 [count] 个方法 (method) 的开始处 (适用于 Java 或类似结构的语言)。(开动作)
如果不在某个方法开始处之前,则跳转到类的开始或结束处。如果光标之后已无 '{',会有一个错误。
]M 正向第 [count] 个方法的结束处 (适用于 Java 或类似结构的语言)。(开动作)
如果不在某个方法开始处之前,则跳转到类的开始或结束处。如果光标之后已无 '}',会有一个错误。
[m 反向第 [count] 个方法的开始处 (适用于 Java 或类似结构的语言)。(开动作)
如果不在某个方法开始处之前,则跳转到类的开始或结束处。如果光标之前已无 '{',会有一个错误。
[M 反向第 [count] 个方法的结束处 (适用于 Java 或类似结构的语言)。(开动作)
如果不在某个方法开始处之前,则跳转到类的开始或结束处。如果光标之前已无 '}',会有一个错误。
[# 反向第 [count] 个未匹配的 "#if" 或 "#else"。(开动作)
]# 正向第 [count] 个未匹配的 "#else" 或 "#endif"。(开动作)
[* 或 [/ 反向第 [count] 个 C 注释的开始 "/*"。(开动作)
]* 或 ]/ 正向第 [count] 个 C 注释的结束 "*/"。(开动作)
H 到窗口从顶部算第 [count] 行 (缺省: 窗口的第一行) 并停在第一个非空白字符上。(行动作)。
光标还要根据 'scrolloff' 调整。
M 到窗口的中间一行并停在第一个非空白字符。(行动作)
L 到窗口从底部算第 [count] 行 (缺省: 窗口的最后一行) 并停在第一个非空白字符上。(行动作)
光标还要根据 'scrolloff' 调整。
<LeftMouse> 到屏幕上鼠标点击的位置。(开动作)
如果鼠标在状态行上,则所属的窗口被激活但光标位置不改变。
相关概念
操作符命令:
一般用来删除或者改变文本。
动作命令:
出现在操作符之后,从而使操作符作用于被该动作所跨越的文本之上。也就是,在动作之前和之后的光标位置之间的文本。
如果动作包括一个次数而操作符之前也有一个的话,两者相乘。
大多数情况下,光标在应用操作符后停在被操作的文本的起始处。
行动作:
在行间移动的动作。
字符动作:
在行内移动的动作。
面向行的操作符:
操作符 + 行动作。
面向字符的操作符:
操作符 + 字符动作。
闭动作:
面向字符的动作,开始和结束位置包含在操作范围里。
开动作:
面向字符的动作,靠近缓冲区尾端的最后一个字符不被包含在内。
行的动作总包含开始和结尾的位置。
特例:
- 如果一个开动作的结尾应在第一列,那么,它会前移到上一行的结尾处,并成为一个闭动作。
- 如果一个开动作的结尾应在第一列,而它的开始处于某一行的第一个非空白字符之前或之上,那么它会转换成一个行动作。
强制转换动作类型:
操作符 + "v"、"V" 或者 CTRL-V
- v:强制该操作面向字符。如果操作是面向行的,则变成开动作。如果是面向字符的,则在开/闭间切换。
- V:强制该操作面向行。
- Ctrl-V:强制该动作面向列块。类似于可视列块模式的选择,由动作之前和之后的光标位置定义两个角落。
--------------------------------------------------
屏幕行:
指在开启'wrap'选项后,因自动换行而产生的虚拟行。
单词:
单词由字符、数字和下划线序列或者其他的非空白字符的序列组成。单词间可以空白字符(空格、制表、换行)分隔。
这一规则可以用 'iskeyword' 选项改变。空行也被认作单词。
已折叠的行序列被认作由单个字符组成的单词。"w" 和 "W"、"e" 和 "E" 移动到折叠行之后的第一个单词或字串的开始/结尾处。"b" 和 "B" 移动到折叠之前的第一个单词的开始处。
字串:
字串由非空白字符序列组成。字串以空白分隔。空行也被认作字串。
特例:
- 如果光标在非空白字符上,"cw" 和 "cW" 等价于 "ce" 和 "cE"。
- 如果 "w" 动作带操作符并且该动作的最后一个单词在行尾,则该操作范围结束于行尾而非下一行的第一个单词。
句子:
以 '.'、'!' 或者 '?' 结尾并紧随着一个换行符、空格或者制表符。标点和空白字符之间可以出现任何数量的闭括号和引号: ')'、']'、'"' 和 '''。段落和小节的边界也视为句子的边界。
段落:
从空行或某一个段落宏命令开始,段落宏由 'paragraphs' 选项里成对出现的字符所定义。小节边界也被视为段落边界。空白行(只包含空白)不是段落边界。
小节:
从首列出现的换页符 (<C-L>) 或某一个小节宏命令开始。小节宏由 'sections' 选项里成对出现的字符所定义。
--------------------------------------------------
在操作符之后:
非块对象:
对于 "a" 开头的命令:操作符作用于对象与其后的空白。
如果其后没有空白或者光标位于对象之前的空白上的话,那么也包括对象之前的空白。
对于 "i" 开头的命令:如果光标在对象之上,那么操作符作用于该对象。如果光标在空白上,那么操作符作用于空白。
块对象:
操作符作用于光标所在位置所在 (包括光标在括号上的特殊情况) 的块。
对于"i" 开头的命令,不包含包围的括号。而对于 "a" 开头的命令,则包含之。
在可视模式下:
可视区域的起始和结束点在相同位置 (刚输入 "v"):选择一个区域,就和使用操作符一样。
可视区域的起始和结束点不同:
非块对象:该区域被对象或者下一个对象之前空白所扩展,对于 "a" 开头的命令,则两者都包含。
扩展的方向决定于可视区域和光标的相对位置。
块对象:该块向外扩展一层。
移动命令和文本对象的区别:
移动命令作用于这里(光标当前位置)到移动后的位置。而对象的使用则会作用于整个对象,而和光标在对象的何处无关。
标签块:
"it" 和 "at" 文本对象尝试选择 HTML 和 XML 的匹配标签之间的块。但因为它们并不完全兼容,有一些限制。通常的方法是选择 <tag> 直到匹配的 </tag> 为止的内容。"at" 包含标签,"it" 不包含。不过重复 "it" 时标签仍然会包含 (不然不会有任何改变)。此外,在没有内容的标签块上使用 "it" 会单独选择引导标签。跳过 "<aaa/>" 项目。忽略大小写,即使对大小写应该敏感的 XML 也是如此。HTML 里可以有 <br> 或 <meta ...> 这样没有匹配结束标签的标签和单独出现的结束标签将被忽略。
--------------------------------------------------
位置标记:
它只是文件中一个被记住的位置,在任何情况下均不可见,和命名的寄存器毫不相干。
'a - 'z 小写位置标记,在每个文件内有效。
只要文件还在缓冲区列表里,小写位置标记 'a 到 'z 就被记住。如果在缓冲区列表里删除一个文件,它的位置标记就消失了。
如果删除包含某个位置标记的文本行,这个位置标记也就随之消失。
小写位置标记可以和操作符合并使用。
小写位置标记在撤销/重做时会被复原。
'A - 'Z 大写位置标记,也叫做文件标记,在文件间都有效。
大写位置标记 'A 到 'Z 包含了所在的文件名。可以用这些标记在文件间跳转。
要和操作符合并使用的大写位置标记必须在当前文件里。
即使插入/删除一些行或者同时编辑别的文件,这种标记的行号总是正确的。
如果 'viminfo' 选项不为空,大写位置标记由 .viminfo 文件保存。
'0 - '9 数字位置标记,在 .viminfo 文件里设置。
数字位置标记 '0 到 '9 不能被直接设置,而只能从 viminfo 文件中获取。
'0 是你上次退出 Vim 时的光标位置。'1 是再上一次,依次递推。
'viminfo' 的 'r' 标志可以指定不记录数字位置标记的文件。
--------------------------------------------------
跳转命令:
"'"、"`"、"G"、"/"、"?"、"n"、"N"、"%"、"("、")"、"[["、"]]"、"{"、"}"、":s"、":tag"、"L"、"M"、"H" 和开始编辑新文件的命令。
跳转表
用来记住跳转的位置。每个窗口有独立的跳转表,每个表最多能存储 100 项。如果你分割一个窗口,跳转表会复制到新的窗口里。
改变表:
用来记住改变文本以后光标的位置被记住。每个改变都会记住一个位置,从而可以使该操作能被撤销。除非这个位置和上一个改变很接近。

浙公网安备 33010602011771号