Vim语法及插件
- `Normal`模式
- 移动
- 删除
- 修改
- 查找
- 复制粘贴
- `Insert`模式
- 复制粘贴
- `CMD`模式
- 替换
- `Visual`模式
- 复制
- 多文件间的转换
- Buffer
- Window
- Tab
- 文本对象
Vim
中的指令可以灵活组合使用
:help
查找文档
切换为后台Ctrl + z;切换为前台fg
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
调整当前行到屏幕中间
删除
x
或 d
删除选中部分
dw
删除光标所在词,dd
删除光标所在行,D
删除所在行光标之后的所有词;
dt${char}
删除光标到${char}
的所有字符
d0
删除到行首,d$
删除到行尾
2dd
删除两行,4x
删除四个字符。数字+命令
表示多次重复。
修改
r
(replace) 替换一个字符,保持Normal
模式; R
替换多个字符,保持Normal
模式
s
(subtitute) 删除当前字符,并进入Insert
模式;S
删除当前行,并进入Insert
模式
c
(change)
cw
删除单词,并进入Insert
模式;Cw
删除光标到行尾,并进入Insert
模式;
查找
/
/ ?
进行前向 / 反向搜索
使用n
/ N
跳转到下一个 / 上一个
使用*
/ #
进行单词的前向 / 后向匹配
复制粘贴
y
(yank)复制 yiw
复制一个单词,yy
复制一行
d
(delete)剪切
p
(put)粘贴
vim
在复制、剪切过程中的文本内容是存在寄存器中,而不是系统剪切板。
xp
:用x
删除一个字符,将字符放到无名寄存器中,再使用p
粘贴,实现字符对调。
对于寄存器的使用,通过:{register}
可以指定寄存器,有多个寄存器,如a
到z
都可以设置为寄存器,可以作为剪贴板来使用。如"ayiw
表示复制一个单词到寄存器a
中,"bdd
表示删除当前行到寄存器b
中。
使用:reg a
显示寄存器a
中保存的内容
使用"bp
表示粘贴寄存器b
中的内容
""
表示无名寄存器,默认就是用的无名寄存器,因此可以省略不写
"0
表示复制专用寄存器,默认复制到无名寄存器时,也会复制到专用寄存器
"+
表示系统剪贴板,用于和vim
外进行交互用的寄存器
当在客户端进行复制后,在服务端进行粘贴时,无法使用寄存器进行交互,因此可以使用:set clipboard=unnamed
设置服务器中的vim
,再直接使用p
来进行粘贴
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
进行块状选择。
复制
y
(yank) 复制选中部分于缓冲区中
yy
复制整行(无需进入可视模式),y^
复制当前位置到行首,y$
复制当前位置到行尾,yw
复制一个word,yG
复制到文档末尾。
剪切:
d
(delete)用法与复制类似。
粘贴:
p
粘贴到光标之后,P
粘贴到光标之前。整行复制,粘贴整行;非整行复制,粘贴光标的前后。
撤销:
u
撤销操作,U
撤销某一行最近所有修改,Ctrl+R
重做。
多文件间的转换
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
表示选择当前单词以及单词后的空格