1. 学习完前面的三大模式:正常模式,插入模式和可视模式后,现在步入了命令模式。:
, /
或 ?
, 和 <C-r>=
分别进入到 Ex
命令,搜索和表达式,它们都被称作命令模式, 以前还常常把正常模式说成是命令模式。:
后的是 Ex
命令,是因为我们仍然沿袭了 Vim 的前身 Ex。我在 Mac 下输入命令 ex
就会看到这个
进入到 Vim 的 Ex mode, 输入 visual
命令就是正常的 Vim 界面。Vim 之于 Ex 就像 Gui 之于 Shell, Vim 的 Ex 命令可以做任何操作,见 :h ex-cmd-index
。
2. 命令模式在 :
提示符下输入时可以使用插入模式下的很多命令,如 <C-w>
, <C-u>
, <C-k>
, <C-v>
, <C-r>{reg}
, 甚至是 <C-r>=
,就是不能用 motion 命令,光标移得靠方向键
3. 在阅读本章之前对 Vi 的命令模式只能用不觉明厉来形容,它对我的贡献仅仅是 :wq
之类的,模式查找,简单替换,再就是执行一些未设置快捷键插件功能。也一直未理解替换怎么是 %s/abc/dev
, 只是依葫芦画瓢,现在终于可以在本章中理解那些命令了。从中真的能体会到 Ex 命令模式的乐趣,Ex 是不会把整个文件内容显示在屏幕上的, Ex 命令通常由 范围 + 命令 组成。
:2 -- 光标跳到第一行,正常模式下可以 2G, 或 2gg
:print -- 打印当前行的内容
范围和命令一般会写在一块,范围可借用同样意义的特殊字符,默认操作当前行,因此下面一系列的命令就好理解了
:$p
: 打印最后一行, 与.,$p
, 或,$p
相同。因为 Ex 是行编辑,所以$
不再是当前行最后一列的意思。:2,5p
: 打印第 2 至第 5 行的内容,如果是从当前行算起可以用.,5p
, 或,5p
:%d
: 删除全文,等效于用ggdG
%j
: 把全文连成一行,%
代表文件全部行,j
是join
命令,也就是正常模式下的J
命令:%s/abc/def
: 终于理解了这个操作了,这里的%
代表全部行,所以是替换每行第一次出现的 abc 为 def, 需要全局替换就是:%s/abc/def/g
,s
是substitute
命令的缩写:5m$
: 第 5 行内容移到最后,更多命令用:h ex-cmd-index
查看
4. Vim 对选择区的范围在 Ex 命令中的表示是 '<,'>
, 从选择区的开始 '<
到(,
) 选择区的结束 '>
, 对该区域的操作就是 '<,'>p
. 在选择模式下选择后键入 :
就能看到
5. 用模式匹配来指定范围,如 :/<html>/,<\/html>/p
6. 位置偏移,如 :/<html>/+1,<\/html>-1p
, html 标签内部的内容, :.,.+3p
输出当前后往下数三行,或者是 :,.+3p
, :,+3p
. +3p
只会打印出往下的第三行(一行)的内容
7. 进入命令模式的方式:1)正常模式下,:
, 插入模式下可以 <C-o>:
, 选择模式下直接按 :
. 当前插入模式到正常模式切换可用 Esc
或 <C-[
8. 正常模式可做与命令模式一样的事情,如 :6t.
, 从第六行拷贝一行到当前行下,正常模式下必须移光标到第六行 yy
, 再移下当前行 p
, 所以选择命令模式还是正常模式是命令模式近距离,命令模式可远距离操作。命令模式这个操作还不会覆盖寄存器的内容。
9. Ex 命令配上正常模式下的命令就更无敌了。如 A;<Esc>
后 :'<,'>normal .
就能在选择的多行上重复末尾加分号。 :%normal A;
更简单的所有行后加分号; :2,4normal i//
用 // 注释掉从第 2 到第 4 行。Ex 命令一次性作用多行,与 normal 下的命令一结合就起化学反应了。normal
可以简写为 norm
, 如 :%norm A;
。
10. 正常模式上次修改的重复用 .
, 而对 Ex 命令的重复操作是用 @:
, 如果执行过一次 @:
, 那就可以不断的按 @@
来重复放到 :
寄存器中的 Ex 命令了。同时 @@
的每次执行指令都会丢到 Jump List 中,这时按 <C-o>
会反着执行 Jump List 中的指令。可以在有多个 buffer 时试下 :bnext
, @:
, @@
, @@
, <C-o>
, <C-o
11. Ex 命令的自动完成, <Tab>
单行列出可选项,并可用 <Tab>
或 <S-Tab>
往前往后的选择。新玩艺是 <C-d>
, 例如输入 :b<C-d>
会多行列出所有的以 b
开头的 Ex 命令。不妨对比下 :b<Tab>
, 或 :colorscheme <C-d>
和 :colorscheme<Tab>
12. 在输入 Ex 命令时可以按 <C-r><C-w
提取缓冲区光标所在单词到命令输入窗口中。例如当前光标在单 hello 上,输入 :%s/abc/<C-r><C-w>
就会变成 %s/abc/hello
, 继续完成该 Ex 命令,<C-r><C-a>
也类似,但有小区别
13. 一次可以同时执行多个 Ex 命令,用管道符分开, :write | !ruby %
. q:
可以打开命令行窗口,在其中可以以 Vim 的方式编辑历史命令,<CR>
会执行命令行窗口中当前行的 Ex 命令,并且作用在打开命令行窗口前的编辑窗口。q:
或 <CR>
退出命令行窗口
14. 在输入 Ex 命令时可以按 <C-f>
切换到命令行窗口对当前命令进行编辑,完后 <CR>
执行。因为搜索有自己的历史,所以相应的 q/
可以打开搜索历史的命令行窗口。
15. Ex 中执行 Shell 命令,Shell 命令前加一个感叹号,如 :!ls
执行完回车返回到 Vim. Ex 命令中 %
代表当前文件名,可以这么用 :!ruby %
, :!echo %
可以看到输出的当前文件名。如果想一次运行多个 Shell 命令,那就 :shell
进入交互界面,其实它没什么特别的,用个 :!bash
也行,用 exit
退回。还有一个等效的操作是:在 Vim 中按 <C-z>
把 Vim 送到后台(jobs 命令可以列出它), 执行完 shell 命令后,再用 fg
命令再回到刚才 Vim 界面
16. 用缓冲区的内容作为 shell 命令的标准输入与输出。 :read !{cmd}
缓冲区为 shell 命令的标准输出; :write !{cmd}
缓冲区(或选择区) 为 shell 命令的标准输入,每一行触发一次执行。
17. 外部命令过滤缓冲区内容,外部命令逐行读入并替换掉选择区内容即完成了 map 操作,例如 %!sort
对缓冲区按行排序,可以尝试像 cut, awk, sed 这样的命令。!{motion}
可以便捷的选择区域并附加上感叹号,如正常模式下 !G
就会在 Ex 命令输入中变成 :.,$!
等待后续输入
18. Vim 还允许像批处理一样把 Ex 命令逐行写在一个外部文件中,然后在 Vim 中用 :source batch.vim
来执行其中定义的一系列 Ex 命令。注意:写在 batch.vim 中的 Ex 命令不用前导的 :
, 并且推荐用全命令名,以增强可读性。如
global/href/join
vglobal/href/delete
%normal yi"$p
可以手工对每个打开的文件执行上面的批命令, :args
, :first
, :source batch.vim
, :next
, :source batch.vim
; 也可以用 :argdo
一次性对所有的 buffer 执行批命令,:argdo source batch.vim
本文链接 https://yanbin.blog/practical-vim-2-notes-3/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。