Vim拥有独一无二的文本编辑功能与现代特性,相比于其他文本编译软件,它提供了完全不同等级的文本编辑熟练度,速度和精度。
基础操作:
h
向左移动光标j
向下移动k
向上移动l
向右移动i
进入插入模式<ESC>``<Ctrl-C>``<Ctrl-[>
返回普通模式
按照单词快速移动:
w
移动光标到下一个单词的开始b
移动光标到上一个单词的开始e
移动光标到下一个单词的末尾ge
移动光标到上一个单词的末尾W
移动光标到下一个广义单词的开始B
移动光标到上一个广义单词的开始E
移动光标到下一个广义单词的末尾gE
移动光标到上一个广义单词的末尾
字符定位:
f{character}
找到字符出现的下一个位置F{character}
找到字符出现的上一个位置t{character}
找到字符出现的下一个位置,并将光标移到这个字符之前T{character}
找到字符出现的上一个位置,并将光标移到这个字符之前;
搜索时,将光标移动到下一个匹配位置,
搜索时,将光标移动到上一个匹配位置
行内移动:
0
移动到一行的第一个字符^
移动到一行的第一个非空字符,一般用0w
$
移动到一行的最后一个字符g_
移动到一行的最后一个非空字符
行间快速移动:
}
向下跳过整个段落{
向上跳过整个段落CTRL-D
向下移动半页CTRL-U
向上移动半页
搜索时精确行间移动
/{pattern}
搜索 {pattern}。 {pattern} 可以是正则表达式.?{pattern}
搜索 {pattern} ,向反方向。/
重复上次搜索?
重复上次搜索,向反方向。n
移动光标到下一个匹配位置N
移动光标到上一个匹配位置
使用指令重复快速移动
-
{count}{motion}
重复{motion} {count} 次比如:
-
2w
跳到下2行 -
4f"
跳到第4个 " 字符 -
3/cucumber
跳到第三个匹配 "cucumber"的位置
按照语义移动
gd
转到当前光标所在单词的定义,c++变量直接转到定义gf
转到当前光标所在的文件,c++include直接转到包含文件
其他移动操作
gg
回到文件第一行{line}gg
转到第{line}行G
转到文件最后一行%
跳到匹配的括号 ,支持({[]}),在c++中很有用
使用vim操作编辑文本
-
{operator}{count}{motion}
将操作{operator}应用到{motion}覆盖的文本{count}次。e.g:
-
d
删除(delete) -
c
修改(change) -
y
复制(yank ,copy) -
p
粘贴 (put,paste) -
g~
切换大小写 -
>
向右缩进 -
<
向左缩进 -
=
格式化
行操作
dd
删除一行cc
修改一行yy
拷贝一行g~~
切换一行的大小写>>
整行向右缩进<<
整行向左缩进==
格式化一行
大写操作(更强版本)
D
从光标到行尾,删除C
从光标到行尾,修改Y
拷贝一行,和yy
一样P
粘贴到光标前
文本对象
{operator}a{text-object}
将 {operator}应用到包含周围空格的文本对象。{operator}i{text-object}
将 {operator}应用到文本对象。
e.g:diw
删除单词daw
删除单词(包含空格)dis
删除句子das
删除句子(包含空格)dip
删除段落dap
删除段落(包含空格)di(``dib
删除圆括号中内容da(``dab
删除圆括号中内容(包含括号)di{``diB
删除花括号中内容da{``daB
删除花括号中内容(包含括号)di[
删除方括号中内容da[
删除方括号中内容(包含括号)di"
删除引用中内容da"
删除引用中内容(包含引用符号)dit
删除标签中内容(html语言中tag)dat
删除标签中内容(包含标签)ciw
以此类推
重复上次改变
.
重复上次改变
字符编辑指令
x
删除光标所在的一个字符,类似dl
(delete letter)X
删除光标前一个字符. Like dhs
修改光标字符. 类似cl
(change letter)~
切换字符大小写
撤销和反撤销
u
撤销上次修改Ctrl-R
反撤销上次撤销{count}u
撤销上{count} 次修改
插入文本
i
进入插入模式,在当前光标前a
进入插入模式,在当前光标后I
进入插入模式,在行首A
进入插入模式,在行尾o
进入插入模式,在一行新建一行O
进入插入模式,在上一行新建一行gi
转到上次推出插入模式时位置Ctrl-H
在插入模式下,删除一个字符,也可以用退格。Ctrl-W
在插入模式下,删除一个单词。Ctrl-U
在插入模式下,删除一行。
可视模式
v
转到基于字符的可视模式V
转到基于行的可是模式Ctrl-V
转到基于块的可视模式,用来选择矩形区域的文本。{trigger visual mode}{motion}{operator}
可视模式和普通模式操作相反,需要先指定选择文本,然后应用操作。
下一个搜索位置的操作
{operator}gn
将操作应用到下一个搜索位置.
在使用{op}gn后, 重复操作会应用到下一个匹配位置,不需要使用n
来手动移动。
拷贝和粘贴
y{motion}
拷贝yank (copy) 被{motion}覆盖的文本p
粘贴(put ,paste) 到光标后P
粘贴到光标前yy
拷贝一行Y
同上yyp
复制一行ddp
交互一行xp
交换字符"ay{motion}
拷贝到寄存器a"Ay{motion}
拷贝并附加到寄存器a"ap
从寄存器a粘贴"
无名寄存器0
拷贝寄存器1-9
删除寄存器[a-z]
命名寄存器Ctrl-R a
在插入模式从寄存器a粘贴内容
命令行模式
:edit {file}``:e {file}
创建或者编辑文件:write``:w
保存文件:quit``:q
关闭文件:write!``:w!
强制保存文件:quit!``:q!
强制关闭文件,不保存:wq
保存并关闭:wall``:wa
保存所有文件:qall``:qa
关闭所有文件:wqall``:wqa
保存并关闭所有文件:qall!``:qa!
关闭所有文件,不保存:[range]delete [register]``:[r]d [r]
删除多行,放到寄存器@:
重复上次命令@@
再次重复
命令行模式范围
:{start},{end}
起始和结束行 e.g. :1,2d:{start},{offset}
起始和偏移行 e.g. :1,+2d.
代表当前行 e.g. :.,+2d%
代表整个文件 e.g. :%d0
文件开头 e.g. :0,10d$
文件结果 e.g. :10,$d:'<,'>
视觉选中状态下执行指令的默认值
command-line mode substitute
-
:[range]/{pattern}/{substitute}/[flags]
用匹配的模式替换给定范围内的字符串文字 -
g flag
替换一行中所有匹配 -
i flag
区分大小写 -
c flag
每处替换均需要确认
分割窗口
:sp {file}
水平分割,打开新文件:vsp {file}
垂直分割,打开新文件Ctrl-W S
水平分割,打开同一文件Ctrl-W V
垂直分割,打开同一文件Ctrl-W h
移动到左边分割窗口Ctrl-W j
移动到下边分割窗口Ctrl-W k
移动到上边分割窗口Ctrl-W l
移动到右边分割窗口
选项卡tab
:tabnew {file}
新tab中打开:tabnext``:tabn
跳到下一个tab:tabprev``:tabp
跳到上一个tab:tabonly``:tabo
关闭所有tab
vim包围操作
ds
删除包围符号 e.g. ds"cs
修改包围符号 e.g. cs*tem>ys
添加包围 e.g. ysiw"ds"
删除引用的包围cs*tem>
修改包围 * 为<em>
标签ysiw"
用引用将当前单词包围S
在可视模式,选择部分文本,然后使用S来添加包围。 比如,Stp>
来把选中内容用<p>
标签包围。
自定义映射(需要自行添加到配置)
插入模式
jk
返回普通模式,操作更加丝滑。
普通模式
J
一次向下移动5行K
一次向上移动5行<leader>j
合并行<leader>/
搜索时不高亮<leader>w
保存文件<leader>p
打开指令面板<leader>t
转到文件中符号<Ctrl-H>
移动到左边的窗口<Ctrl-J>
移动到下边的窗口<Ctrl-K>
移动到上边的窗口<Ctrl-L>
移动到右边的窗口<leader>tt
创建新tab<leader>tn
移动到下一个tab<leader>tp
移动到上一个tab<leader>to
删除所有tab,只保留当前
使用 vim-sneak快速移动
s{char}{char}
跳转到下一个匹配 {char}{char}位置S{char}{char}
跳转到上一个匹配 {char}{char}位置;
跳转到下一个匹配,
跳转到上一个匹配{op}z{char}{char}
将操作应用到文本遍历的所有{char}{char}位置
使用 easy-motion快速移动
<leader><leader>w
标记所有单词开头,光标之后<leader><leader>b
标记所有单词开头,光标之前<leader><leader>bdw
标记所有单词开头.bd
代表双向<leader><leader>e
标记所有单词结尾,光标之后<leader><leader>ge
标记所有单词结尾,光标之前<leader><leader>bdw
标记所有单词结尾<leader><leader>j
标记所有行开头<leader><leader>k
标记所有行开头<leader><leader>f{char}
标记找到的字符位置,光标之后<leader><leader>F{char}
标记找到的字符位置,光标之前<leader><leader>t{char}
标记找到的字符位置之前,光标之后<leader><leader>T{char}
标记找到的字符位置之前,光标之前<leader><leader>s{char}
标记找到的字符位置
多光标
搜索位置
<CMD-D>``<Ctrl-D>``gb
增加额外的光标,会进入可视模式。{operator}
将操作应用到所有光标处I
同时给多个单词前面插入A
同时给多个单词后面附加
连续行
<Ctrl-V>
转到可视模式,开始选择要操作的行{operator}
将操作应用到所有行I
同时在多行前面插入A
同时在多行后面附加
使用宏重编辑
q{register}
在 {register}中记录一个新的宏q
停止记录宏@{register}
执行{register}宏@@
重复执行上次执行过的宏
neovim集成
:[range]copy {address}
多行拷贝到 {address}:[range]move {address}
多行移动到{address}:[range]normal {commands}
多行执行普通模式指令:execute "{ex-command}"
执行字符串ex指令. 当指令包含特殊字符时使用。:[range]global/{pattern}/{command}
在所有匹配pattern的range行执行ex指令。默认range是整个文本。:[range]global!/{pattern}/{command}
在所有不匹配pattern的range行执行ex指令。默认range是整个文本。