《Practical Vim》阅读笔记 (3)

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

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments