vim
光标移动
h
光标左移,同 j
光标下移,同 k
光标上移,同 l
光标右移,同 CTRL-F
下一页CTRL-B
上一页CTRL-U
上移半屏CTRL-D
下移半屏0
跳到行首(是数字零,不是字母O),效用等同于 ^
跳到从行首开始第一个非空白字符$
跳到行尾,效用等同于 gg
跳到第一行,效用等同于 CTRL+G
跳到最后一行,效用等同于 CTRL+nG
跳到第n行,比如 10G 是移动到第十行:n
跳到第n行,比如 :10<回车> 是移动到第十行10%
移动到文件 10% 处15|
移动到当前行的 15列w
跳到下一个单词开头 (word: 标点或空格分隔的单词)W
跳到下一个单词开头 (WORD: 空格分隔的单词)e
跳到下一个单词尾部 (word: 标点或空格分隔的单词)E
跳到下一个单词尾部 (WORD: 空格分隔的单词)b
上一个单词头 (word: 标点或空格分隔的单词)B
上一个单词头 (WORD: 空格分隔的单词)ge
上一个单词尾)
向前移动一个句子(句号分隔)(
向后移动一个句子(句号分隔)}
向前移动一个段落(空行分隔){
向后移动一个段落(空行分隔)<enter>
移动到下一行首个非空字符+
移动到下一行首个非空字符(同回车键)-
移动到上一行首个非空字符H
移动到屏幕上部M
移动到屏幕中部L
移动到屏幕下部fx
跳转到下一个为 x 的字符,2f/ 可以找到第二个斜杆Fx
跳转到上一个为 x 的字符tx
跳转到下一个为 x 的字符前Tx
跳转到上一个为 x 的字符前;
跳到下一个 f/t 搜索的结果,
跳到上一个 f/t 搜索的结果<S-Left>
按住 SHIFT 按左键,向左移动一个单词<S-Right>
按住 SHIFT 按右键,向右移动一个单词<S-Up>
按住 SHIFT 按上键,向上翻页<S-Down>
按住 SHIFT 按下键,向下翻页gm
移动到行中gj
光标下移一行(忽略自动换行)gk
光标上移一行(忽略自动换行)
插入模式:进入退出
i
在光标处进入插入模式I
在行首进入插入模式a
在光标后进入插入模式A
在行尾进入插入模式o
在下一行插入新行并进入插入模式O
在上一行插入新行并进入插入模式gi
进入到上一次插入模式的位置<ESC>
退出插入模式CTRL-[
退出插入模式(同 ESC 等价,但更顺手)
插入模式
<Up>
光标向上移动<Down>
光标向下移动<Left>
光标向左移动<Right>
光标向右移动<S-Left>
按住 SHIFT 按左键,向左移动一个单词<S-Right>
按住 SHIFT 按右键,向右移动一个单词<S-Up>
按住 SHIFT 按上键,向上翻页<S-Down>
按住 SHIFT 按下键,向下翻页<PageUp>
上翻页<PageDown>
下翻页<Delete>
删除光标处字符<BS>
Backspace 向后删除字符<Home>
光标跳转行首<End>
光标跳转行尾CTRL-W
向前删除单词CTRL-O
临时退出插入模式,执行单条命令又返回插入模式CTRL-\ CTRL-O
临时退出插入模式(光标保持),执行单条命令又返回插入模式CTRL-R 0
插入寄存器(内部 0号剪贴板)内容,CTRL-R 后可跟寄存器名CTRL-R "
插入匿名寄存器内容,相当于插入模式下 p粘贴CTRL-R =
插入表达式计算结果,等号后面跟表达式CTRL-R :
插入上一次命令行命令CTRL-R /
插入上一次搜索的关键字CTRL-F
自动缩进CTRL-U
删除当前行所有字符CTRL-V {char}
插入非数字的字面量CTRL-V {number}
插入三个数字代表的 ascii/unicode 字符CTRL-V 065
插入 10进制 ascii 字符(两数字) 065 即 A字符CTRL-V x41
插入 16进制 ascii 字符(三数字) x41 即 A字符CTRL-V o101
插入 8进制 ascii 字符(三数字) o101 即 A字符CTRL-V u1234
插入 16进制 unicode 字符(四数字)CTRL-V U12345678
插入 16进制 unicode 字符(八数字)CTRL-K {ch1} {ch2}
插入 digraph(见 :h digraph),快速输入日文或符号等CTRL-D
文字向前缩进CTRL-T
文字向后缩进
文本编辑
r
替换当前字符R
进入替换模式,直至 ESC 离开s
替换字符(删除光标处字符,并进入插入模式,前可接数量)S
替换行(删除当前行,并进入插入模式,前可接数量)cc
改写当前行(删除当前行并进入插入模式),同 Scw
改写光标开始处的当前单词ciw
改写光标所处的单词caw
改写光标所处的单词,并且包括前后空格(如果有的话)c0
改写到行首c^
改写到行首(第一个非零字符)c$
改写到行末C
改写到行尾(同c$)ci"
改写双引号中的内容ci'
改写单引号中的内容cib
改写小括号中的内容cab
改写小括号中的内容(包含小括号本身)ci)
改写小括号中的内容ci]
改写中括号中内容ciB
改写大括号中内容caB
改写大括号中的内容(包含大括号本身)ci}
改写大括号中内容cit
改写 xml tag 中的内容cis
改写当前句子c2w
改写下两个单词ct(
改写到小括号前c/apple
改写到光标后的第一个apple前x
删除当前字符,前面可以接数字,3x代表删除三个字符X
向前删除字符dd
删除当前行d0
删除到行首d^
删除到行首(第一个非零字符)d$
删除到行末D
删除到行末(同 d$)dw
删除当前单词diw
删除光标所处的单词daw
删除光标所处的单词,并包含前后空格(如果有的话)di"
删除双引号中的内容di'
删除单引号中的内容dib
删除小括号中的内容di)
删除小括号中的内容dab
删除小括号内的内容(包含小括号本身)di]
删除中括号中内容diB
删除大括号中内容di}
删除大括号中内容daB
删除大括号内的内容(包含大括号本身)dit
删除 xml tag 中的内容dis
删除当前句子dip
删除当前段落(前后有空白行的称为一个段落)dap
删除当前段落(包括前后空白行)d2w
删除下两个单词dt(
删除到小括号前d/apple
删除到光标后的第一个apple前dgg
删除到文件头部dG
删除到文件尾部d}
删除下一段d{
删除上一段u
撤销U
撤销整行操作CTRL-R
撤销上一次 u 命令J
链接多行为一行.
重复上一次操作~
替换大小写g~iw
替换当前单词的大小写gUiw
将单词转成大写guiw
将当前单词转成小写guu
全行转为小写gUU
全行转为大写<<
减少缩进>>
增加缩进==
自动缩进CTRL-A
增加数字CTRL-X
减少数字
复制粘贴
p
粘贴到光标后P
粘贴到光标前v
开始标记y
复制标记内容V
开始按行标记CTRL-V
开始列标记y$
复制当前位置到本行结束的内容yy
复制当前行Y
复制当前行,同 yyyiw
复制当前单词3yy
复制光标下三行内容v0
选中当前位置到行首v$
选中当前位置到行末viw
选中当前单词vib
选中小括号内的东西vi)
选中小括号内的东西vi]
选中中括号内的东西viB
选中大括号内的东西vi}
选中大括号内的东西vis
选中句子中的东西vip
选中当前段落(前后有空白行的称为一个段落)vap
选中当前段落(包括前后空白行)vab
选中小括号内的东西(包含小括号本身)va)
选中小括号内的东西(包含小括号本身)va]
选中中括号内的东西(包含中括号本身)vaB
选中大括号内的东西(包含大括号本身)va}
选中大括号内的东西(包含大括号本身)gv
重新选择上一次选中的文字:set paste
允许粘贴模式(避免粘贴时自动缩进影响格式):set nopaste
禁止粘贴模式"?yy
复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称"?d3j
删除光标下三行内容,并放到寄存器 ? ,问号代表 0-9 的寄存器名称"?p
将寄存器 ? 的内容粘贴到光标后"?P
将寄存器 ? 的内容粘贴到光标前:registers
显示所有寄存器内容:[range]y
复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行:[range]d
删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行ddp
交换两行内容:先删除当前行复制到寄存器,并粘贴"_[command]
使用[command]删除内容,并且不进行复制(不会污染寄存器)"*[command]
使用[command]复制内容到系统剪贴板(需要vim版本有clipboard支持)
文本对象 - c,d,v,y 等命令后接文本对象,一般为:<范围 i/a><类型>
$
到行末0
到行首^
到行首非空字符tx
光标位置到字符 x 之前fx
光标位置到字符 x 之处iw
整个单词(不包括分隔符)aw
整个单词(包括分隔符)iW
整个 WORD(不包括分隔符)aW
整个 WORD(包括分隔符)is
整个句子(不包括分隔符)as
整个句子(包括分隔符)ip
整个段落(不包括前后空白行)ap
整个段落(包括前后空白行)ib
小括号内ab
小括号内(包含小括号本身)iB
大括号内aB
大括号内(包含大括号本身)i)
小括号内a)
小括号内(包含小括号本身)i]
中括号内a]
中括号内(包含中括号本身)i}
大括号内a}
大括号内(包含大括号本身)i'
单引号内a'
单引号内(包含单引号本身)i"
双引号内a"
双引号内(包含双引号本身)2i)
往外两层小括号内2a)
往外两层小括号内(包含小括号本身)2f)
到第二个小括号处2t)
到第二个小括号前
查找替换
/pattern
从光标处向文件尾搜索 pattern?pattern
从光标处向文件头搜索 patternn
向同一方向执行上一次搜索N
向相反方向执行上一次搜索*
向前搜索光标下的单词#
向后搜索光标下的单词:s/p1/p2/g
将当前行中全替换p1为p2:%s/p1/p2/g
将当前文件中全替换p1为p2:%s/p1/p2/gc
将当前文件中全替换p1为p2,并且每处询问你是否替换:10,20s/p1/p2/g
将第10到20行中所有p1替换为p2:., ns/p1/p2/g
将当前行到n行中所有p1替换为p2:., +10s/p1/p2/g
将当前行到相对当前行加10行的区间中所有p1替换为p2:., $s/p1/p2/g
将当前行到最后一行中所有p1替换为p2:0,.s/p1/p2/g
将第一行到当前行中所有p1替换为p2:%s/1\\2\/3/123/g
将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注):%s/\r//g
删除 DOS 换行符 ^M
VISUAL MODE - 由 v, V, CTRL-V 进入的可视模式
>
增加缩进<
减少缩进d
删除高亮选中的文字x
删除高亮选中的文字c
改写文字,即删除高亮选中的文字并进入插入模式s
改写文字,即删除高亮选中的文字并进入插入模式y
拷贝文字~
转换大小写o
跳转到标记区的另外一端O
跳转到标记块的另外一端u
标记区转换为小写U
标记区转换为大写g CTRL-G
显示所选择区域的统计信息<Esc>
退出可视模式
位置跳转
CTRL-O
跳转到上一个位置CTRL-I
跳转到下一个位置CTRL-^
跳转到 alternate file (当前窗口的上一个文件)CTRL-]
跳转到当前光标文字下的超链接CTRL-T
返回到跳转之前的位置%
跳转到 {} () [] 的匹配gd
跳转到局部定义(光标下的单词的定义)gD
跳转到全局定义(光标下的单词的定义)gf
打开名称为光标下文件名的文件[[
跳转到上一个顶层函数(比如C语言以大括号分隔)]]
跳转到下一个顶层函数(比如C语言以大括号分隔)[m
跳转到上一个成员函数]m
跳转到下一个成员函数[{
跳转到上一处未匹配的 {]}
跳转到下一处未匹配的 }[(
跳转到上一处未匹配的 (])
跳转到下一处未匹配的 )[c
上一个不同处(diff时)]c
下一个不同处(diff时)[/
跳转到 C注释开头]/
跳转到 C注释结尾\
` 回到上次跳转的位置
‘’ 回到上次跳转的位置 ``.
回到上次编辑的位置'.
回到上次编辑的位置
文件操作
:w
保存文件:w <filename>
按名称保存文件:e <filename>
打开文件并编辑:saveas <filename>
另存为文件:r <filename>
读取文件并将内容插入到光标后:r !dir
将 dir 命令的输出捕获并插入到光标后:close
关闭文件:q
退出:q!
强制退出:wa
保存所有文件:cd <path>
切换 Vim 当前路径:pwd
显示 Vim 当前路径:new
打开一个新的窗口编辑新文件:enew
在当前窗口创建新文件:vnew
在左右切分的新窗口中编辑新文件:tabnew
在新的标签页中编辑新文件
已打开文件操作
:ls
查案缓存列表:bn
切换到下一个缓存:bp
切换到上一个缓存:bd
删除缓存:b 1
切换到1号缓存:b abc
切换到文件名为 abc 开头的缓存:badd <filename>
将文件添加到缓存列表:set hidden
设置隐藏模式(未保存的缓存可以被切换走,或者关闭):set nohidden
关闭隐藏模式(未保存的缓存不能被切换走,或者关闭)n CTRL-^
切换缓存,先输入数字的缓存编号,再按 CTRL + 6
窗口操作
:sp <filename>
上下切分窗口并在新窗口打开文件 filename:vs <filename>
左右切分窗口并在新窗口打开文件 filenameCTRL-W s
上下切分窗口CTRL-W v
左右切分窗口CTRL-W w
循环切换到下一个窗口CTRL-W W
循环切换到上一个窗口CTRL-W p
跳到上一个访问过的窗口CTRL-W c
关闭当前窗口CTRL-W o
关闭其他窗口CTRL-W h
跳到左边的窗口CTRL-W j
跳到下边的窗口CTRL-W k
跳到上边的窗口CTRL-W l
跳到右边的窗口CTRL-W +
增加当前窗口的行高,前面可以加数字CTRL-W -
减少当前窗口的行高,前面可以加数字CTRL-W <
减少当前窗口的列宽,前面可以加数字CTRL-W >
增加当前窗口的列宽,前面可以加数字CTRL-W =
让所有窗口宽高相同CTRL-W H
将当前窗口移动到最左边CTRL-W J
将当前窗口移动到最下边CTRL-W K
将当前窗口移动到最上边CTRL-W L
将当前窗口移动到最右边CTRL-W x
交换窗口CTRL-W f
在新窗口中打开名为光标下文件名的文件CTRL-W gf
在新标签页中打开名为光标下文件名的文件CTRL-W R
旋转窗口CTRL-W T
将当前窗口移到新的标签页中CTRL-W P
跳转到预览窗口CTRL-W z
关闭预览窗口CTRL-W _
纵向最大化当前窗口CTRL-W |
横向最大化当前窗口
标签页
:tabs
显示所有标签页:tabe <filename>
在新标签页中打开文件 filename:tabn
下一个标签页:tabp
上一个标签页:tabc
关闭当前标签页:tabo
关闭其他标签页:tabn n
切换到第n个标签页,比如 :tabn 3 切换到第三个标签页:tabm n
标签移动:tabfirst
切换到第一个标签页:tablast
切换到最后一个标签页:tab help
在标签页打开帮助:tab drop <file>
如果文件已被其他标签页和窗口打开则跳过去,否则新标签打开:tab split
在新的标签页中打开当前窗口里的文件:tab ball
将缓存中所有文件用标签页打开:set showtabline=?
设置为 0 就不显示标签页标签,1会按需显示,2会永久显示ngt
切换到第n个标签页,比如 2gt 将会切换到第二个标签页gt
下一个标签页gT
上一个标签页
书签
:marks
显示所有书签ma
保存当前位置到书签 a ,书签名小写字母为文件内,大写全局'a
跳转到书签 a所在的行a` 跳转到书签 a所在位置
. 跳转到上一次编辑的行
‘A 跳转到全文书签 A
[‘ 跳转到上一个书签
]’ 跳转到下一个书签
‘< 跳到上次可视模式选择区域的开始
‘> 跳到上次可视模式选择区域的结束
:delm a 删除缓冲区标签a
:delm A 删除文件标签A
:delm! 删除所有缓冲区标签(小写字母), 不能删除文件标签和数字标签
:delm A-Z 删除所有文件标签(大写字母)
:delm 0-9 删除所有数字标签(.viminfo)
:delm A-Z0-9` 删除所有文件标签和数字标签
代码折叠
za
切换折叠zA
递归切换折叠zc
折叠光标下代码zC
折叠光标下所有代码zd
删除光标下折叠zD
递归删除所有折叠zE
删除所有折叠zf
创建代码折叠zF
指定行数创建折叠zi
切换折叠zm
所有代码折叠一层zr
所有代码打开一层zM
折叠所有代码,设置 foldlevel=0,设置 foldenablezR
打开所有代码,设置 foldlevel 为最大值zn
折叠 none,重置 foldenable 并打开所有代码zN
折叠 normal,重置 foldenable 并恢复所有折叠zo
打开一层代码zO
打开光标下所有代码折叠
宏录制
qa
开始录制名字为 a 的宏q
结束录制宏@a
播放名字为 a 的宏@@
播放上一个宏@:
重复上一个ex命令(即冒号命令)
参考
https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt