学习vim最主要的目的还是提高代码效率,学习编程中最重要的还是编程的思考,所以手下功夫一定不能耽误思维的流畅。
本人主要从事游戏开发,以VSCode、VisualStudio、Rider为主,虽然之前已经对编辑器自身的快捷键很熟悉了,但是在编辑代码上的效率还是不满意,索性就开始学习“神之编辑器”。
从两个方向去学习vim命令
1. 从vim命令本身的结构去学习
2. 从编程中常用的操作流程去实践
vim基本结构
vim基本分为4个基本模式,普通模式
,插入模式
,可视模式
,命令模式
。 4个模式之间相关跳转完成编辑。
- 普通模式,默认模式,移动、复制、粘贴、删除、替换、屏幕滚动等操作时使用。
- 插入模式,输入文本使用。
- 可视模式,用来选择文字的模式,有以
字符
、行
、块
为单位。 - 命令模式输入vim提供的指令来完成相关操作。
模式下跳转
- 进入普通模式
按ESC
退回到普通模式。 - 进入命令模式
在非插入模式下按:
进入命令模式。 - 进入选择模式
v
:文字选择模式。V
:行选择模式。<Ctl> + v
块选择模式。
- 进入选择模式
i/I
前/最前 插入;a/A
后/最后 插入;o/O
下/上行 插入;c + 命令(比如方向)
删除插入;s/S/C
删除当前字符
/整行
/当前字符到行尾
插入;
要与
sround
模式和sneak
模式区分;
核心操作
移动
行移动
根据常用程度排名
hjkl
左下上右w/W
下一个单词b/B/e/E
词头词尾^/$
名首/句尾0
行首
括号内容移动
[{
、]}
跳转函数体最上最下括号
<Ctl>+o/i
上一个(older)/下一个光标位置
%
匹配括号跳转
for(int i=0;i<20;i++)
{
for(int i=0;i<20;i++)
{
int a = 0;
int a++;
int a--;
}
}
<Ctrl + a>
数字+1
<Ctrl + x>
数字-1
替换模式
R/gR
进入替换模式(替换后面的字符),推荐gR。
r/gr
处理一个字符的替换,返回普通模式。
2. 可视模式下
I
进入 插入;
o
切换移动点
3. 插入模式下
<C h>
删除前一个字符
<C w>
删除前一个单词
<C u>
删除至行首
<C j>
自动补全向下找
<C e/y>
复制同列的下/上行
<C n/p>
自动补全向下/上找(next/pre)
<C t/d>
向右/左缩进
<C r>
将寄存器的内容粘贴到光标所在的位置
<C k>
插入以二合字母表示的字符。
这个模式允许执行一次普通模式命令,执行完后回到插入模式。
<C o>
进入“插入-普通模式”。
<C o>
zz 把当前行置于窗口正中,这个经常用。
<C [>
退出到普通模式==
定位与查找
f/F/t/T: (find) (to)
形式:Num f Char
f
找到(find)该字符,也就是光标在该字符
t
到达(to)该字符,也就是光标到该字符跟前
;
重复执行命令
ss
在打开sn
ss
#
,*
(shift+3/8)查找上/下一个光标所在相同的单词
D 删除当前到末尾
在块模式下按I(大写i),可进入多光标情况
ia
vib/vi(
(选中()
内的内容)
viB/vi{
(选中{}
内的内容)
vi"
(选中"
内的内容)
vi'
(选中'
内的内容)
vi<
(选中<>
内的内容)
vis 选中一个句子
vib 选中一个block
viw 选中一个单词
vip 选中一个段落
~
大小写互相转换
U/u
可视模式下所选改为大/小写
gU/u
+ iw/aw/w/e....
gUU/guu
当前行大/小写
视觉模式下
[]ii选中函数体
删除
d/word 删除到word前 Exp: d/;
重复类型 | 重复操作符 | 回退操作符 |
---|---|---|
文本改变重复 | . | u |
行内查找重复 | ; | , |
全文查找重复 | n | N |
复制完单词
/<Ctrl+R>0
查找寄存器上的单词
查看寄存器中的内容::reg
exp:10a!<esc>
数字+a/i+字符串+esc 连续输入10个相同人字符串
asdfj asdfsadf
命令模式下命令流
hello world
Old text | Command | New text |
---|---|---|
"Hell3 *world!" | ds" | Hello world! |
[123+4*56]/2 | cs]) | (123+456)/2 |
"Look ma, I'm *HTML!" | cs"<q> | <q>Look ma, I'm HTML!</q> |
if *x>3 { | ysW( | if ( x>3 ) { |
my $str = *whee!; | vlllls' | my $str = 'whee!'; |
<div>Yo!*</div> | dst | Yo! |
<div>Yo!*</div> | cst<p> | <p>Yo!</p> |
ci: 例如,ci(,或者ci),将会修改()之间的文本;
di: 剪切配对符号之间文本;
yi: 复制;
ca: 同ci,但修改内容包括配对符号本身;
da: 同di,但剪切内容包括配对符号本身;
ya: 同yi,但复制内容包括配对符号本身。
PS. dib等同于di(。diB等同于di{。
ci[ ci( ci( ci{
删除一对 [], (), <>, 或{} 中的所有字符并进入插入模式
ci” ci’ ci删除一对引号字符 ” ‘ 或
中所有字符并进入插入模式
cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
- 删除 复制 粘贴
x
deleteX
退格- dd 删除当前行
- d+0/$ 删到 行首/尾
- yy 复制行
- p 下行粘贴 P 上行粘贴
- J 本行下行合并
- 移动
- hjkl 移动一下
- xxx+hjkl 重复移动xxx次
- 0 行首
- $ 行尾
- g_ 非空格行尾
- gg 页首
- G 页尾
- xxx+G 定位到行号
- xxx
<Enter>
向下移动xxx行
- 搜索替换
/world 找world
?world 向上找world
n N 向下向上找
:n1/n2s/word1/word2/g 替换
:1,$s/... 全页替换
:%s/... 同上
底线命令模式
:q
quit退出:w
保存:open xx.xx
打开xx.xx
标记与到达标记
ma 设置此处为标记a
'a
到达标记a行行首
`a
到达当时标记位置的地方
切换窗口
ctrl + ww
切换窗口
ctrl + w <h|j|k|l>
切换到这个方向的窗口
R
可以临时进入替换一直更改
w
下个单词头
b
上个单词头
e
这个单词尾
v + w/b/e/h/j/k/l/$/0
选择
y/p
复制/粘贴
x/d
删除/剪切
vscode&vim对比
快捷命令 | vscode | vim |
---|---|---|
上下复制 | Alt+shift+上/下 | yyp/P |
上下新建行 | ctrl+(shift)+enter | o/O |
选中一个单词 | ctrl + d | viw |
系统剪切板 | ctrl+c/v | "+ |
删除当前行 | ctrl+shift+k | dd |
跨越单词 | ctrl + 左右 | web |
gd - Go to definition, 跳转到定义。
gb - 找出与光标下相同的下一个单词, 并添加一个光标 ,接下来就可以同时修改。
af - VISUAL 模式命令, 依据语法分析, 将选择区域向外扩展。
gh - 等同于将鼠标移至光标所在单词, 方便查看定义以及报错。
Surround 模式
https://github.com/tpope/vim-surround
普通模式下Normal mode
ds<k1>
- 删除当前对称符号 k1 delete a surrounding
cs<k1><k2>
- 改变堆成符号 k1 到 k2 change a surrounding
ys<ctr><k1>
- exp:ysaw' 当前单词加 k1 符号
yss<k1>
- 整行加 k1
视觉模式 Visual mode
S<k1>
- 加符号
ci
cis
改变句子
重要命令
y
yank 提起
p
paster 粘贴
a
append 追加
i
insert 插入
s
substitute 替换
Append,Insert,Replace,Subsitute
AIRS
小写表示characterwise(字符)
linewise(行)
5yl
复制光标后的5个字符(包括光标所在的那个字符)
5yh
复制光标前的五个字符(不包括光标所在的那个字符)
5dl
删除光标后的5个字符(包括光标所在的那个字符)
5dh
删除光标前的5个字符(不包括光标所在的那个字符)
命令模式
例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令
输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。
http://c.biancheng.net/view/519.html
S:删除光标所在行并开始插入
s:删除光标所在的字符并开始插入
==排版
替换
:s/old/new #替换当前行的第一个old为new
:s/old/new/g #替换当前行的所有的old为new
:.,$s/old/new #替换当前行到最后行的第一个old为new
:.,$s/old/new/g #替换当前行到最后行的所有old为new
:N,Ms/old/new #替换第N行到第M行的第一个old为new
:N,Ms/old/new/g #替换第N行到第M行的所有old为new
:N,Ms/old/new/gc #替换第N行到第M行的所有old为new,且逐一询问是否删除
:%s/old/new #替换所有行的第一个old为new
:%s/old/new/g #替换所有行的所有old为new
查找
/x_x 查找x_x
/\Cx_x 区分大小写的查找
/\cx_x 不区分大小写的查找(不常用)
/\bx_x\b 精确查找(正则方式)
光标横向移动
光标纵向移动
ctrl + b
向上移动一屏
ctrl + f
向下移动一屏
ctrl + e
向上滚动一行
ctrl + y
向下滚动一行
H
当前屏幕顶 high
M
中 middle
L
低 low
gg
跳到文件开头
G
跳到文件结尾
Numgg/G
跳到Num行
Num%
移动到文档在百分之Num
ctrl + f/b
相当于PageUp/PageDown
屏幕移动
zz
光标所在行移动到屏幕 中
zt
顶
zb
低
ctrl + u
向上移动半屏
ctrl + d
向下移动半屏
http://www.cnblogs.com/onlyfu/p/5046910.html
在插入模式下ctrl + o 临时进入命令模式
url:
http://www.cnblogs.com/moiyer/archive/2010/04/01/1952681.html
vim normal模式下
1、c+i+分隔符,删除分隔符里面的内容(不删除分隔符,c+a+分隔符则包括分隔符一起删掉)
如将光标位于'%s : %d years old ' 中,此时按c+i+' ?则可以将'%s : %d years old ' 变为' '
vickey-wu = 'vickey-wu'
例句:print '%s : %d years old ' % (vickey-wu,23)
结果:print ''
我个人记的方法c:change,i:ignore,a:all
2、y+i+分隔符,y在vim是复制,与上面的同理,表示复制分隔符里面的内容(不复制分隔符,y+a+分隔符则包括分隔符一起复制)
https://www.jianshu.com/p/41c759d543b7
进阶
https://www.jianshu.com/p/cbfa86c8d8a5
gp,和p的功能基本一致,只是粘贴完,它会把光标移动至粘贴内容之后;gP同理
https://www.cnblogs.com/yangjig/p/6014198.html
di{ 删除{}内
ds{ 删除{}边
da{ 删除{}内+边
VIM-缩进对象
<operator>
默认指<
/>
缩进的默认
<operator>ii
这个缩进级别
<operator>ai
这个缩进级别和上面的行(想想ifPython中的语句)
<operator>aI
这个缩进级别,上面的行和后面的行(想想ifC / C ++ / Java /等中的语句)
中级篇
开启自动模式-宏操作(macro)
自动化处理喽,使用宏来记录一段的操作,然后可以对这个操作进行重复使用。
首先要对这个宏起个名字,只有一个字符,
取名范围:0~9a~z".=*+
命令 | 效果 |
---|---|
qx | 开始录制x 宏命令 |
q | 停止录制 |
数字N @x | 执行宏x 命令N 遍 |
开外挂吧-vim插件
有很多很方便的功能,几乎成了现在人们使用vim
的标配,只是这些是以前人们创造的插件
,为了让我们事半功倍,开外挂吧。
sneak 蛇插件
不管是写文章还是代码,在一行里,我们想要定位到自己要找的位置时,会使用fFtT
命令。
但是一行中,重复的字符太多,有时找到可以需要重复好次定位操作,要么找个比较接近的后,再使用移动来定位。
这样不仅操作频繁,有时大脑还要思考策略,从在降低我们码字效率。
由是我们的好帮手出现了。
将原来的s
:删除字符切换到插入模式,修改为输入两个字符,然后跳转到首字符上。
大定S
同理,只是方向向后
搜索。
surround 包裹利器
easymotion 轻松位移
在整个页面之间跳转是很费劲了,一级一级,一行一行,最后行内定位。
使用使用这个插件可以,直接进行定位。
这里需要用到leader
键,默认为\
,建议换为,
,方便操作。
假设leader
键就是,
的话,,,
激活模式,然后使用跳转命令来操作,可能跳转的地方都标记为红色,其他地方为灰色。
命令 | 效果 |
---|---|
,, | 字符,标注hjkl 可能的位置 |
,, | 单词,标注wWbBeEgegE 可能的位置 |
,, | 输入1 个字符定位,标注fFtT 可能的位置 |
,,2 | 与上相同,只是输入2 个字符定位 |
评论