Vim的四种模式
Normal模式:esc
(默认)
插入模式:
a
i
o
A
I
O
命令模式:
visual 可视化模式:
v
字行V
行选ctrl
+v
方块选择
命令模式
- 显示行号:
:set nu
- 语法高亮:
syntax on
- 搜索内容(所有结果)高亮:
set hls
- 边搜索变高亮:
set incsearch
- 竖向分屏:
:vs
- 横向分屏:
:sp
- 退出横竖分屏:
:q
- 全局替换:
:% s/原内容/替换内容/g
- 重新加载并且不保存当前文件:
:e
d
删除y
复制p
粘贴
快速纠错:(在很多地方通用)
ctrl
+h
删除上一个字符ctrl
+w
删除上一个单词ctrl
+u
删除当前行
快速移动:(终端下通用)
ctrl
+a
移动到行头ctrl
+e
移动到结尾ctrl
+b
往前移动ctrl
+f
往后移动
替代esc案件:
Ctrl
+c (可能会中断某些插件)
Ctrl
+[
快速跳转到你最后一次编辑的地方并进入插入模式:
- Normal模式下
gi
移动
VIM下的移动:h
j
k
l
. ^ k
.
. < h l >
.
. v j
记忆提示:
h
的键位于左边,每次按下就会向左移动l
的键位于右边,每次按下就会向右移动j
键看起来很像一支尖端方向朝下的箭头
单词之间的移动
w
/W
移动到下一个word/WORD开头e
/E
移动到下一个word/WORD结尾b
/B
回到上一个word/WORD开头,可以理解为backword *word 指的是以非空白符分割的单词,WORD以空白符分割的单词
行间搜索移动
- 使用
f
+ {char} 可以移动到{char}字符上 t
+ {char}移动到{char}的前一个字符- 如果第一次没搜到,可以用分号(
;
)/逗号(,
)继续搜改行下一个/上一个 - 大写的
F
表示反过来搜索前面的字符
水平移动
0
移动到行首的第一个字符^
移动到第一个非空白字符(0+w)$
移动到行尾g _
移动到行尾非空白字符
垂直移动
可以在句子(sentence)和段落(paragraph)间移动(不常用)
- 使用括号
(
,)
在句子间移动,可以用:help ( 来查看帮助 - 使用
{
,}
在段落之间移动
页面移动
- 移动到文件内容开头:
gg
- 移动到文件结尾:
G
- 快速返回:
ctrl
+o
- 移动到屏幕开头:
H
- 移动到屏幕中间:
M
- 移动到屏幕结尾:
L
- 向上(upword)翻页:
ctrl
+u
- 向下(forward)翻页:
ctrl
+f
- 把屏幕置为中间:
zz
快速删除(normal模式下)
- 删除一个字符:
x
- 删除一个单词:
dw
/daw
(d around word)/diw
dw
当前位置到下一个单词的起始位置
daw
会同时删除单词后面的空格,
diw
只删除单词
- 删除n个字符:
n
+x
- 删除一行:
dd
- 删除n行:
数字n
+dd
/d
+数字n
+d
- 删除当前位置到下一个指定字符的位置:
d
+t
+字符
- 删除当前位置到行尾:
d
+$
- 删除当前位置到行始:
d
+0
- 删除选中内容:
v
/Ctrl
+v
+x
/d
删除选中内容
快速修改
r (replace):替换字符
r
+ 字符:替换一个字符R
+ 字符:输入替换后续内容
c (change):配合文本对象进行修改
c
:删除一个单词并计入插入模式,类似 dcw
:当前位置到下一个单词的起始位置,并进入插入模式*
caw
:会同时删除单词后面的空格,并进入插入模式*
ciw
:只删除单词,并进入插入模式c
+t
+指定字符
:删除当前位置到下一个指定字符的位置,并进入插入模式C
:删除整行进入插入模式
s (substitute):替换并进入插入模式
s
:删除字符并进入插入模式数字
+s
:配合数字使用删除指定字符长度并进入插入模式S
:删除整行并进入插入模式数字
+S
:配合数字使用删除指定行数并进入插入模式
查询单词
/
前向搜索?
反向搜索 (下面的N
n
#
*
会往反方向进行移动)N
搜索上一个n
搜索下一个
移动到上一个(移动到某个字符上时,会自动匹配单词)
移动到下一个(移动到某个字符上时,会自动匹配单词)
替换命令 substitute(代替)
-
:[range]s[ubstitute]/{pattern}/{string}/[flags]
-
range
操作的范围 比如:10,20 表示10-20行, -
%
表示全部 pattern 要替换的模式;例如:精确的匹配一个单词 :% s/<内容>//g -
string
替换成的文本 -
flags
替换的标志位常用的标志位 g (global) 表示全局范围内执行 c (confirm) 表示确认,可以确认或者拒绝修改 n (number) 报告匹配到的次数而不替换,可以用来查询匹配次数
-
多文件操作
Buffer:打开的一个文件的内存缓冲区
Buffer之间的切换
:ls
列出当前的缓冲区:bn
跳转到第n个缓冲区:bpre
/:bnext
/:bfirst
/:blast
分别跳转到上一个/下一个/第一个/最后一个缓冲区 (可以使用tab命令补全:bp+tab
=>:bpre
):b buffer_name
(一般是文件名称)加上tab补全来跳转
Window:Buffer可视化的分割区域
-
水平分隔:
<Ctrl + w> s
或者:sp
-
垂直分隔:
<Ctrl + w> v
或者:vs
-
切换窗口:
<Ctrl + w> w
在窗口间循环切换<Ctrl + w> h
切换到左边的窗口<Ctrl + w> j
切换到下边的窗口<Ctrl + w> k
切换到上边的窗口<Ctrl + w> l
切换到右边的窗口
-
重排窗口:
<Ctrl + w> =
所有的窗口等宽登高<Ctrl + w> _
最大化活动窗口的高度<Ctrl + w> |
最大化活动窗口的宽度[N]<Ctrl + w>_
把活动窗口的高度设置为[N]行[N]<Ctrl + w>|
把活动窗口的宽度设置为[N]列
-
窗口移动:
<Ctrl + w> L
窗口移动到左边<Ctrl + w> H
窗口移动到右边<Ctrl + w> K
窗口移动到上边<Ctrl + w> J
窗口移动到下边
Tab:组织窗口为一个工作区
:tabe[dit] {filename}
在新标签页中打开{filename}<Ctrl + w> T
把当前窗口移到新的标签页:tabc[lose]
关闭当前标签页及其中的所有窗口:tabo[nly]
只保留活动标签页,关闭其他活动标签页:tabn[ext] {N}
或{N}gt
切换到编号为{N}的标签页:tabn[ext]
或gt
切换到下一个标签页:tabp[revious]
或gT
切换到上一个标签页
文本对象操作方式
[number] [text object]
number
:次数
command
:命令 如:d(elete)删除 c(hange)修改 y(ank)复制
text object
:文本对象 如:单词w , 句子s , 段落p
操作练习:
-
iw 标识 inner word。
viw
选中单词
diw
删除单词
ciw
修改单词
yiw
复制单词 -
aw 选中单词包括前后空格 a word
vaw
、daw
、caw
、yaw
-
i+符号 快速删除括号内的内容,
di)
复制粘贴
Normal模式下:
- 复制y(ank)
- 粘贴p(ut)
- 剪贴 d+p
- 复制一行 yy
- 删除一样 dd
vim复制带有缩进的代码粘贴可能会造成错乱
坑
可以使用
:set paste
和:set nopaste
解决
寄存器
vim里操作的是寄存器而不是系统剪切板,这和其他编辑器不同;默认我们使用 d
删除或者 y
复制的内容都放到了“无名寄存器”,通过 {register} 前缀可以指定寄存器,不指定默认使用无名寄存器
寄存器类别:
类别 | 符号 | 描述 |
---|---|---|
未命名寄存器 | " | 上一次复制或删除的文本;yy默认就是使用的无名寄存器 |
数字寄存器 | 0-9 | 文本复制和删除历史 |
行内删除寄存器 | - | 删除少于一行的文本 |
命名寄存器 | a-z,A-Z | 存放文本 |
只读寄存器 | % | 当前文件名 |
. | 最近插入的文本 | |
: | 最近执行的命令行 | |
轮换缓冲寄存器 | # | 交替文件的名字 |
表达式寄存器 | = | 返回表达式结果 |
选择和拖拽寄存器 | * | 系统剪切板 |
+ | 系统剪切板(X11) | |
~ | 拖拽的文本 | |
黑洞寄存器 | _ | 彻底删除的文本 |
搜索模式寄存器 | / | 最近搜索模式 |
寄存器:
-
复制:normal模式下
"[寄存器名称][复制或剪切命令]
复制内容到寄存器中例如:
复制一个单词到寄存器a里面"ayiw
复制一行内容到寄存器b里面"byy
删除当前行到寄存器c中"cdd
-
粘贴:normal模式下
"[寄存器名称]p
粘贴寄存器的内容粘贴寄存器a中的内容到当前光标后面
"ap
-
查看寄存器
查看某个寄存器中的内容
:reg [寄存器名称]
查看所有寄存器中的内容:registers
或:reg
【前置条件】验证是否支持clipboard
:echo has('clipboard')
输出1说明可用直接使用系统剪切板
系统剪切板:
- 直接使用系统剪切板
:set clipboard=unnamed
- Insert模式下使用系统剪切板粘贴:
[Ctrl+R] +
宏(macro)
宏可以看成是一系列命令的集合;
我们可以使用宏[录制]一系列操作,然后用于[回放];
宏可以非常方便地把一系列的命令用在多行文本上;
使用方式:
- normal模式下用
q
来录制,同时也是q
结束录制; - 使用
q{register}
选择要保存的寄存器,把录制的命令保存其中; - 使用
@{register}
回放寄存器中保存的一系列命令;
示例:在每行一个网址的多行数据文本里面,给每行的网址加上双引号
操作:
Normal模式下,
qa
录制宏操作到a
寄存器
gg
移到第一行文本 ,0:N
回到行首
i
进入插入模式,输入
esc
退回Normal模式,$
回到行尾
a
进入写入模式,输入
esc
退回Normal模式,q保存,完成宏录制
V
选中单行,G
移动到行尾并选中多行:进入命令行模式 输入normal
@a
完成整个操作
用其他方式完成示例:
Normal模式下,
V
选中单行,G
移动到行尾并选中多行:进入命令行模式 输入normal
I
:进入命令行模式
ctrl+p
复制上一条命令并修改为:normalA
完成整个操作
补全
简介:根据当前环境上下文由编辑器【猜】你想要输入的东西
普通关键字 当前缓冲区关键字 包含文件关键字
<C-]>
标签文件关键字 字典查找 整行补全 文件名补全 全能(Omni)补全 (需要开启filetype:filetype on
)
常用的三种补全类型:
-
ctrl+n 和 ctrl+p 补全单词
(ctrl + n 向下选择,ctrl + p向下选择) -
ctrl+x ctrl+f 补全文件名
-
ctrl+x ctrl+o 补全代码,需要开启文件类型检查,安装插件
-
快速插入文件名:
:r! echo %
-
快速插入当前文件路径:
:r! echo %:p
配色方案
- 显示当前的主题配色,默认是default
:colorscheme
- 显示所有的配色
:colorscheme <ctrl + d>
- 修改配色
:colorscheme 配色名
更多的配色方案:https://github.com/flazz/vim-colorschemes
配色方案放到 ~/.vim/colors 文件夹中,没有则创建
配置文件
所在位置 ~/.vimrc vim设置 常用设置,比如::set nu 设置行号,colorscheme hybrid设置主题; 常用映射,比如::noremap w :w 保存文件 自定义vimscript函数 插件配置
插件管理器
常用的插件管理器:vim-plug
、Vundle
、Pathogen
、Dein.Vim
、volt
从性能、易用性、文档角度推荐使用 vim-plug
Vim-plug
【获取】
cd ~/.vim/
git clone https://gitee.com/wk-zys/vim-plug.git
【安装】
mkdir -p ~/.vim/autoload/
cp plug.vim ~/.vim/autoload/plug.vim
【配置】
vim ~/.vimrc
append code
call plug#begin('~/.vim/plugged')
Plug 要安装的插件 ## 安装后,会多出 ~/.vim/plugged 目录,里面是对应的插件
Plug 'mhinz/vim-startify'
Plug 'scrooloose/nerdtree'
call plug#end()
【使用】
- 进入vim中使用PlugInstall安装自己预先在.vimrc中填写的插件
-
PlugInstall
<tab>
查看当前文件名和文件路径
正常模式下 :f
或 CTRL
+G