Vim语法及插件
常用
课程链接
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)
<C-u> / <C-f> 上(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撤销某一行最近所有修改,<C-r>撤销u
Insert模式
i(insert)光标之前插入,I行首插入
a(append)光标之后插入,A行尾插入
o(open a line below) 在下一行插入,O在上一行插入
进入该模式后,<C-h> 删除上一个字符,<C-w> 删除上一个单词,<C-u> 删除光标前当前行所有字符(同理于终端)
可以使用 <C-c> 或 <C-[>,从 Insert 模式切换到 Normal 模式
可以使用 gi,从 Normal 模式切换到 Insert 模式中最后编辑的位置
复制粘贴
正常文本的复制粘贴<C-c> <C-v>
<C-r>{register}对对应寄存器中的内容进行粘贴
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/\<a\>/b/g 把所有的单词a替换成b,而不替换含有a字符的单词
Visual模式
进行可视化选择
Normal模式输入v,进入visual选择。使用V选择整行,使用<C-v>进行块状选择。
选中使用U转换成大写字母,u转换成小写字母
多文件间的转换
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可视化的分割区域。
<C-w>v 垂直分割,同:vs
<C-w>s 水平分割,同:sp
<C-w>w 窗口间循环切换
<C-w>h 切换到左侧窗口,<C-w>H 将窗口移动左侧
<C-w>j 切换到下侧窗口,<C-w>J 将窗口移动下侧
<C-w>k 切换到上侧窗口,<C-w>K 将窗口移动上侧
<C-w>l 切换到右侧窗口,<C-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" <C-[> A" <C-[> q ,其中I光标置于行首,插入",<C-[>退出Insert模式,A插入到行尾,插入",退出Insert模式,q结束录制。 完成了一个宏。
可以使用j@a,让下一行也通过宏完成指令。
还可以使用进入visual模式,VG选择其余所有行,使用:进入命令行模式,vim会显示:'<,'>,使用normal模式下的指令,输入normal @a。命令行整体为:'<,'>normal @a,即可完成操作。
整体修改只需
:1 qa I" <C-[> A" <C-[> 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",给所有行首加入",进入命令行模式:,<C-p>输出上一步操作,将I"改为A"即可。
将宏的批量修改改成统一修改,由于录制宏中需要两次退出Insert模式,因此需要两次进入normal模式。
补全
常见补全
<C-n> 和 <C-p> 补全单词,在待补全选项中,可以通过使用操作选<C-n>下一个和 <C-p> 上一个,而不使用方向键来选择。
<C-x> 和 <C-f> 补全文件名
<C-x> 和 <C-o> 补全代码,需要开启文件类型检查,安装插件

配置
对:set number等配置的持久化,而不是每次打开一个文件都要重新配置。通过对vimrc的设置,完成此需求。
建立一个~/.vimrc配置文件,通过其编写对vim的设置。
- 常用设置:
:set nu设置行号,colorscheme hybrid设置主题 - 常用的
vim映射:noremap <leader>w :w<cr>保存文件 - 自定义的
vimscript函数和插件的配置
" 表示注释
映射
vim的映射比较复杂,因为有多种模式。在~/.vimrc中,通过使用leader键来进行组合,常用的leader键是使用, 或者<space>空格 let mapleader = ','。
| 命令 | 模式 | 描述 |
|---|---|---|
map | 所有模式 | 创建非递归映射 |
noremap | 所有模式 | 创建递归映射 |
com! | 命令行模式 | 定义自定义命令 |
imap | 插入模式 | 创建插入模式下的非递归映射 |
inoremap | 插入模式 | 创建插入模式下的递归映射 |
nmap | 正常模式 | 创建正常模式下的非递归映射 |
nnoremap | 正常模式 | 创建正常模式下的递归映射 |
vmap | 可视模式 | 创建可视模式下的非递归映射 |
vnoremap | 可视模式 | 创建可视模式下的递归映射 |
xmap | 选择模式 | 创建选择模式下的非递归映射 |
xnoremap | 选择模式 | 创建选择模式下的递归映射 |
有 inoremap <leader>w <Esc>:w<cr>
inoremap: (iinsert,noreno recursive,mapmap) 插入模式非递归映射<leader>w等价使用,w<Esc>:w<cr>等价表示为在Insert模式,先使用<Esc>,进入Normal模式,再进入命令行保存文件:w,最后再使用回车<cr>
使用,w映射为在Insert模式保存文件。
如何使得自定义的vimrc配置文件生效,类似与.bashrc一样,通过输入:source ~/.vimrc来使其生效或者退出,重新进入。
有noremap <C-h> <C-w>h,通过<C-h>来实现移动到左侧窗口。
有一种情况,如下
:nmap - dd
:nmap \ -
最后,会将\映射为dd。类似于递归的形式。因此,使用递归映射,行为有不确定性。比如安装的插件恰巧映射了不确定的行为。建议使用非递归映射
通过把vimrc配置放到git版本备库管理可以同步到其他电脑或服务器上。
插件
推荐使用vim-plug插件管理器,在.vimrc中使用如下命令
call plug#begin('~/.vim/plugged')
//...
call plug#end()
有需求就有供给,如何找到插件:
- vimawesome
- 他人开源配置文件
//...的位置添加想要的插件内容,完成vimrc的修改后,执行:PlugInstall安装插件即可。
| 语法 | 网址 | 描述 |
|---|---|---|
Plug 'mhinz/vim-startify' | https://github.com/mhinz/vim-startify | 开屏插件,可以显示最近打开的文件 |
Plug 'vim-airline/vim-airline'Plug 'vim-airline/vim-airline-themes' | https://github.com/vim-airline/vim-airline | 状态栏美化 |
Plug 'yggdroot/indentline' | https://github.com/Yggdroot/indentLine | 增加代码的缩进线条 |
Plug 'w0ng/vim-hybrid' | https://github.com/w0ng/vim-hybrid | vim配色 |
Plug 'preservim/nerdtree' | https://github.com/preservim/nerdtree | 文件目录树 |
Plug 'kien/ctrlp.vim' | https://github.com/kien/ctrlp.vim | 快速查找并打开文件 |
Plug 'tpope/vim-surround' | https://github.com/tpope/vim-surround | 成对编辑"" ()等 |
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }Plug 'junegunn/fzf.vim' | https://github.com/junegunn/fzf.vim | 模糊搜索 |
ctrlp.vim 的指令:ss 查找指定的字符。
如查找name,通过ssna,将显示高亮部分,通过该部分上的字母将选择是哪一个字符
vim-surround的指令:ds delete a surrounding,cs change a surrounding, ys you add a surrounding。
如在name上加",需要ysiw";在"name"将"换成(,需要cs"(或cs"),区别是前者()中间有空格( name ),后者()中间没有空格(name);删除"name"的",需要ds"
fzf的指令:Ag [pattern]模糊搜索字符串,Files [pattern]模糊搜索目录
脚本
vim对应的脚本vimscript
推荐书目笨方法学Vimscript










