《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