# 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个单词,可以用d3w3dw,或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 重复执行面向行的可视命令

# 准备工作

设置shiftwidthsofttabstop为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,然后再重复