Vim 让每一个键都拥有灵魂
Posted AAA啊哈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim 让每一个键都拥有灵魂相关的知识,希望对你有一定的参考价值。
本文
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, asymbol, isymbol |
symbol | 代表符号,例如 ‘’,’]’,’)’,’>’,”’,’”’,’`’,XML标签(例如:<xml> ) |
code | 字符编码(普通情况三位数字,例如 A 是 065)(ucode 可输入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 有名寄存器 |
范围文本对象 asymbol, isymbol
==================================
操作符后面跟的一个范围对象,例如 caw, ciw, daw, diw, vaw, viw
Keypress | Command |
---|---|
iw | 当前单词 |
iW | 当前字符串 |
is | 当前句子 |
ip | 当前段落 |
aw | 当前单词包括一个空格 |
aW | 当前字符串包括一个空格 |
as | 当前句子及一个空格 |
ap | 当前段落及一个空格 |
asymbol | 相对应符号之间的内容,包括符号 |
isymbol | 相对应符号之间的内容,不包括符号 |
vim 后台待命
Keypress | Command |
---|---|
<C-z> | 把当前 vim 置于后台待命 |
jobs | 查看当前后台待命的 vim 进程 |
fg | 唤起 vim 进程 |
重点-宏
qregister
把接下来的操作存入寄存器中,例如 qa,直到按 q 停止记录;
q大写的register
在该寄存器中把接下来的操作附加在已有的操作之后, 例如 qA,直到按 q 停止记录;
@register
把存入寄存器的操作,再次执行一遍, 接下来 按 @@ 可以重复执行这一操作;
不要记录无法重复的命令。
number@register
将该寄存器的操作重复执行 number次;
:rangenormal @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 | 插入模式(删除光标位置到单词结尾间的字符,并进入插入模式)(cnumberw) |
cb | 插入模式(删除光标的前一个位置到单词开始间的字符,并进入插入模式) |
“_dmotion | 删除对应内容,即把内容剪贴到一个黑洞寄存器里,相当于黑洞扔进去拿不回来了 |
dmotion | 剪贴对应内容 |
dd | 剪贴光标所在行 |
db | 剪贴光标的前一个位置到单词开始间的字符 |
dw | 剪贴光标位置到单词结束间的字符(dnumberw) |
daw | 剪贴光标所在的目标单词 |
dap | 剪贴光标所在的整个段落 |
e | 移动光标到本单词结尾或下一个单词结尾 |
ge | 移动光标到上一个单词结尾 |
numberG | 跳转到number行,不加数字则跳转到文本末尾 |
fchar | 查找行内下一处char出现的位置(;重复)(,回退) |
Fchar | 查找行内上一处char出现的位置(;重复)(,回退) |
/pattern | 在文档中查找下一处的匹配项(n重复)(N回退) |
/\\vpattern | 在文档中查找下一处的正则匹配项(n重复)(N回退) |
/\\v<pattern> | 在文档中查找下一处的匹配项(一个完整单词, 例如:/\\v<world> )(n重复)(N回退) |
/\\Vpattern | 在文档中查找下一处的原意匹配项(n重复)(N回退) |
?pattern | 在文档中查找上一处的匹配项(n重复)(N回退) |
ga | 查看当前字符的编码 |
gv | 重选上次的高亮选择区域 |
gUmotion | 大些对应字符 |
ngt | 跳到第n个标签页,省略n则向右切换标签页 |
gT | 向左切换标签页 |
h | 光标移动到同行上一列 |
j | 光标移动到同列下一行 |
gj | 把光标移动到屏幕下一行(这里有个实际行和屏幕行的概念区别) |
J | 把下一行拼接在当前行后面 |
k | 光标移动到同列上一行 |
gk | 把光标移动到屏幕上一行(这里有个实际行和屏幕行的概念区别) |
l | 光标移动到同行下一列 |
L | 跳转到屏幕最下 |
M | 跳转到屏幕最上方 |
mm | 标记当前位置 |
`m | 跳转到标记为m的位置 |
`. | 跳转到上次修改的地方 |
“ | 跳转到上次跳转动作之前的位置 |
% | 在 () , ,[] 左右两个括号跳转 |
H | 跳转到屏幕最上方 |
i | 插入模式(当前光标所在位置) |
I | 插入模式(当前行开始位置) |
R | 替换模式(从当前光标位置开始)(gR 虚拟替换模式,把制表符当作空格处理) |
s | 插入模式(删除当前位置字符并在当前位置插入) |
S | 插入模式(删除当前段落内容并插入) |
tchar | 查找行内下一处char出现的位置,并把光标移动到该位置的前一个字符(;重复)(,回退) |
Tchar | 查找行内上一处char出现的位置,并把光标移动到该位置的后一个字符(;重复)(,回退) |
o | 插入模式(在本行下面插入一行空行并进入插入模式) |
O | 插入模式(在本行上面插入一行空行并进入插入模式) |
p | 粘贴相应内容到下一行,前面可加寄存器标志register来粘贴不同寄存器的内容 |
P | 粘贴相应内容到上一行,前面可加寄存器标志register来粘贴不同寄存器的内容 |
gp | 粘贴相应内容到下一行,光标在复制文本的末尾,前面可加寄存器标志register来粘贴不同寄存器的内容 |
gP | 粘贴相应内容到上一行,光标在复制文本的末尾,前面可加寄存器标志register来粘贴不同寄存器的内容 |
u | 撤销上次修改 |
v | 进入字符可视模式 |
vasymbol | 进入可视模式并选择相对应符号之内的内容,包括符号 |
visymbol | 进入可视模式并选择相对应符号之内的内容,不包括符号 |
V | 进入行可视模式 |
<C-v> | 进入块可视模式 |
w | 光标移动到下一个单词的开头 |
W | 光标移动到下一个字符串的开头(每个字符串以空格或换行间隔) |
x | 剪贴光标下的字符 |
ymotion | 复制对应内容,可以前面加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>u1234 | 以十六进制字符编码插入字符,1234代表四位数字 |
<C-v>非数字字符 | 按原义插入非数字字符 |
<C-k>charchar | 插入以二合字母charchar表示的字符,例如 ?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 | 光标跳转到该行行首 |
:numberd | 删除第number行 |
:join | 使下一行拼接在本行后面 |
:p | 显示本行内容 |
:0 | 文件开头 |
:1 | 文件到第一行 |
:$ | 文件的最后一行 |
:rangetaddress | 把range复制到address行之后,range不写就代表本行 |
:rangemaddress | 把range移动到address行,range不写就代表本行 |
:rangenormal 普通命令 | 在连续range包含的行上执行一条普通命令 |
:rangesubstitute/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)个子匹配 |
\\0 | 插入匹配模式的所有内容 |
& | 插入匹配模式的所有内容 |
~ | 使用上一个替换域的内容 |
\\=@register | 使用寄存器中的内容 |
查找域pattern | Command |
---|---|
(空) | 使用上一次的匹配模式 |
使用 g&
在整个文件范围内,重复上一条替换命令, 相当于执行 :%s//~/&
:range&&
在 range(为空时范围即本行) 范围内,执行上一条替换命令
global 命令
==================================
[range]global[!]/pattern/[cmd]
:global
(:g)在指定模式的所有匹配行上运行Ex命令, ! 指反转命令
:vglobal
(:v)指命令反转
查找域pattern | Command |
---|---|
(空) | 使用上一次的匹配模式 |
命令[cmd] | Command |
---|---|
(空) | 默认使用 :print |
可视模式
==================================
面向字符的可视模式(在普通/可视模式下输入 v 进入)
面向行的可视模式(在普通/可视模式下输入 V 进入)
面向块的可视模式(在普通/可视模式下输入 <C-v>
进入)
Keypress | Command |
---|---|
<C-[> | 等同,切换回普通模式 |
v | 面向字符的可视模式 |
V | 面向行的可视模式 |
<C-v> | 面向块的可视模式 |
o | 切换至高亮的两端 |
U | 大写选中内容 |
u | 小写选中内容 |
命令行窗口
==================================
可以在中间加 | 来同时执行多个命令
Keypress | Command |
---|---|
q: | 打开展示 Ex 命令历史的命令行窗口 |
q/ | 打开展示查找命令(例:/afra ,查找 ‘afra’ )历史的命令行窗口 |
:q | 关闭命令行窗口 |
<C-f> | 从命令行模式切换到命令行窗口 |
后话
vim 入门级别的小结,不管咋样,都有收获。
以上是关于Vim 让每一个键都拥有灵魂的主要内容,如果未能解决你的问题,请参考以下文章