Vim8 操作简记
Normal 模式是 Vim 默认打开状态。我们可以通过 Normal 模式,任何其它模式,我们可以在 Normal 模式下对文本进行浏览、排版、修改。Normal 模式在 Vim 中具有举足轻重的作用。
在 Normal 模式下,除了基本的移动指令 (j、k、h、l)、插入指令 (i、a)、撤销指令 (u、U) 等。Vim 通过 “操作符 + 运作命令 = 操作”(出自《Vim 实用技巧 第 2 版》) 扩展出了大量的操作指令。
指令、操作、操作指令都是,由人向计算机输入指令,计算机就会返回程序预设的结果。不过操作给我的感觉更像动词,所以后面我用指令来代替他。如上述等式所言指令由两部分组成,即 operator 和 motion,用前者指定行为,后者指定作用范围。还有一些只能在 Visual 模式或 operator 后面使用的叫:text object selection,文本对象选择器。
有一条额外的规则,即当一个操作符命令被连续调用两次时候,它会作用于当前行。如:dd
删除当前行;yy
复制当前行;>>
缩进当前行;gUgU
将当前行转换为大写,可以简写为 gUU
。
常用指令
Characterwise motions
- dl 向右删除一个字符
- d (delete)
- l ( 右移一个字符,和 left 没有关系,键位好按)
- 一般用 x 代替
- dh 向左删除一个字符
- h ( 左移一个字符)
- dw 向右删除至下一个单词的开头
- w (words forward)
- W 大写表示只使用空格作为分隔
- de 向左删除至单词的末尾,如果本身处于单词末尾,那么删除至下一个单词末尾
- e (Forward to the end of word)
- E 大写表示只使用空格作为分隔
- dge 向左删除至上一个单词的末尾
- ge (Backward to the end of word)
- gE 大写表示只使用空格作为分隔
- db 向右删除至单词的开头,如果本身处于单词开头,那么删除至上一个单词的开头
- b (words backward)
- B 大写表示只使用空格作为分隔
- dd 删除当前行
- d^ 删除光标之前的内容至空白字符处 (non-blank character)
- d0 删除光标之前的内容
dg_ 删除光标之后的内容至空白字符处- d$ 删除光标及光标之后的内容
Linewise motions
- dj 删除本行及下一行
- dk 删除本行及上一行
- dG 删除至文章末尾
- G (Goto line,默认最后一行)
- dgg 删除至文章开头
- gg(Goto line,默认最后一行)
- ggdG (删除整篇文章内容)
使用gg*G
对整篇文章进行操作比较麻烦,安装插件可以更加便捷:
kana/vim-textobj-entire
执行dae
就可以达到和执行ggdG
一样的效果。
Text object selection
- daw 删除一个单词
- aw (a word)
- 2daw 或 d2aw 将忽略空格,删除两个单词
- aW
- diw 删除一个单词
- iw (inner word)
- 2diw 或 d2iw 包含空格,即删除一个单词和空格
- iW
- das 删除一个句子及后面的空白(没对中文句子进行支持)
dis 删除一个句子- dap 删除一个段落
- ap(a paragraph)
dip 删除一个段落- da]、da[ 删除 [] 块内容,包含 []
- di]、di[ 删除 [] 块内容,不含 []
- da)、da(、dab
- di)、di(、dib
- da>、da<
- di>、di<
- dat 删除标签块,例如
,包含 - dit
- da}、da{、daB
- di}、di{、diB
- da”
- di”
- da’
- di’
- da`
- di`
Operators
- c change
- d delete
- y 复制到寄存器
- g~ 反转文本大小写)
- gU 转换为大写
- gu 转换为小写
Tips:
我们可以发现 Operator 操作符是不能单独使用的。在 motions 或者组合指令前面加 n,可以达到执行 n 次的效果,例如:
2daw
,将删除两个单词,然后使用u
可以一次性撤销。也可以在执行daw
后使用.
操作符,达到一样的效果,这需要执行u
两次才能完全撤销。word 和 WORD 的区别在于,word 可以由:
spaces
,tabs
,<EOL>
分隔,而 WORD 仅使用 spaces 作为分隔。相同之处在于:它们都是由字母、数字和下划线或其他非空字符序列组成。而在中文中的表现却有所不同:将连续的纯汉字视为一个“单词”。文本对象选择器中的 i 和 a 的区别在于:i 选择没有 space 的文本对象,而 a 包含 space。
对中文句子不那么友好的情况,因此
.
英文句号加空格来判断一个句子的结尾,我在感觉没啥用的部分加了删除线。
参考文献
- Vim: help.txt
- 《Vim 实用技巧 (第 2 版)》