课程链接
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)
/
上(upword) / 下(forward)翻页
zz
调整当前行到屏幕中间
zt
将光标所在行调整到屏幕上方
: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
撤销某一行最近所有修改,
撤销u
Insert
模式i
(insert)光标之前插入,I
行首插入
a
(append)光标之后插入,A
行尾插入
o
(open a line below) 在下一行插入,O
在上一行插入
进入该模式后,
删除上一个字符,
删除上一个单词,
删除光标前当前行所有字符(同理于终端)
可以使用
或
,从 Insert
模式切换到 Normal
模式
可以使用 gi
,从 Normal
模式切换到 Insert
模式中最后编辑的位置
正常文本的复制粘贴
对对应寄存器中的内容进行粘贴
CMD
模式通过 :
进入命令行模式
:w
(write)写入
:wq
(write quit)写入并退出
:q
退出编辑器,如果存在未保存的修改,Vim
会提示保存或放弃修改。如果没有做任何修改或已保存修改,Vim
将立即退出。
:q!
也用于退出编辑器,但是它会强制退出,丢弃所有未保存的修改
因此,如果你有未保存的修改,应该首先使用:q
命令尝试退出编辑器并保存修改。只有在确定不再需要这些修改时,才应使用:q!
命令强制退出。
: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/\/b/g
把所有的单词a
替换成b
,而不替换含有a
字符的单词
Visual
模式进行可视化选择
Normal
模式输入v
,进入visual
选择。使用V
选择整行,使用
进行块状选择。
选中使用U
转换成大写字母,u
转换成小写字母
Buffer
指打开的一个文件的内存缓冲区
修改时针对Buffer
的内容修改,:w
再将修改内容写入文件。
每个文件对应一个Buffer
,使用:ls
会列举当前缓冲区,再使用:b n
跳转到第n
个缓冲区。
:bpre
:bnext
:bfirst
:blast
分别跳到对应的缓冲区中,或者用:b buffer_name
加上Tab
补全来跳转。
通过:ls
来获得缓冲区中对应文件的信息、编号,可以通过:b1
跳到编号为1所对应文件的Buffer
中去。
也可以用:e buffer_name
打开对应的文件。
Window
是Buffer
可视化的分割区域。
垂直分割,同:vs
水平分割,同:sp
窗口间循环切换
切换到左侧窗口,
将窗口移动左侧
切换到下侧窗口,
将窗口移动下侧
切换到上侧窗口,
将窗口移动上侧
切换到右侧窗口,
将窗口移动右侧
Tab
可以把Window
组织为一个工作区
可以快速操作一个单词、一个句子和一个段落等。
语法:[number]
[number]
表示次数
表示命令,如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"
,其中I
光标置于行首,插入"
,
退出Insert
模式,A
插入到行尾,插入"
,退出Insert
模式,q
结束录制。 完成了一个宏。
可以使用j@a
,让下一行也通过宏完成指令。
还可以使用进入visual
模式,VG
选择其余所有行,使用:
进入命令行模式,vim
会显示:'<,'>
,使用normal
模式下的指令,输入normal @a
。命令行整体为:'<,'>normal @a
,即可完成操作。
整体修改只需
:1
qa
I"
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"
,给所有行首加入"
,进入命令行模式:
,
输出上一步操作,将I"
改为A"
即可。
将宏的批量修改改成统一修改,由于录制宏中需要两次退出Insert
模式,因此需要两次进入normal
模式。
常见补全
和
补全单词,在待补全选项中,可以通过使用操作选
下一个和
上一个,而不使用方向键来选择。
和
补全文件名
和
补全代码,需要开启文件类型检查,安装插件
对:set number
等配置的持久化,而不是每次打开一个文件都要重新配置。通过对vimrc
的设置,完成此需求。
建立一个~/.vimrc
配置文件,通过其编写对vim
的设置。
:set nu
设置行号,colorscheme hybrid
设置主题vim
映射:noremap w :w
保存文件vimscript
函数和插件的配置"
表示注释
vim
的映射比较复杂,因为有多种模式。在~/.vimrc
中,通过使用leader
键来进行组合,常用的leader
键是使用,
或者
空格 let mapleader = ','
。
命令 | 模式 | 描述 |
---|---|---|
map |
所有模式 | 创建非递归映射 |
noremap |
所有模式 | 创建递归映射 |
com! |
命令行模式 | 定义自定义命令 |
imap |
插入模式 | 创建插入模式下的非递归映射 |
inoremap |
插入模式 | 创建插入模式下的递归映射 |
nmap |
正常模式 | 创建正常模式下的非递归映射 |
nnoremap |
正常模式 | 创建正常模式下的递归映射 |
vmap |
可视模式 | 创建可视模式下的非递归映射 |
vnoremap |
可视模式 | 创建可视模式下的递归映射 |
xmap |
选择模式 | 创建选择模式下的非递归映射 |
xnoremap |
选择模式 | 创建选择模式下的递归映射 |
有 inoremap
inoremap
: (i
insert, nore
no recursive, map
map) 插入模式非递归映射w
等价使用,w
:w
等价表示为在Insert
模式,先使用
,进入Normal
模式,再进入命令行保存文件:w
,最后再使用回车
使用,w
映射为在Insert
模式保存文件。
如何使得自定义的vimrc
配置文件生效,类似与.bashrc
一样,通过输入:source ~/.vimrc
来使其生效或者退出,重新进入。
有noremap
,通过
来实现移动到左侧窗口。
有一种情况,如下
:nmap - dd
:nmap \ -
最后,会将\
映射为dd
。类似于递归的形式。因此,使用递归映射,行为有不确定性。比如安装的插件恰巧映射了不确定的行为。建议使用非递归映射
通过把vimrc
配置放到git
版本备库管理可以同步到其他电脑或服务器上。
推荐使用vim-plug
在.vimrc
中
call plug#begin('~/.vim/plugged')
//...
call plug#end()
//...
的位置添加插件内容,完成vimrc
的修改后,执行:PlugInstall
安装插件即可。
如,Plug mhinz/vim-startify
是直接使用 https://github.com/mhinz/vim-startify 网址的一部分
有需求就有供给,如何找到插件:
vim
对应的脚本vimscript
推荐书目笨方法学Vimscript