Practical Vim
- . 重复上次修改
- ;重复查找行内上次 f{char}/t{char}命令所查找的字符,,向前查找
- &重复执行替换 :s/target/replacement
- 理想模式:一键移动,一键执行
- u 撤销的粒度是一次修改,控制 Esc 的使用就可以控制撤销的粒度
- 删除光标前一个单词 db,删除后一个 dw
- text objects,例如 aw 表示 a word,daw 可以删除一个单词(无论光标在单词的哪个字母处),as 表示 a sentence,ap 表示 a paragraph
- 和分别对数字执行+和-操作
- c 修改,修改完会进入插入模式
- 插入模式/bash shell 中,删除前一个字符,删除前一个单词,删至行首
- 切换到普通模式 或 ,切换到插入-普通模式,所谓插入-普通模式即 execute one command, return to Insert mode,例如zz
- 重绘屏幕,把当前行显示在窗口正中,z.或 zz,区别是 z.会把光标移动到行内第一个 non-blank 字符处,zz 保持光标位置不变
- K 查看手册,例如光标位于 ls 上,按 K 相当于 man ls
- J 把当前行和下一行连接在一起
- 插入模式下,0 把复制的文本粘贴到光标所在位置,寄存器命令的一般格式是{register}
- 表达式寄存器用于计算,插入模式下=就可以访问这一寄存器,例:=6*35 就会插入 210
- R 替换模式
- vit 命令 visually select inside the tag,it 命令是一种被称为 text
object 的特殊动作命令,例 vit 会选中one当中的 one
- 尽量用操作符命令,而不是可视命令
- gv 选中上次的高亮选区
- :{start},{end},数字表示行号,\%表示当前文件中所有行,$表示最后一行,.光标所在行
- yyp 会使用寄存器,用:t.复制当前行不使用寄存器,因此不会覆盖寄存器内容
- @:重复上次命令,:寄存器总是保存最后执行的命令行命令
- 回到跳转列表中上条记录,即上一次光标所在位置
- 命令行下,会复制光标下的单词并插入到命令行中
- A buffer is the in-memory text of a file. A window is a viewport on a buffer. A tab page is a collection of windows.
- 分割窗口,s 水平分割,v 垂直分割,:sp {file}水平分割并载入 file,:vsp
{file}垂直分割并载入 file
- 关闭窗口,c 或:clo[se]关闭活动窗口,o 或:on[ly]只保留活动窗口,关闭其他所有窗口
- resize 窗口,=使所有窗口等宽等高,最大化活动窗口高度,|最大化活动窗口宽度,[N]高度设为 N,[N]|宽度设为 N
- :lcd {path}设置当前窗口的本地工作目录,:windo lcd {path}为标签页所有窗口设置本地工作目录
- :tabe[dit] {filename}打开一个新的标签页,:tabc[lose]关闭当前标签页,:tabo[nly]关闭除活动标签页以外的其他标签页
- 标签页编号从 1 开始,可以用{N}gt 在标签页切换,也可以用:tabn[ext] {N}命令,gt 或:tabn[ext]切换到下一个标签页,gT 或:tabp[revious]切换到上一标签页
- :tabmove [N]重排标签页
- :e %会自动展开完整文件路径,%代表活动缓冲区的完整文件路径。:e %:h会去除文件名,保留路径。
- :find test.cc
- :e.打开文件管理器,并显示当前工作目录。:Explore 打开文件管理器,并显示活动缓冲区所在目录
- 查看文件状态
- text object
- d{motion} aw/as/ap, c{motion} iw/is/ip
- m{a-zA-Z}设置标记当前光标所在位置,方便快速跳转。小写位置只在每个缓冲区局部可见,大写位置全局可见。'{mark}跳到标记所在行,并把光标移动到第一个非 blank 字符。`{mark}跳到标记所在行,并保持标记时光标所在位置。
- surround.vim 插件,S"可以用一对双引号把选中的文本括起来,cs}]可以把{London}改成[London]
- vim 记录跳转前后的位置,后退,或前进,:jumps 查看跳转记录。
- :changes 查看改变列表
- 光标移动到文件名上,gf (go to file)
- vim 寄存器是一组用于保存文本的简单容器,若不指定寄存器,delete/yank/put 操作将使用无名寄存器""
- blackhole register "_ ,使用"_d{motion}会执行真正的删除操作
- "ayiw 把当前单词复制到寄存器 a 中,"ap 粘贴来自寄存器 a 的单词;"bdd 把当前行剪切到寄存器 b 中,"bp 粘贴来自寄存器 b 的文本
- 复制专用寄存器"0,使用 y{motion}时,复制的文本不仅被拷贝到无名寄存器中,也被拷贝到了复制专用寄存器中
- 有名寄存器"a-"z,系统剪切板/加号寄存器"+,表达式寄存器"=
- 可以高亮选中文本,然后用寄存器中的内容替换高亮选区
- 黄金法则:在录制一个宏时,要确保每条命令都可被重复执行。
- 给宏追加命令,例如 qa xxxx q 录制了宏在寄存器 a 中,录制完发现想要追加一个 j,按 qA j q 即可
- ~切换光标所在处字母的大小写
- 编辑宏,例如要编辑宏 a,可以用:put a 或"ap 把寄存器 a 里的内容粘贴出来,编辑完后"ay 把内容复制到寄存器 a 即可
- 用\v 模式使得 vim 正则表达式看起来更直观,例如匹配 16 进制颜色,/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})或者/\v#(\x{6}|\x{3}),其中\x 代替完整字符集[0-9a-fA-F]
body { color: #3c3c3c; }
a { color: #0000EE; }
strong { color: #000; }
- 原义开关\V,例如文档中有 a.k.a.,/a.k.a.也会匹配 backward 这样的词,使用/\Va.k.a.就只会匹配 a.k.a.
- 匹配两个连续重复单词的正则:/\v<(\w+)_s+\1>
原理:()内部匹配的文本会被自动保存到一个临时仓库,\1 引用这段被捕获的文本,如果包含多个(),则可以用\2 直到\9,\0 引用整个匹配,_s 匹配空白符 or 换行符,<>匹配单词的边界
- /the会匹配到 the,they,their 中的所有 the,如果想明确匹配 the 这个单词,则用做单词界定,即/\v
- \w 匹配单词类字符,包括字母数字下划线,\W 匹配除单词类字符以外的其他字符
- 使用圆括号/\v(And|D)rew 可以匹配 Andrew 或 Drew,如果不想捕获括号内的内容到寄存器\1,可以加一个%,即/\v%(And|D)rew
- :nohlsearch 或:noh 暂时关闭查找高亮功能,直到执行新的查找命令
- \C 强制区分大小写
- q/调出查找历史
- 替换命令:substitute 语法:[range]s[ubstitute]/{pattern}/{string}/[flags]
- :s/a/b 替换第一个匹配,:s/a/b/g 替换行内所有匹配,:%s/a/b/g 替换文件内所有匹配,:%s/a/b/gc 每一次替换都需要 confirm
- 用寄存器内容替换,通过{register}可以将寄存器内容插入到命令行,即:%s/aaa/0/g,或者通过引用的方式:%s/aaa/\=@0/g
- 替换的时候忘了加%,例如:s/target/replacement/g,想要重复上一次替换命令对整个文件执行替换,g&,等同于
:%s//~/&
- 接 67,另一种重复替换的情况,visual mode 选中需要替换的文本范围,然后:&&
- 使用子匹配重排 csv 文件的字段,例如要交换列为 email,first name,last name
last name,first name,email
neil,drew,drew@vimcasts.org
doe,john,john@example.com
可以用
/v^([^,]*),([^,]*),([^,]*)$
然后:%s//\3,\2,\1
其中,[^,]
会匹配除逗号以外的任意字符
- global 命令形式
:[range]global[!]/{pattern}/[cmd]
,命令在[range]内的文本行上执行时,先在所有[pattern]匹配行上做标记,再在所有标记的文本上执行[cmd]。缺省 range 默认为整个文件
- 删除所有包含模式的文本行:g/re/d,grep 一词的来历是:g/re/p,其中 p 是:print 的缩写
- :g/TODO/yank a 把包含 TODO 的行复制到寄存器 a 中(覆盖原内容),或者用大写字母 A 附加到寄存器 a 中,或者
:g/TODO/t$
把所有 TODO 项复制到文件末尾
- vi{ 选中一段由{}包围的文本块
- :set spell 调用 vim 内置拼写检查器,错误会被高亮,通过[s 和]s 在错误之间反向和正向跳转,光标位于错误单词上时,z=来获取 vim 提供的更正建议列表