# Vim实用技巧
正常模式
编辑模式
命令模式
可视模式
# 第1章 Vim解决问题的方式
# 技巧1 结识.
命令
重复上次修改
# 格式:[num] .
数字加个.,表示重复多少次上次修改。
# 技巧2 不要自我重复
灵活使用
.
减少重复操作
# 行尾添加
A;<Esc> j. j.
# 减少无关的移动
复合命令 | 等效长命令 | 作用 |
---|---|---|
C | c$ | 删除光标位置到当前行结束的内容并进入插入模式 |
s | cl | 删除光标位置内容并进入插入模式 |
I | ^i | 把光标移动到行开头并进入插入模式 |
A | $a | 把光标移动到行的结尾并进入插入模式 |
o | A<CR> | 在光标行的下面新增一行 |
O | ko | 在光标行的上面新增一行 |
# 技巧3 以退为进
# 使修改可重复
#加号两边添加空格
f+ #查找+号
s + <Esc> #删除光标位置内容并进入插入模式,增加“ + ”内容,并退出插入模式
;. #查找并插入上次修改内容
;. #查找并插入上次修改内容
# 使移动可重复
f{char} #查找char,
; #向后重复查找
, #向前重复查找
# 全而为一
;. #向后查找下一个并重复上次的修改
# 技巧4 执行、重复、回退
作用 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {edit} | . | u |
在行内查找下一个指定字符(f光标在指定字符上,t光标在指定字符前) | f{char}/t{char} | ; | , |
在行内查找上一个指定字符(F光标在指定字符上,T光标在指定字符后) | F{char}/T{char} | ; | , |
在文档中查找下一匹配项 | /pattern<CR> | n | N |
在文档中查找上一匹配矾 | ?pattern<CR> | n | N |
在行内执行替换 | 😒/target/replacement | & | u |
执行一系列修改 | qx{changes}q | @x | u |
# 技巧5 查找并手动替换
# 在文档范围执行查找并替换
#替换
:%s/target/replacement/g #用replacement替换target
:%s/target/replacement/gi #用replacement替换target,不区别大小写
:%S/target/replacement/gc #用replacement替换target,替换前先询问
# 无需输入即可进行查找(*)
#在文档范围内查找光标处的单词,并高亮
*
#跳转到下一个(遍历)
n
# 使修改可重复
#删除光标处的单词并进入插入模式
cw{Content}<Esc> #删除光标处的单词并进入插入模式,插入内容,退出,此处会当成一个修改,即.的内容
n. #查找下一个并用上个修改替换
n. #查找下一个并用上个修改替换
# 技巧6 结识.范式
# 理想模式:用一键移动,另一键执行
一次移动一次执行即可达目标,叫".范式"
# 第2章 普通模式
# 技巧7 停顿时请移开画笔
在不编辑的时候,请回到普通模式(Normal mode)
# 技巧8 把撤销单元切成块
编辑时合理控制好<Esc>键的使用,生成合理大小的撤销块,可使撤销命令作用于单词,句子或段落。
使用键盘的方向键移动光标,会产生一个新的撤销块。相当于退出插入模式并使用hjkl命令移动光标。
# 技巧9 构造可重复的修改
# 反向删除
删除一个单词,光标位于单词最后一个字母
按键操作 缓冲区内容 说明 {start} The end is boring 光标位置g db The end is g db删除光标起始位置到单词开头的内容 x The end is 删除光标字符
# 正向删除
- 删除一个单词,光标位于单词最后一个字母
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
{start} | The end is boring | 光标位置g |
b | The end is boring | 把光标移动到单词的首字母 |
dw | The end is | 删除整个单词 |
# 删除整个单词
- 直接删除文本对象(d+aw)
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
{start} | The end is boring | 光标位置g |
daw | The end is | 删除整个单词 |
此是最优的方法,. == daw
# 技巧10 用次数做简单的算术计算
加法[num]Ctrl+a
Ctrl+a #加1 9Ctrl+a #加9
减法[num] Ctrl+x
Ctrl+x #减1 8Ctrl+x #减8
当光标不在数字上,会正向找到第一个数进行操作
当数字是0开头时,默认会当成8进制数,可以在vimrc里增加set nrformats=设置为10进制
例子:把当前行复制一行,并把blog替换成news 第一个0px改成-180px
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
{start} | .blog { backgroup-position: 0px 0px} | |
yyp | .blog { backgroup-position: 0px 0px} .blog { backgroup-position: 0px 0px} | 复制 |
cW.news<Esc> | .blog { backgroup-position: 0px 0px} .news { backgroup-position: 0px 0px} | 修改第一个单词(Word) |
180Ctrl+x | .blog { backgroup-position: 0px 0px} .news { backgroup-position: -180px 0px} | 第一个数字-180 |
# 技巧11 能够重复,就别用次数
# 尽量用重复功能
删除3个单词,可以用d3w
或3dw
,或dw..
,建议用dw..
,更方便回退。
# 只在必要时使用次数
当使用次数修改时,后面又接着要切换到插入模式,这时就建议使用次数。
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
{start} | I have a couple of questions | |
c3wsome more<Esc> | I have some more questions |
# 技巧12 双剑合璧,天下无敌
# 操作符+动作命令=操作
命令格式 | 常用组合 | 说明 |
---|---|---|
d{motion} | dw(daw),dl,dh,dk,dj,daw,dap | 删除的组合 |
c{motion} | cw(caw),cl,ch,ck,cj,cap | 修改的组合 |
y{motion} | 同上 | 复制的组合 |
g~{motion} | g~w,g~l,g~h,g~k,g~j,g~ap | 大小写转换的组合 |
gu{motion} | 同上 | 转小写的组合 |
gU{motion} | 同上 | 转大写的组合 |
Vim语法额外规则:当一个操作符命令被连续调用两次时,它会作用于当前行。
例如:dd删除当前行,cc清除当前行并处于插入模式,yy复制当前行到寄存器,>>缩进当前行
gU比较特殊当前行转大写,可以用gUgU,也可以用简化的gUU
# VIM操作符命令常用表
命令 | 说明 |
---|---|
c | 修改 |
d | 删除 |
y | 复制到寄存器 |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
! | 使用外部程序过滤{motion}所跨越的行 |
# 第3章 插入模式(insert mode)
# 技巧13 在插入模式中可即时更正错误
按键操作 | 用途 |
---|---|
Ctrl+h | 删除前一个字符(同退格) |
Ctrl+w | 删除前一个单词 |
Ctrl+u | 删至行首 |
# 技巧14 返回普通模式
# 从插入模式返回普通模式
按键操作 | 用途 |
---|---|
Esc | 切换到普通模式 |
Ctrl+[ | 切换到普通模式 |
Ctrl+o | 切换到插入-普通模式(接受一个动作命令后进入插入模式) |
# 例子
Ctrl+ozz
:从当前编辑行滚动到屏幕的中间
# 技巧15 在插入模式粘贴寄存器中的文本
Ctrl+r{register}:会一个个字符输入进去
Ctrl+rCtrl+p{register}:会按原义插入寄存器的文本,并修正任何不必要的缩进
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
ggyt; | System.out.println("I am a farmer."); log.info("hehe"); System.out.println("I am a worker."); | 回到第一行,复制第一个;号前的内容到寄存器 |
GGo | 同上,光标在文章最后一行并插入一行 | 光标在文章最后一行并新插入一行进入插入模式 |
Ctrl+r0 | System.out.println("I am a farmer."); log.info("hehe"); System.out.println("I am a worker."); System.out.println("I am a farmer.") | 把寄存器第0个内容粘贴出来 |
;<Esc> | System.out.println("I am a farmer."); log.info("hehe"); System.out.println("I am a worker."); System.out.println("I am a farmer."); | 加;号并退出插入模式 |
# 技巧16 随时随地做运算
# 表达式寄存器
Ctrl+r=<expr>回车
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
A | 6 chairs, each price is $35, total is $ | 到行尾 |
Ctrl+r=6*35Enter | 6 chairs, each price is $35, total is $210 | 开启寄存器计算,输入表达式,回车 |
# 技巧17 用字符编码插入特殊字符
# 通过unicode编码插入特殊字符
Ctrl+v065:插入A,接受三位数字
Ctrl+vu0040:插入@,接受4位16进制数字
按键 | 用途 | 说明 |
---|---|---|
Ctrl+v065 | 以十进制字符编码插入字符 | 三位数字, |
Ctrl+vu0040 | 以十六进制字符编码插入字符 | u+四位数字 |
Ctrl+v{nondigit} | 按原义插入非数字字符 | |
Ctrl+k{char1}{char2} | 插入以二合字母{char1}{char2}表示的字符 |
# 技巧18 用二合字母插入特殊字符
# 通过两个字母组合插入特殊字符
Ctrl+k{char1}{char2}
# 例子
按键 | 输出 | 说明 |
---|---|---|
Ctrl+k<< | « | |
Ctrl+k>> | » | |
Ctrl+k?I | ¿ | |
Ctrl+k12 | ½ | |
Ctrl+k18 | ⅛ |
# 帮助
:h digraph-table
:h digraphs
:h digraphs-default
# 技巧19 用替换模式替换已有文本
# 常用替换模式
r:替换一个字符
R: 1:1替换字符(要注意制表符)
# 用虚拟替换模式替换制表符
由于制表符这类在文件中是单个字符,在屏幕上却占若干行的情况,可以用虚拟替换模式
gr: 开启制表符的单个虚拟替换模式
gR: 开启制表符的多个虚拟替换模式
按键 | 缓冲区内容(假定制表符占4位) | 说明 |
---|---|---|
{start} | The end | 光标在开头 |
gr{tab} | end |
# 帮助
:h r
:h tabstop
# 第4章 可视模式
Vim的可视模式可操作字符文本、行文本、块文本,并支持重复执行命令
.
# 技巧20 深入理解可视模式
# 激活可视模式
在普通模式下输入
v/V/Ctrl+v/gv
进入可视模式。
命令 | 用途 |
---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
Ctrl+v | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
# 结识选择模式
在可视模式中,按
Ctrl+g
会在可视模式与选择模式之间切换
在可视模式下,操作和普通模式差不多。
在选择模式下,按下任何可见字符,此字符会替换掉所选内容并切换到插入模式。其实相当于可视模式下按下c
{可见字符}
# 涉及操作命令
命令 | 说明 |
---|---|
v/V/Ctrl+v/gv | 从普通模式进入可视模式 |
Ctrl+g | 可视/选择模式切换 |
c | 可视模式下删除并进入插入模式,等同选择模式输入任何可见字符 |
# 技巧21 选择高亮选区
# 在可视模式之间切换
命令 | 用途 | |
---|---|---|
<Esc><Esc> | 回到普通模式 | 按两次Esc |
Ctrl+[Ctrl+[ | 回到普通模式 | 按两次Ctrl+[ |
v | 字符可视模式与普通模式之间的切换 | |
V | 行可视模式与普通模式之间的切换 | |
Ctrl+v | 列块可视模式与普通模式之间的切换 | |
o | 切换高亮选区的活动端 | 在选区的开头和结尾之间切换 |
字符/行/列几种可视模式之间可以直接切换,即vVCtrl+v。
# 切换选区的活动端
使用o
切换选区的端点,主要用于调整选区边界。
按键 | 缓冲区内容 | 说明 |
---|---|---|
{start} | Select from here to there. | 光标在h处 |
vee | Select from here to there. | 字符可视模式,选择2个单词,光标在o处 |
o | Select from here to there. | 光标切换到h处 |
b | Select from here to there. | 向前选择from,光标在f处 |
# 技巧22 重复执行面向行的可视命令
# 准备工作
设置
shiftwidth
和softtabstop
为4,还有启用expandtab
:set shiftwidth=4 softtabstop=4 enpandtab
# 先缩进一次,然后重复
使用
.
进行缩进
# 例子
移动一个tab,然后用.重复
按键操作 | 缓冲区内容 | 说明 |
---|---|---|
{start} | def fib(n): a, b = 0, 1 while a < n: print a a, b = b, a+b fib(142) | 光标在p上 |
Vj或Ctrl+vj | def fib(n): a, b = 0, 1 while a < n: print a a, b = b, a+b fib(142) | 光标选中print a和a,b两行 |
>. | def fib(n): a, b = 0, 1 while a < n: print a a, b = b, a+b fib(142) | 选中的两行移动一个tab,然后再重复 |