本文
Vim 几乎将键盘上的每一个键都赋予了灵魂。 http://afra55.github.io/2017/09/14/vim-lover/
插件
https://github.com/tpope/vim-pathogen
https://github.com/tpope/vim-commentary
https://github.com/kana/vim-textobj-entire
vimrc通用配置
编辑 .vimrc 添加 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 添加 cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h'). '/' :'%%' 添加 set history=200 添加 set incsearch 使用 / 搜索时,进行实时预览
名词简介
==================================
Keypress |
Command |
l |
一个字符 |
aw |
a word,文本对象 |
ap |
一整个段落 |
{motion} |
例如:l,aw,ap,a{symbol},i{symbol} |
{symbol} |
代表符号,例如 ‘}’,’]’,’)’,’>’,”’,’”’,’`’,XML标签(例如:<xml> ) |
{code} |
字符编码(普通情况三位数字,例如 A 是 065)(u{code} 可输入unicode 编码,例如 ? 是 u00bf) |
<C-a> |
Control键 + a键 |
连续两次命令 |
作用于本行,例如:gUU,guu,dd |
:{start},{end} |
第{start}行到第{end}行 |
:. |
代表当前行 |
:% |
代表所有行 |
:'<,'> |
代表高亮选区 |
:/{start}/,/{end}/ |
{start}标签所在行到{end}标签所在行,内容如果有特殊字符则需要转义 |
{range} |
代表范围,一行,一块,一个等 |
{address} |
代表地址,一行,一块,一个等 |
{n} |
代表数字 |
|
table 制表符键 |
{register} |
寄存器,例如”+ 系统剪贴板,“0 专用寄存器,“a-“z 有名寄存器 |
范围文本对象 a{symbol},i{symbol}
==================================
操作符后面跟的一个范围对象,例如 caw,ciw,daw,diw,vaw,viw
Keypress |
Command |
iw |
当前单词 |
iW |
当前字符串 |
is |
当前句子 |
ip |
当前段落 |
aw |
当前单词包括一个空格 |
aW |
当前字符串包括一个空格 |
as |
当前句子及一个空格 |
ap |
当前段落及一个空格 |
a{symbol} |
相对应符号之间的内容,包括符号 |
i{symbol} |
相对应符号之间的内容,不包括符号 |
vim 后台待命
Keypress |
Command |
<C-z> |
把当前 vim 置于后台待命 |
jobs |
查看当前后台待命的 vim 进程 |
fg |
唤起 vim 进程 |
重点-宏
q{register} 把接下来的操作存入寄存器中,例如 qa,直到按 q 停止记录; q{大写的register} 在该寄存器中把接下来的操作附加在已有的操作之后,例如 qA,直到按 q 停止记录; @{register} 把存入寄存器的操作,再次执行一遍,接下来 按 @@ 可以重复执行这一操作;
不要记录无法重复的命令。
{number}@{register} 将该寄存器的操作重复执行 {number}次;
:{range}normal @{register} 在{range}范围内的每一行上执行 {register} 里存储的操作;
:reg {register} 可以查看存储在 {register} 中的操作
普通模式
==================================
操作符命令举例(后面跟{motion})
Keypress |
Command |
c |
修改 |
d |
删除 |
y |
复制到寄存器 |
~ |
大/小写光标下大字符 |
g~ |
反转大小写 |
gU |
转换为大写 |
gu |
转换为小写 |
> |
增加缩进 |
< |
减小缩进 |
= |
自动缩进 |
! |
使用外部程序过滤{motion}所跨越的行 |
=========================
普通模式
Keypress |
Command |
. |
重复上次修改 |
G
|
增加光标所在行到文档末尾的缩进层级 |
0 |
光标移动到本行行首 |
g0 |
光标移动到本行行首 |
^ |
光标移动到本实际行的第一个非空字符 |
g^ |
光标移动到本屏幕行的第一个非空字符 |
$ |
光标移动到本行末尾 |
g$ |
光标移动到本屏幕行末尾 |
a |
插入模式(当前光标位置之后) |
A |
插入模式(当前行末尾) |
b |
光标移动到上一个单词的开头 |
c |
插入模式(删除当前位置字符,并在当前位置进行插入,按下c之后再按字符会触发其他命令,比如 cw) |
C |
插入模式(删除当前位置到本行结尾的内容并在当前位置插入) |
cw |
插入模式(删除光标位置到单词结尾间的字符,并进入插入模式)(c{number}w) |
cb |
插入模式(删除光标的前一个位置到单词开始间的字符,并进入插入模式) |
“_d{motion} |
删除对应内容,即把内容剪贴到一个黑洞寄存器里,相当于黑洞扔进去拿不回来了 |
d{motion} |
剪贴对应内容 |
dd |
剪贴光标所在行 |
db |
剪贴光标的前一个位置到单词开始间的字符 |
dw |
剪贴光标位置到单词结束间的字符(d{number}w) |
daw |
剪贴光标所在的目标单词 |
dap |
剪贴光标所在的整个段落 |
e |
移动光标到本单词结尾或下一个单词结尾 |
ge |
移动光标到上一个单词结尾 |
{number}G |
跳转到{number}行,不加数字则跳转到文本末尾 |
f{char} |
查找行内下一处{char}出现的位置(;重复)(,回退) |
F{char} |
查找行内上一处{char}出现的位置(;重复)(,回退) |
/pattern |
在文档中查找下一处的匹配项(n重复)(N回退) |
/v{pattern} |
在文档中查找下一处的正则匹配项(n重复)(N回退) |
/v<pattern> |
在文档中查找下一处的匹配项(一个完整单词,例如:/v<world> )(n重复)(N回退) |
/V{pattern} |
在文档中查找下一处的原意匹配项(n重复)(N回退) |
?pattern |
在文档中查找上一处的匹配项(n重复)(N回退) |
ga |
查看当前字符的编码 |
gv |
重选上次的高亮选择区域 |
gU{motion} |
大些对应字符 |
{n}gt |
跳到第{n}个标签页,省略{n}则向右切换标签页 |
gT |
向左切换标签页 |
h |
光标移动到同行上一列 |
j |
光标移动到同列下一行 |
gj |
把光标移动到屏幕下一行(这里有个实际行和屏幕行的概念区别) |
J |
把下一行拼接在当前行后面 |
k |
光标移动到同列上一行 |
gk |
把光标移动到屏幕上一行(这里有个实际行和屏幕行的概念区别) |
l |
光标移动到同行下一列 |
L |
跳转到屏幕最下 |
M |
跳转到屏幕最上方 |
mm |
标记当前位置 |
`m |
跳转到标记为m的位置 |
`. |
跳转到上次修改的地方 |
“ |
跳转到上次跳转动作之前的位置 |
% |
在 () ,{} ,[] 左右两个括号跳转 |
H |
跳转到屏幕最上方 |
i |
插入模式(当前光标所在位置) |
I |
插入模式(当前行开始位置) |
R |
替换模式(从当前光标位置开始)(gR 虚拟替换模式,把制表符当作空格处理) |
s |
插入模式(删除当前位置字符并在当前位置插入) |
S |
插入模式(删除当前段落内容并插入) |
t{char} |
查找行内下一处{char}出现的位置,并把光标移动到该位置的前一个字符(;重复)(,回退) |
T{char} |
查找行内上一处{char}出现的位置,并把光标移动到该位置的后一个字符(;重复)(,回退) |
o |
插入模式(在本行下面插入一行空行并进入插入模式) |
O |
插入模式(在本行上面插入一行空行并进入插入模式) |
p |
粘贴相应内容到下一行,前面可加寄存器标志{register}来粘贴不同寄存器的内容 |
P |
粘贴相应内容到上一行,前面可加寄存器标志{register}来粘贴不同寄存器的内容 |
gp |
粘贴相应内容到下一行,光标在复制文本的末尾,前面可加寄存器标志{register}来粘贴不同寄存器的内容 |
gP |
粘贴相应内容到上一行,光标在复制文本的末尾,前面可加寄存器标志{register}来粘贴不同寄存器的内容 |
u |
撤销上次修改 |
v |
进入字符可视模式 |
va{symbol} |
进入可视模式并选择相对应符号之内的内容,包括符号 |
vi{symbol} |
进入可视模式并选择相对应符号之内的内容,不包括符号 |
V |
进入行可视模式 |
<C-v> |
进入块可视模式 |
w |
光标移动到下一个单词的开头 |
W |
光标移动到下一个字符串的开头(每个字符串以空格或换行间隔) |
x |
剪贴光标下的字符 |
y{motion} |
复制对应内容,可以前面加{register}标志字符(“+ 系统剪贴板,“0,“a-“z)来复制到不同寄存器中 |
yy |
复制光标所在行 |
zz |
把当前行滚动至屏幕中央 |
* |
在文档中查找当前目标单词(n重复)(N回退) |
{number}<C-a> |
光标所在数字字符加上{number},当{number}为空时,进行加1操作(如果光标没在数字字符上会正向查找并移动光标到数字字符上) |
{number}<C-x> |
光标所在数字字符减掉{number},当{number}为空时,进行减1操作(如果光标没在数字字符上会正向查找并移动光标到数字字符上) |
<C-w>s |
水平切分当前窗口 |
<C-w>v |
垂直切分当前窗口 |
<C-w>w |
循环切换窗口 |
<C-w>h |
切换到左边的窗口 |
<C-w>j |
切换到下边的窗口 |
<C-w>k |
切换到上边的窗口 |
<C-w>l |
切换到右边的窗口 |
<C-w>= |
令所有窗口等宽高 |
<C-w>_ |
最大化活动窗口的高度 |
` |
` |
{N}<C-w>_ |
把活动窗口的高度设置为 {N} 行 |
`{N} |
` |
( |
跳转到上一句的开头 |
) |
跳转到下一句的开头 |
{ |
跳转到上一段的开头 |
} |
跳转到下一段的开头 |
<C-]> |
跳转到当前光标所在单词的声明处(代码可用),可按下 <C-t> 会退到之前的位置 |
插入模式
==================================
Keypress |
Command |
<C-h> |
删除前一个字符 |
<C-w> |
删除前一个单词 |
<C-u> |
删至首行 |
<C-[> |
等同,切换回普通模式 |
<C-o> |
切换到 插入-普通模式(即切换到普通模式后,执行一个操作又回到插入模式) |
<C-r>{register} |
粘贴相应寄存器在当前光标之前,寄存器直接跟字符不用再加” |
<C-p>{register} |
粘贴 |
<C-v>{123} |
以十进制字符编码插入字符,{123}代表三位数字 |
<C-v>u{1234} |
以十六进制字符编码插入字符,{1234}代表四位数字 |
<C-v>{非数字字符} |
按原义插入非数字字符 |
<C-k>{char}{char} |
插入以二合字母{char}{char}表示的字符,例如 ?I 代表 ? |
Ex模式
==================================
Ex模式(按 <tab> 键自动补全命令,<C-d> 显示可用的补全列表,个人习惯补全设置 :set wildmode=longest,list )
Keypress |
Command |
:s/{target}/{replacement} |
替换当前行 {target} 为 {replacement} (&重复)(u回退) |
:%s/{target}/{replacement}/g |
替换所有 {target} 为 {replacement} |
:h digraph-table |
查看二合字母列表 |
:tabnew |
创建新标签页 |
:{number} |
光标跳转到该行行首 |
:{number}d |
删除第{number}行 |
:join |
使下一行拼接在本行后面 |
:p |
显示本行内容 |
:0 |
文件开头 |
:1 |
文件到第一行 |
:$ |
文件的最后一行 |
:{range}t{address} |
把{range}复制到{address}行之后,{range}不写就代表本行 |
:{range}m{address} |
把{range}移动到{address}行,{range}不写就代表本行 |
:{range}normal {普通命令} |
在连续{range}包含的行上执行一条普通命令 |
:{range}substitute/{pattern}/{string}/[flags] |
substitute 缩写是 s,把{range}范围内{pattern}出现的地方替换为{string} |
@: |
重复上次操作 |
<C-r><C-w> |
把光标所在单词插入到命令行 |
:!{commond} |
执行 shell 命令 |
:!shell |
启动 shell 交互窗口 |
:sp {file} |
水平切分此窗口 |
:vsp {file} |
垂直切分此窗口 |
:close |
关闭窗口 |
:tabclose |
关闭当前标签页 |
:tabonly |
关闭其他标签页 |
:only |
关闭除当前活动窗口外的其他窗口 |
:tabedit {filename} |
在新标签页中打开 {filename},可省略 {filename} 打开一个空白标签页 |
:pwd |
打印工作目录 |
:edit {file} |
打开文件 |
:find {file} |
打开文件 |
:vimgrep //g % |
把上一个匹配命令(/ 命令)的所有匹配项放到 quickfix 列表中 |
:cnext |
正向遍历 quickfix 列表 |
:cprev |
反向遍历 quickfix 列表 |
substitute 替换命令
==================================
:[range]s[ubstitute]/{pattern}/{string}/[flags]
标志位{flags} |
Command |
g |
让命令可以在全局范围进行操作,即替换当前实际行的所有匹配项 |
c |
让我们自己决定每一处匹配项是否进行替换(y 替换;n 忽略;q 退出替换模式;l 替换此位置后退出;a 替换此处和之后所有匹配项;<C-e> 向上滚动屏幕;<C-y> 向下滚动屏幕) |
n |
不执行替换操作,只提示匹配的个数 |
e |
屏蔽匹配错误提示 |
& |
重用上一次使用的标志位 |
替换域{string} |
Command |
r |
插入换行符 |
t |
插入制表符 |
|
插入反斜杠 |
{number} |
插入第{number}(0-9)个子匹配 |
| |