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 使用 / 搜索时,进行实时预览

名词简介

==================================

KeypressCommand
l一个字符
awa 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


KeypressCommand
iw当前单词
iW当前字符串
is当前句子
ip当前段落
aw当前单词包括一个空格
aW当前字符串包括一个空格
as当前句子及一个空格
ap当前段落及一个空格
asymbol相对应符号之间的内容,包括符号
isymbol相对应符号之间的内容,不包括符号

vim 后台待命

KeypressCommand
<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)


KeypressCommand
c修改
d删除
y复制到寄存器
~大/小写光标下大字符
g~反转大小写
gU转换为大写
gu转换为小写
>增加缩进
<减小缩进
=自动缩进
!使用外部程序过滤motion所跨越的行

=========================

普通模式


KeypressCommand
.重复上次修改
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> 会退到之前的位置

插入模式

==================================

KeypressCommand
<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


KeypressCommand
: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]


标志位flagsCommand
g让命令可以在全局范围进行操作,即替换当前实际行的所有匹配项
c让我们自己决定每一处匹配项是否进行替换(y 替换;n 忽略;q 退出替换模式;l 替换此位置后退出;a 替换此处和之后所有匹配项;<C-e> 向上滚动屏幕;<C-y> 向下滚动屏幕)
n不执行替换操作,只提示匹配的个数
e屏蔽匹配错误提示
&重用上一次使用的标志位
替换域stringCommand
\\r插入换行符
\\t插入制表符
\\\\插入反斜杠
\\number插入第number(0-9)个子匹配
\\0插入匹配模式的所有内容
&插入匹配模式的所有内容
使用上一个替换域的内容
\\=@register使用寄存器中的内容
查找域patternCommand
(空)使用上一次的匹配模式

使用 g& 在整个文件范围内,重复上一条替换命令, 相当于执行 :%s//~/&
:range&& 在 range(为空时范围即本行) 范围内,执行上一条替换命令

global 命令

==================================

[range]global[!]/pattern/[cmd]
:global (:g)在指定模式的所有匹配行上运行Ex命令, ! 指反转命令
:vglobal (:v)指命令反转

查找域patternCommand
(空)使用上一次的匹配模式
命令[cmd]Command
(空)默认使用 :print

可视模式

==================================

面向字符的可视模式(在普通/可视模式下输入 v 进入)
面向行的可视模式(在普通/可视模式下输入 V 进入)
面向块的可视模式(在普通/可视模式下输入 <C-v> 进入)


KeypressCommand
<C-[>等同,切换回普通模式
v面向字符的可视模式
V面向行的可视模式
<C-v>面向块的可视模式
o切换至高亮的两端
U大写选中内容
u小写选中内容

命令行窗口

==================================

可以在中间加 | 来同时执行多个命令


KeypressCommand
q:打开展示 Ex 命令历史的命令行窗口
q/打开展示查找命令(例:/afra,查找 ‘afra’ )历史的命令行窗口
:q关闭命令行窗口
<C-f>从命令行模式切换到命令行窗口

后话

vim 入门级别的小结,不管咋样,都有收获。

以上是关于Vim 让每一个键都拥有灵魂的主要内容,如果未能解决你的问题,请参考以下文章

1. VIM 系列 - 简单入门,拾起兴趣

vim基础命令

VIM学习总结

vim工具(下)

vim编辑器初级

vim模式-命令行模式