基本上 vi/vim 共分为三种模式分别是
- 命令模式(Command mode)
- 插入模式(Insert mode)
- 底线命令模式(Last line mode)
i
→ Insert 模式,按ESC
回到 Normal 模式.x
→ 删当前光标所在的一个字符。:wq
→ 存盘 + 退出 (:w
存盘,:q
退出) (注::w 后可以跟文件名)dd
→ 删除当前行,并把删除的行存到剪贴板里p
→ 粘贴剪贴板推荐
hjkl
(强例推荐使用其移动光标,但不必需) → 你也可以使用光标键 (←↓↑→). 注:j
就像下箭头。:help <command>
→ 显示相关命令的帮助。你也可以就输入:help
而不跟命令。(注:退出帮助需要输入:q)
-
各种插入模式
a
→ 在光标后插入o
→ 在当前行后插入一个新行O
→ 在当前行前插入一个新行cw
→ 替换从光标所在位置后到一个单词结尾的字符
-
简单的移动光标
0
→ 数字零,到行头^
→ 到本行第一个不是 blank 字符的位置(所谓 blank 字符就是空格,tab,换行,回车等)$
→ 到本行行尾g_
→ 到本行最后一个不是 blank 字符的位置。/pattern
→ 搜索pattern
的字符串(注:如果搜索出多个匹配,可按 n 键到下一个)
-
拷贝/粘贴
(注:p/P 都可以,p 是表示在当前位置之后,P 表示在当前位置之前)
P
→ 粘贴yy
→ 拷贝当前行当行于ddP
-
Undo/Redo
u
→ undo<C-r>
→ redo
-
打开/保存/退出/改变文件
(Buffer)
:e <path/to/file>
→ 打开一个文件:w
→ 存盘:saveas <path/to/file>
→ 另存为<path/to/file>
:x
,ZZ
或:wq
→ 保存并退出 (:x
表示仅在需要时保存,ZZ 不需要输入冒号并回车):q!
→ 退出不保存:qa!
强行退出所有的正在编辑的文件,就算别的文件有更改。:bn
和:bp
→ 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(注:我喜欢使用:n 到下一个文件)
-
多行编辑
- 将光标移动到第一行开头
- 按
v
进入可视模式 - 按
j
3 次或3j
选取三行 - 按 I(大写 i)
- 键入 prefix_ 。注意:它只会更新第一行的屏幕 - 直到 Esc 按下,此时所有行都将更新。
- 按 Esc
-
导入
:r <文件名> - 将 <文件名> 中的内容导入到当前文件 :r !date - 导入命令的执行结果
-
替换技巧
:ab 小 小怪兽 - 在 vim 编辑器中输入小,系统会自动给你替换成小怪兽,
-
折叠代码
- zc
- zo
命令 | 用途 |
---|---|
c | 修改 |
d | 删除 |
y | 复制到寄存器 |
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
! | 使用外部程序过滤 {motion} 所跨越的行 |
像 x
,i
,a
这些命令执行完后,会立即改变 vim 操作的内容或状态。而当我们输入操作符以后,并不会立即出现这样的变化(在没有选中内容的前提下)。这是因为当输入操作符以后,vim 会进入一种特殊的模式状态,即「操作符待决模式」。在该模式下,vim 会继续等待用户输入动作命令,直到接收到完整的动作命令以后,才会执行具体的动作。
命令 | 用途 |
---|---|
f{char} | 正向移动到下一个 {char} 所在之处 |
F{char} | 反向移动到上一个 {char} 所在之处 |
t{char} | 正向移动到下一个 {char} 所在之处的前一个字符上 |
T{char} | 反向移动到上一个 {char} 所在之处的后一个字符上 |
文本对象 | 选择区域 | 文本对象 | 选中区域 |
---|---|---|---|
a) 或 ab | 一对圆括号 (parentheses) | i) 或 ib | 圆括号内部 (parentheses) |
a} 或 aB | 一对花括号 {braces} | i} 或 iB | 花括号内部 {braces} |
a] | 一对方括号 [brackets] | i] | 方括号内部 [brackets] |
a> | 一对尖括号 | i> | 尖括号内部 |
a' | 一对单引号 ‘single quotes’ | i' | 单引号内部 ‘single quotes‘ |
a" | 一对双引号 “double quotes” | i" | 双引号内部 “double quotes“ |
a` | 一对反引号 backticks |
i` | 反引号内部 backticks |
at | 一对 XML 标签 tags | it | 一对 XML 标签内部 tag |
Vim 中,进入插入模式后,所有的修改操作都会被记录下来,直至返回到普通模式。这期间产生的操作即为「可重复执行的操作」。而重复执行这些操作可以通过. 命令实现。
-
光标移动
h
光标左移,同<Left>
键j
光标下移,同<Down>
键k
光标上移,同<Up>
键l
光标右移,同<Right>
键CTRL-F
下一页CTRL-B
上一页CTRL-U
上移半屏CTRL-D
下移半屏0
跳到行首(是数字零,不是字母 O),效用等同于<Home>
键^
跳到从行首开始第一个非空白字符$
跳到行尾,效用等同于<End>
键gg
跳到第一行,效用等同于CTRL+<Home>
G
跳到最后一行,效用等同于CTRL+<End>
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 等价,但更顺手)
-
INSERT MODE - 由 i, I, a, A, o, O 等命令进入插入模式后
<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-R0
插入寄存器(内部 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-V065
插入 10 进制 ascii 字符(两数字)065 即 A 字符CTRL-Vx41
插入 16 进制 ascii 字符(三数字)x41 即 A 字符CTRL-Vo101
插入 8 进制 ascii 字符(三数字)o101 即 A 字符CTRL-Vu1234
插入 16 进制 unicode 字符(四数字)CTRL-VU12345678
插入 16 进制 unicode 字符(八数字)CTRL-K{ch1}{ch2}
插入 digraph(见:hdigraph),快速输入日文或符号等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