Vim语法及插件
- 常用
- `Normal`模式
- 移动
- 删除
- 修改
- 查找
- 复制粘贴
- 撤销
- `Insert`模式
- 复制粘贴
- `CMD`模式
- 替换
- `Visual`模式
- 多文件间的转换
- Buffer
- Window
- Tab
- 文本对象
- 宏
- 补全
常用
课程链接
Vim
中的指令可以灵活组合使用
:help
查找文档
切换为后台Ctrl + z;切换为前台fg
Ctrl + D打开候选列表
Normal
模式
进入Vim
,默认Normal
模式或使用Esc进入Normal
模式
移动
单词间移动
移动到下一个word
/WORD
开头 w
/ W
(移动到下一个word
/WORD
结尾 e
/ E
)
移动到上一个word
/WORD
开头 b
/ B
word
是指以非空白符分割的单词,WORD
是指以空白符分割的单词。
行间搜索移动
使用 f{char}
可以移动到{char}
字符上,t{char}
移动到{char}
字符的前一位字符
多个{char}
间的切换用;
/ ,
表示下一个 / 上一个
f
搜索到光标与行尾间的字符,F
搜索到光标与行首间的字符。
行间快速移动
0
移动到行首第一个字符,使用0w
起到和^
相同的作用(^
移动到行首第一个非空白字符)
$
移动到行尾(g_
移动到行尾非空白字符)
页面移动
gg
/ G
移动到文件的开头 / 结尾,ctrl + o
快速返回
移动到屏幕的开头H
(head),中间M
(middle),结尾L
(lower)
Ctrl + u
/ Ctrl + f
上(upword) / 下(forward)翻页
zz
调整当前行到屏幕中间
:n
跳转到第n
行
删除
x
或 d
删除选中部分,x
可以用在一个字符上直接删除,d
属于删除指令,要删除一个字符,需要dl
dw
删除光标到单词的结尾,diw
删除光标所在的单词,dd
删除光标所在行,D
删除所在行光标之后的所有词
dt{char}
删除光标到{char}
的所有字符
d0
删除到行首,d$
删除到行尾
2dd
删除两行,4x
删除四个字符。数字+命令
表示多次重复。
ggdG
清空屏幕
.
模仿上一次删除操作
修改
r
(replace) 替换一个字符,保持Normal
模式; R
替换多个字符,保持Normal
模式
s
(subtitute) 删除当前字符,并进入Insert
模式;S
删除当前行,并进入Insert
模式
c
(change)
cw
删除单词,并进入Insert
模式;C
删除光标到行尾,并进入Insert
模式;
ci(
修改()
中的内容,()
也可以是{}
[]
<>
,但是对于c++中的流操作符<<
就不能使用ci<
来修改其内容,因为是两个<
相连,可以使用c%
进行修改,但是光标要置于<
后。
查找
/
/ ?
进行前向 / 反向搜索
使用n
/ N
跳转到下一个 / 上一个
使用*
/ #
进行单词的前向 / 后向匹配
复制粘贴
y
(yank)复制 yiw
复制一个单词,yy
复制一行,y0
复制光标到行首
d
(delete)剪切
p
(put)粘贴,p
粘贴到光标之后,P
粘贴到光标之前
vim
在复制、剪切过程中的文本内容是存在寄存器中,而不是系统剪切板。
xp
:用x
删除一个字符,将字符放到无名寄存器中,再使用p
粘贴,实现字符对调。
对于寄存器的使用,通过:{register}
可以指定寄存器,有多个寄存器,如a
到z
都可以设置为寄存器,可以作为剪贴板来使用。如"ayiw
表示复制一个单词到寄存器a
中,"bdd
表示删除当前行到寄存器b
中。
使用:reg a
显示寄存器a
中保存的内容
使用"bp
表示粘贴寄存器b
中的内容
""
表示无名寄存器,默认就是用的无名寄存器,因此可以省略不写
"0
表示复制专用寄存器,默认复制到无名寄存器时,也会复制到专用寄存器
"+
表示系统剪贴板,用于和vim
外进行交互用的寄存器
清理寄存器的内容 :let @"=''
,让无名寄存器的内容赋为''
空字符
当在客户端进行复制后,在服务端进行粘贴时,无法使用寄存器进行交互,因此可以使用:set clipboard=unnamed
设置服务器中的vim
,再直接使用p
来进行粘贴
颠倒两行:exe "normal! ddpk"
:exe
:这是一个Ex
命令,用于执行后面的字符串作为Vim
命令。"normal! ddpk"
:这是要执行的字符串。在这个命令中,"normal!"
是告诉Vim
将后面的字符串作为普通模式下的按键操作来执行。dd
:删除当前行,并将其保存到剪贴板中。pk
:按下p
键,将剪贴板中的内容(之前删除的行)粘贴到光标当前位置的上一行。
撤销
u
撤销操作,U
撤销某一行最近所有修改,Ctrl + R
撤销u
Insert
模式
i
(insert)光标之前插入,I
行首插入
a
(append)光标之后插入,A
行尾插入
o
(open a line below) 在下一行插入,O
在上一行插入
进入该模式后,ctrl + h
删除上一个字符,ctrl + w
删除上一个单词,ctrl + u
删除光标前当前行所有字符(同理于终端)
可以使用 ctrl + c
或 ctrl + [
,从 Insert
模式切换到 Normal
模式
可以使用 gi
,从 Normal
模式切换到 Insert
模式中最后编辑的位置
复制粘贴
正常文本的复制粘贴ctrl + c
ctrl + v
<ctrl + r>{register}
对对应寄存器中的内容进行粘贴
CMD
模式
通过 :
进入命令行模式
:w
(write)写入
:wq
(write quit)写入并退出
:vs
(vertical split)竖直分屏
:sp
(split)水平分屏
:set nu
(set number)设置行号
替换
支持正则表达式
语法::[range]s[ubtitute]/{pattern}/{string}/[flags]
[range]
表示范围,如10,20
表示10到20行,%
表示全部
{pattern}
表示需要替换的文本
{string}
表示替换后的文本
[flags]
g
(global) 表示全局范围执行
c
(confirm) 表示需要确认是否修改
n
(number) 表示匹配到的次数,而不进行替换
:% s/a/b/g
把所有的a
替换成b
:1,6 s/a/b/g
把1到6行的a
替换成b
:1,6 s/a//n
1到6行中查找有多少个a
。但可能会对a
替换成空字符,可修改为:1,6 s/a/&/gn
使用正则表达式
:% s/\<a\>/b/g
把所有的单词a
替换成b
,而不替换含有a
字符的单词
Visual
模式
进行可视化选择
Normal
模式输入v
,进入visual
选择。使用V
选择整行,使用Ctrl + v
进行块状选择。
多文件间的转换
Buffer
Buffer
指打开的一个文件的内存缓冲区
修改时针对Buffer
的内容修改,:w
再将修改内容写入文件。
每个文件对应一个Buffer
,使用:ls
会列举当前缓冲区,再使用:b n
跳转到第n
个缓冲区。
:bpre
:bnext
:bfirst
:blast
分别跳到对应的缓冲区中,或者用:b buffer_name
加上Tab
补全来跳转。
通过:ls
来获得缓冲区中对应文件的信息、编号,可以通过:b1
跳到编号为1所对应文件的Buffer
中去。
也可以用:e buffer_name
打开对应的文件。
Window
Window
是Buffer
可视化的分割区域。
<Ctrl + w>v
垂直分割,同:vs
<Ctrl + w>s
水平分割,同:sp
<Ctrl + w>w
窗口间循环切换
<Ctrl + w>h
切换到左侧窗口,<Ctrl + w>H
将窗口移动左侧
<Ctrl + w>j
切换到下侧窗口,<Ctrl + w>J
将窗口移动下侧
<Ctrl + w>k
切换到上侧窗口,<Ctrl + w>K
将窗口移动上侧
<Ctrl + w>l
切换到右侧窗口,<Ctrl + w>L
将窗口移动右侧
Tab
Tab
可以把Window
组织为一个工作区
文本对象
可以快速操作一个单词、一个句子和一个段落等。
语法:[number]<command>[text object]
[number]
表示次数
<command>
表示命令,如d
c
y
[text object]
表示要操作的文本对象,如w
单词,s
句子,p
段落
如
iw
(inner word) viw
表示选择当前单词,vi"
表示选择"
中的内容
aw
(around word) vaw
表示选择当前单词以及单词后的空格
宏
一系列命令的集合:可以使用宏录制一系列操作,再用于回放这些操作,用于批量的编辑。
在Normal
模式下,使用q
来开启录制,再使用q
来结束录制。可以使用q{register}
,来指定对应的寄存器来存放指令。使用@{register}
来回放。
如,有多行网址,要给每一行的网址加上双引号。
https://www.example1111.com
https://www.example22.com
http://www.example333.com
http://www.example4444.com
https://www.example55555.com
http://www.example666666.com
https://www.example7777777.com
http://www.example88.com
https://www.example99999.com
http://www.example1000000.com
qa
开启录制宏到a
寄存器中
光标置于第一行,I" <ctrl + [> A" <ctrl + [> q
,其中I
光标置于行首,插入"
,<ctrl + [>
退出Insert
模式,A
插入到行尾,插入"
,退出Insert
模式,q
结束录制。 完成了一个宏。
可以使用j@a
,让下一行也通过宏完成指令。
还可以使用进入visual
模式,VG
选择其余所有行,使用:
进入命令行模式,vim
会显示:'<,'>
,使用normal
模式下的指令,输入normal @a
。命令行整体为:'<,'>normal @a
,即可完成操作。
整体修改只需
:1
qa
I" <ctrl + [> A" <ctrl + [>
q
:2
VG
:normal @a
"https://www.example1111.com"
"https://www.example22.com"
"http://www.example333.com"
"http://www.example4444.com"
"https://www.example55555.com"
"http://www.example666666.com"
"https://www.example7777777.com"
"http://www.example88.com"
"https://www.example99999.com"
"http://www.example1000000.com"
其实可以不使用宏也来完成该需求,VG
先全选,输入:normal I"
,给所有行首加入"
,进入命令行模式:
,<Ctrl +p>
输出上一步操作,将I"
改为A"
即可。
将宏的批量修改改成统一修改,由于录制宏中需要两次退出Insert
模式,因此需要两次进入normal
模式。
补全
常见补全
<Ctrl + n>
和 <Ctrl + p>
补全单词,在待补全选项中,可以通过使用操作选<Ctrl + n>
下一个和 <Ctrl + p>
上一个,而不使用方向键来选择。
<Ctrl + x>
和 <Ctrl + f>
补全文件名
<Ctrl + x>
和 <Ctrl + o>
补全代码,需要开启文件类型检查,安装插件