vim实用技巧

vim实用技巧,快捷键记录

按键说明

语法

动词

d 删除 delete
r 替换 replace
c 修改 change
y 复制 yank
v 选取 visual select

名词 text object

w 单词word
s 句子 sentence
p 段落paragraph
t HTML标签tag
u 撤销(undo)
. 重复最后一个命令
引号或者各种括号所包含的文本称作一个文本块。

介词

介词界定了待编辑文本的范围或者位置。例如:

i “在…之内”inside
a “环绕…”around
t “到…位置前”to
f “到…位置上”forward

组词为句

动词+介词+名词

删除一个段落 delete inside paragraph: dip
选取一个句子 visual select inside sentence: vis
修改一个单词 change inside word: ciw
修改一个单词 change around word: caw
删除文本直到字符“x”(不包括字符“x”)delete to x: dtx
删除文本直到字符“x”(包括字符“x”)delete forward x:dfx

数词

动词+介词/数词+名词

修改三个单词 change three words: c3w
删除两个单词 delete two words: d2w

数词也可以修饰动词,表示将操作执行 n 次
数词+动词+名词

两次删除单词(等价于删除两个单词) twice delete word: 2dw
三次删除字符(等价于删除三个字符)three times delete character: 3x

移动光标

0 跳转到当前行首
^ 跳转到当前行的第一个非空字符(空格/TAB)
$ 跳转到当前行的末尾
gg 跳转到文件第一行(goto)
G 跳转到文件最后一行
47G 跳转到文件第47
:47 跳转到文件第47行(同"47G")

字符

f[char] 跳转到第一个[char]字符(find)
3f[char] 跳转到第三个[char]字符
F[char] 向左跳转到第一个[char]字符
t[char] 跳转到第一个[char]字符的前一个字符(till before - right)
T[char] 向左跳转到第一个[char]字符的后一个字符(till after - left)
; 重复最后一次的 f/F/t/T 移动命令

这里加 shift 大写,意为反向:向左

单词和文本块

w 跳转到下一个单词的开头(word)
3w 跳转到第三个单词的开头
e 跳转到下一个单词的结尾(end of word)
b 跳转到上一个单词的开头(backward beginning)
( 跳转到上一个句子的开头
) 跳转到下一个句子的开头
{ 跳转到上一个段落的开头
} 跳转到下一个段落的开头

代码块

% 在当前大括号/中括号/小括号的开始位置"{/[/("和结束位置"}/]/)"之间跳转
[[ 跳转到上一个函数的开头(如果光标在函数体内则跳转到当前函数的开头)
]] 跳转到下一个函数的开头
[{ 跳转到当前程序块的开头(当前程序块为当前程序的上一层,不是固定的)
]} 跳转到当前程序块的结尾

搜索

/[word] 搜索[word]字符串
?[word] 向上搜索[word]字符串
n 跳转到下一个匹配的字符串(保持最后一个搜索命令的方向)(next match)
N 跳转到上一个匹配的字符串(保持最后一个搜索命令的方向)
* 搜索当前光标下的单词
# 向上搜索当前光标下的单词

插入模式

s 删除光标位置下的字符并进入插入模式
S 删除当前行内容并进入插入模式

删除

x 删除光标位置下的字符
dw 删除光标之后的单词剩余部分(delete word)
diw 删除一个单词
dd 删除当前行
D 删除从光标位置到当前行的末尾(同"d$")
df[char] 删除从光标位置到[char]字符(delete find [char])
d) 删除从光标位置到下一个句子的开始
d} 删除从光标位置到该段落的末尾
di{ 删除花括号之间的内容(delete inner {})(同"diB")
di( 删除小括号之间的内容(delete inner ())(同"dib")
dit 删除闭合标签之间的内容(html/xml等标签,delete inner tag)
dat 删除左右尖括号及之间的内容(delete a tag)
da< 删除左右尖括号及之间的内容(delete a <>)
di" 删除引号之间的内容(delete inner "")
da" 删除左右引号及之间的内容(delete a "")
:5,10d 删除5-10
3dd 删除从当前行开始的3
<C-w> 删除光标前的一个单词(插入模式)
<C-u> 从光标位置删除到行首(插入模式)

这里加 shift 大写,意为行尾
注:"d"/"c"开头的命令会将删除的文本放到寄存器(通过":reg"查看),可以理解为剪切。
关于"a"n和"i"nner可以参考":help object-select"文本对象选择部分
另:一般向右的操作包含光标下的字符,向左的操作不包含光标下的字符

更改文本

J 将下一行合并的当前行的末尾(Join line)
3,9j 合并3-9
~ 切换光标下字符的大小写
u 更改选定的文本为小写(可视模式)
U 更改选定的文本为大写(可视模式)
<C-a> 把当前光标下或之后的数值加1
<C-x> 把当前光标下或之后的数值减1
r[char] 替换光标下的字符为[char]. (replace)
R 进入替换模式
cw 删除光标之后的单词剩余部分并进入插入模式(change word)
cc 删除当前行内容并进入插入模式(同"S")
C 删除从光标位置到当前行的末尾并进入插入模式(同"c$")
cf[char] 删除从光标位置到[char]字符并进入插入模式

这里"c"开头加 shift 大写,意为行尾
"c"开头"change"更改(删除并插入),"d"开头"delete"删除,和"y"开头"yank/copy",格式相同,可相互参考使用

缩进

>> 缩进当前行
<< 向左缩进当前行
<C-d> 缩进当前行(插入模式)
<C-t> 向左缩进当前行(插入模式)
:3,9>>>>> 将3-9行缩进5个TAB
> 缩进选定的行(可视模式)
< 向左缩进选定的行(可视模式)
>i{ 缩进花括号之间的内容(indent inner {})(同">iB")
>a{ 缩进花括号及之间的内容(indent a {})(同">aB")
=} 缩进当前段落
gg=G 全文缩进/格式化

复制粘贴

v 进入可视模式,以字符为单位选择
V 进入可视模式,以行为单位选择
<C-v> 进入列块可视模式(如果映射"<C-v>""粘贴"时请注意)
gv 重新选择最后选定的区域
y 抽出选择的文本到寄存器(可视模式)(yank/copy)
"+y 抽出选择的文本到系统剪切板(可视模式)(好像不太好使)
:co 10 复制当前行到第11行(copy)
:co . 复制当前行到下一行(同"yyp")
:5,10co 20 复制5-10行到第21行
yy 复制当前行
y$ 复制到行尾
yw 复制光标之后的单词剩余部分(yank word)
yb 复制光标之前的单词剩余部分
yiw 复制一个单词
yip 复制当前段落(yank inner paragraph)
yas 复制一个句子(yank a sentence)
yi< 复制尖括号之间的内容(Yank inner <>)
11y 复制11行
p 粘贴(paste)
P 粘贴到光标前
<C-r>" 粘贴(插入模式)
"ayy 复制当前行到寄存器"a"(可使用范围"a-z")
"ap 粘贴从寄存器"a"

这里的"寄存器"即VIM剪切板

滚动屏幕

H 跳转到屏幕的顶部(home)
M 跳转到屏幕的中间(middle)
L 跳转到屏幕的底部(low)
zt 将当前行滚动至屏幕顶部(top)
zz 将当前行滚动至屏幕中间(同"z.")
zb 将当前行滚动至屏幕中间(bottom)(同"z-")
<C-f> 滚动至下一页(forwards)
<C-b> 滚动至上一页(backwards)
<C-d> 向下滚动半屏(downwards)
<C-u> 向下滚动半屏(upwards)

键映射

:map 查看已映射的键列表
:imap 查看插入模式下已映射的键列表
:nmap 查看普通模式下已映射的键列表
:imap jj <Esc> 插入模式下键入"jj"映射到"<ESC>"(返回普通模式)
:nmap <C-h> <C-w>h 普通模式下映射"<C-h>""<C-w>h"(光标移动到左边一个窗口)

键位图

  • 绿色键:motion,移动光标,或定义操作的范围
  • 黄色键:command,直接执行的命令,红色命令进入编辑模式
  • 橙色键:operator,后面跟随表示操作范围的指令
  • 灰色键:extra,特殊功能,需要额外的输入