在按下 : 键时,vim 会切换到命令行模式。在任意时刻,我们都可以按 Esc 键从命令行模式切换回普通模式。

操作缓冲区文本的 Ex 命令表:

命令 用途
:[range]delete [x] 删除指定范围内的行[到寄存器x 中]
:[range]yank [x] 复制指定范围的行[到寄存器x 中]
:[line]put [x] 在指定行后粘贴寄存器x 中的内容
:[range]copy {address} 把指定范围内的行拷贝到{address} 所指定的行之下
:[range]move {address} 把指定范围内的行移动到{address} 所指定的行之下
:[range]join 连接指定范围内的行
:[range]normal {commands} 对指定范围内的每一行执行普通模式命令{commands}
:[range]substitute/{pattern}/{string}/[flags] 把指定范围内出现{pattern}的地方替换为{string}
:[range]global/{pattern}/[cmd] 对指定范围内匹配{pattern}的所有行,在其上执行 Ex 命令{cmd}

在一行或多个连续行上执行命令

:1 会跳转到第一行,:5 会跳转到第五行。如果你执行的是 :3d 命令,那么只需一条命令就可以跳到第三行并删除此行;

我们也可以用行号指定一个范围,形式如下:

1
:{start},{end}

符号. 代表当前行的地址。因此,我们可以很容易地写出一个范围,用以代表从当前位置到文件末尾间的所有行:

1
:.,$p

符号 % 也有特殊含义,它代表当前文件中的所有行。

用模式指定范围,命令如下:

1
:/<html>/,/<\/html>/p

用偏移对地址进行修正,命令如下:

1
:/<html>/+1,/<\/html>/-1p

下表对用来构建 Ex 命令的地址及范围的符号进行了总结:

符号 地址
1 文件的第一行
$ 文件的最后一行
0 虚拟行,位于文件第一行上方
. 光标所在行
‘m 包含位置标记 m 的行
‘< 高亮选区的起始行
‘> 高亮选区的结束行
% 整个文件(:1,$ 的简写形式)

复制和移动行

:copy 命令(及其简写形式 :t)让我们可以把一行或多行从文档的一部分复制到另一部分,而 :move 命令则可以让我们把一行或多行移到文档的其他地方。

copy 命令的格式如下:

1
:[range]copy {address}

下表展示了 :t 命令的一些应用实例:

命令 用途
:6t. 把第6 行复制到当前行下方
:t6 把当前行复制到第6 行下方
:t. 为当前行创建一个副本(类似于普通模式下的yyp)
:t$ 把当前行复制到文本结尾
:’<,’>t0 把高亮选中的行复制到文件开头

:move 命令看上去和 :copy 命令很相似,可以把它简写为一个字母:m。

1
:[range]move {address}

‘<,’> 代表了高亮选区。因此我们可以很容易地选中另外一个高亮选区,然后重复执行:’<,’>m$ 命令把选中的文本移到文件结尾。重复上次的 Ex 命令非常简单,只需按@:。

在指定范围上执行普通模式命令

有如下例子:

1
2
3
4
5
var foo = 1
var bar = 'a'
var baz = 'z'
var foobar = foo + bar
var foobarbaz = foo + bar + baz

如果要给每一行后面添加 ;。可以先在第一行上 A;<Esc>。接下来用不着每一行执行 . 命令,可以先高亮第 2 行到末尾,jVG,然后在输入 :'<,'>normal .

也可以使用下面命令解决上面问题:

1
:%normal A;

【参考资料】

  1. Vim实用技巧

—EOF—