《Practical Vim》(《Vim实用技巧》)笔记,参考了gitig/Practical-Vim-Notes 和中文版 Practical Vim,加入了一些我的理解和例子, 教程的写作方式
技巧 1. 认识.命令: .,x,u,dd,>G,h,j,k,l
技巧 2. 不要自我重复: $,I,i,a,A
技巧 3. 以退为进: f{char},;,,,s
技巧 4. 执行、重复、回退: .,u
技巧 5. 查找并手动替换: :%s/content/copy/g,*,#
技巧 6. 结识.范式: .
在不同的模式上按键,产生的效果可能不同
- 普通模式在执行时可以指定执行次数
- 指定执行次数可以减少按键次数,但是有的时候多按几次更好: 计算按键次数可能费脑子, 不如直接next,next一直到目的地
- 普通模式:操作符+动作命令
技巧 7. 停顿时请移开画笔
技巧 8. 把撤销的单元切成块: <Esc>o
技巧 9. 尽量构造可重复的修改: VimGolf, daw vs dbw vs dbx
技巧 10. 用次数做简单的算术运算: <C-a>,<C-x>,yyp,cw
技巧 11. 能够重复,就别用次数: d3w vs 3dw vs dw..
技巧 12. 操作+操作符 双剑合璧: gu,gU,g~,=,<,>
- 大多数操作都在非插入模式中实现(复制\删除\剪切\黏贴)
- 不离开插入模式就可以黏贴寄存器中的文本
- 如何插入键盘上不存在的字符?
- 替换模式是插入模式的特例
插入-普通模式是插入模式的子集
技巧 13. 在插入模式中回退/撤销: <C-x>,<C-w>,<C-u>
技巧 14. 返回普通模式: <
技巧 15. 不离开插入模式, 粘贴寄存器中的文本: yt,,<C-r>0
技巧 16. 随时随地做运算: <C-r>=
技巧 17. 用字符编码插入非常用字符: <C-v>{123},<C-v>u{1234},<C-v><CR>
技巧 18. 用二合字母(digraph)插入非常用字符: <C-k>35,<C-k>?I,<C-k><<
技巧 19. 使用替换模式替换已有文本: R,r
- 可视模式允许在选中的文本区域上操作
- 可视模式分为在字符文本\行文本\块文本上的操作
.命令对于行文本的操作用处较大, 其他可视模式里使用.意义不大
技巧 20. 深入理解可视模式: viw, <C-g>,c
技巧 21. 选择高亮区域: v,V,<C-v>,o
技巧 22. 重复执行面向行的可视命令: Vj>.
技巧 23. 尽可能使用操作符命令,而不是可视命令: vitU, gUit
技巧 24. 用面向__列块__的可视模式编辑表格数据: <C-v>3jr|
技巧 25. 修改列文本: <C-v>jjec<Esc>
技巧 26. 在长短不一的高亮块中添加文本: <C-v>jj$c<Esc>
ex本来是一个行编辑器, 是vi的祖先- 基于行的编辑任务, Ex 命令是最佳工具
技巧 27. 结识Vim的命令行模式: :,<C-w>
技巧 28. 在一行或多个连续行上执行命令: :2,5p,:%s/old/new/gc,:/<html>/-1,/<\/html>/+1p
技巧 29. 使用:t :m 进行复制和移动行: :6t.,Vjj:m$
技巧 30. 在指定范围上执行普通模式命令: :'<,'>normal .
技巧 31. 重复上次的Ex命令::@:, :bp,:bn
技巧 32. 自动补全Ex命令:<Tab>,<C-n>,<C-p>
技巧 33. 把当前单词插入到命令行: /<C-r><C-w><CR>, *:%s//<C-r><C-w>/g
技巧 34. 回溯历史命令:q:
技巧 35. 运行Shell命令: :ls,:write! sh,:write !sh,:2,$!sort -t',' -k2,2
- 缓冲区列表记录打开的所有文件
- 缓冲区文件分组方法
- 将Ex命令作用在缓冲区每个文件上
- 标签页分割窗口
技巧 36. 用缓冲区列表管理打开的文件: :bnext, :ls, <C-^>, :bprev, :bfirst, :blast, :buffer N, :buffer {bufname}, :bufdo, :argdo, :bd[elete]
技巧 37. 用参数列表将缓冲区分组: :args {arglist}
技巧 38. 管理隐藏缓冲区: :wirte, :edit!, qall!, :wall
技巧 39. 将工作区分成窗口: <C-w>s, <C-w>v, :edit, :close, :only
技巧 40. 用标签页将窗口分组: :lcd{path}, :tabe[dit] {filename}, :tabmove [N]
- 介绍在vim 中打开文件的方式
- 配置
path选项之后利用:find命令打开文件netrw插件查看目录树- 保存文件的时候如果没有写权限或是目标路径不存在怎么办?
技巧 41. 用:edit命令打开文件: :edit %<Tab>, :edit %:h<Tab>
技巧 42. 使用:find打开文件: :find, :set path+=app/**
技巧 43. 使用netrw管理文件系统::edit ., :e., :Explore, :E.
技巧 44. 把文件保存到不存在的目录中: <C-g>, :!mkdir -p %:h
技巧 45. 以超级用户权限保存文件: :w !sudo tee % > /dev/null
学习vim如何在文件内、文件间快速跳转
- 使用动作(motion)命令在文档中跳转
- 上下左右移动、一次移动一个单词、通过查找命令快速移动
- 操作符待决模式
- 查看vim文档
:h motion
技巧 46. 让手指保持在 本位行(Home Row)上: h,j,k,l
技巧 47. 区分实际行和屏幕行:gj, gk, g0, g$, g^
技巧 48. 基于单词移动:w, b, e, ge, ea, gea, W, cW
技巧 49. 对字符串进行查找:f{char}, ;, ,, F{char}, t{char}, T{char}, dt.
技巧 50. 通过查找进行移动:/{char}, n, N
技巧 51. 用精确的文本对象选择选取:vi}, a", i", at, it
技巧 52. 删除周边,修改内部:iw, iW, is, ip, aw, aW, as, ap
技巧 53. 设置位置标记,以便快速跳回:m{a-zA-Z}, '{mark}
技巧 54. 在匹配括号间跳转:%, S"
技巧 55. 遍历跳转列表: <C-o>, <C-i>
技巧 56. 遍历改变列表: :changes, .**, **^, gi
技巧 57. 跳转到光标下的文件: gf, :set path?
技巧 58. 用全局位置标记在文件间快速跳转: :vimgrep, `{char}
- 寄存器是保存文本的容器
- 寄存器可以实现复制、粘贴、剪切文本; 可以记录一系列按键操作,制作宏命令
- vim提供几十个寄存器保存文本,比系统单一的剪切板多很多
- vim的粘贴可以面向行和面向字符
- 可视模式下的粘贴、系统剪切板的使用
技巧 59. 用无名寄存器实现删除、复制和粘帖操作: x, p, xp, dd, ddp, yyp, P, diw
技巧 60. 深入理解vim寄存器: "{register}, "ayiw, "bdd, "ap, "bp, ""p, "0P, :reg "0, "_d{motion}, "+, "+p <C-r>+
技巧 61. 用寄存器中的内容替换高亮选取的文本: m{char}, `{char}
技巧 62. 把寄存器中的内容粘贴出来: <C-r>{register}, p, P, gp, gP
技巧 63. 与系统粘贴板进行交互: :set pastetoggle=<f5>, "+p
- 宏是
.指令的加强版- 宏适合对一系列相似的行、段落、文件上操作
- 宏的执行分2种方式:串行方式回放 和 并行方式多次运行
技巧 64. 宏的读取和执行: q, q{register}, :reg a, @{register}, @@
技巧 65. 规范光标位置、直达目标以及终止宏: {number}@a
技巧 66. 加次数回放宏: qq;.q
技巧 67. 在连续的文本行上重复修改: 0, :normal @a
技巧 68. 给宏追加命令: qa, qA
技巧 69. 在一组文件中执行宏: gg/class<CR>, :argdo, :edit!, :argdo normal @a, :argdo write, :wall, :wnext
技巧 70. 用迭代求值的方式给列表编号: :let i=0, :echo i, <C-r>=i<CR>
技巧 71. 编辑宏的内容: ~, vU, :put a
- pattern使得构造正则表达式和原义查找文本变得容易
- substitute和global是2个强大的Ex命令
- 查找时替换的前提,如何在查找时使用正则表达式?
very magic、very nomagic模式、原义开关都是什么,什么用?- 零宽度定界符有哪些?各自作用是?
技巧 72. 调整查找模式的大小写敏感性: \c, \C
技巧 73. 使用\v模式进行正则表达式查找: \v
技巧 74. 完全匹配字符串时,使用\V 查找: \V
技巧 75. 使用圆括号()获取子匹配: ()
技巧 76. 使用<,>界定单词边界: <, >
技巧 77. 界定匹配的边界(使用\zs, \ze): \zs, \ze
技巧 78. 转移问题字符: /\?需要转义
- 查找模式可以自动补全匹配、减少按键次数、统计匹配数量
- 构造正确的正则表达式一般需要调试多次,我们可以迭代的构造模式,减少调试代价
- 可以定制命令,查找高亮选区的文本
- 定制自己的
*,在可视模式下也可快速查找选中的文本
技巧 79. 查找命令入门: /, ?, n, N
技巧 80. 高亮查找匹配: hlsearch, noh, <C-l>
技巧 81. 在执行查找前预览第一处匹配: incsearch, <C-r><C-w>
技巧 82. 统计当前模式的匹配个数: :%s///gn
技巧 83. 将光标偏移到查找匹配的结尾: /xxxx/e
技巧 84. 对完整的查找匹配进行操作: /\vX(ht)?ml\C,gUfl
技巧 85. 利用查找历史, 迭代完成复杂的模式: :%s/\v'(([^']|'\w)+)'/“\1”/g
技巧 86. 查找当前高亮选区中的文本: y/<C-R>"
- 替换和查找是最常用的vim命令
- 替换命令中的查找域可以为空
- 替换命令支持跨文件操作
- 替换命令中的替换域支持脚本表达式,实现复杂操作
技巧 87. 结识 substitute 命令: :[range]s/{pattern}/{string}/[flags]
技巧 88. 在文件范围内查找并替换每一处匹配: :%s/going/rolling/g
技巧 89. 手动控制每一次替换操作: :%s/content/copy/gc
技巧 90. 重用上次的查找模式: :%s//“\1”/g, :%s/\n/,/g, :%s/<C-r>//“\1”/g
技巧 91. 用寄存器的内容替换: :%s//<C-r>0/g
技巧 92. 重复上一次 substitute 命令: :%s//~/&, g&, :%s/Name/Number/g, :%&&
技巧 93. 使用子匹配重排CSV文件的字段: /\v^([^,]*),([^,]*),([^,]*)$、:%s//\3,\2,\1
技巧 94. 在替换过程中执行算术运算 : /\v\<\/?h\zs\d, :%s//\=submatch(0)-1/g
技巧 95. 交换两个或更多的单词: :%s//\={"dog":"man","man":"dog"}[submatch(1)]/g
技巧 96. 在多个文件中执行查找与替换: :argdo %s//Practical/g, :vimgrep /<C-r>// **/*.txt
- global 命令融合了Ex命令与Vim模式匹配的能力
- 可以在指定模式的所有匹配行上运行Ex命令
- global 命令是除了点范式和宏以外,最强大的Vim工具
技巧 97. 结识 global 命令: :[range] global[!] /{pattern}/ [cmd]
技巧 98. 删除所有包含模式的文本行: /\v\<\/?\w+>,:g//d,:v/href/d,:g/re/p
技巧 99. 将 TODO 项收集至寄存器: :global,:yank
技巧 100. 将 CSS 文件中所有规则的属性按照字母排序: :g/{/ .+1,/}/-1 sort
- vim内可以方便调用make、grep等外部程序
- vim提供拼写检查和自动补全等命令
- ctags使我们可以快速跳到函数和类的定义处,实现浏览整个代码库
- ctags的结果也可以用于自动补全
技巧 101. 结识ctags: ctags *
技巧 102. 配置 Vim 使用 ctags: :set tags?,:!ctags -R
技巧 103. 使用 Vim 的标签跳转命令,浏览关键字的定义: <C-t>,<C-]>,g<C-]>,:tag {keyword},:tjump {keyword}
- quickfix列表会维护乙组文件名、行号、列号(可选)与消息组成的注释定位信息
- 可以使用
:make命令编译,并将错误信息进行解析,在quickfix列表中提供浏览
技巧 104. 不用离开 Vim 也能编译代码: make, :cnext
技巧 105. 浏览 Quickfix 列表: :cprev,:cnext,:cfirst,:clast,:cnfile,:cpfile,:cc N, :copen
技巧 106. 回溯以前的 Quickfix 列表: :colder,:cnewer, :5colder
技巧 107. 定制外部编译器: :setglobal errorformat?
:grep可以在不离开vim下调用外部程序:gep可以调用grep,也可以调用ack:vimgrep允许在多个文件中指定查找模式
技巧 108. 不必离开 Vim 也能调用 grep: :grep Waldo *
技巧 109. 定制grep程序: grepprg,grepformat
技巧 110. 使用 Vim 内部的 Grep: :vimgrep,vim /<C-r>// **
- vim可以从限定的来源(缓冲区文件、头文件、标签文件)来进行自动补全
- 介绍如何从补全列表中获取正确的单词,以及如何获取相关度最高的补全建议
技巧 111. 结识 Vim 的关键字自动补全: <C-p>,<C-n>,<C-x>
技巧 112. 与自动补全的弹出式菜单进行交互: <C-n>等价于<Down>;<C-p>等价于<Up>
技巧 113. 掌握关键字的来龙去脉: <C-x><C-n>,<C-x><C-i>,<C-x><C-]>
技巧 114. 使用字典中的单词进行自动补全: <C-x><C-k>,:set spell
技巧 115. 自动补全整行文本
技巧 116. 自动补全文件名: <C-x><C-f>
技巧 117. 根据上下文自动补全: <C-x><C-o>
- vim的拼写检查可以针对不同语言/地区使用不同的规则
- 插入模式下也可以使用拼写检查
- 可以对拼写检查的单词表进行自定义(添加/删除)
技巧 118. 对你的工作进行拼写检查: [s,]s,2z=
技巧 119. 使用其他拼写字典: :set spelllang=en_us
技巧 120. 将单词添加到拼写文件中: zg,zw
技巧 121. 在插入模式下更正拼写错误: <C-x>s