2019-11-24
开始编辑
需要进入编辑模式。
- 开始进入 VIM 时为
normal
模式,输入i
(insert) 、a
(append)、o
(open a line below) 进入编辑模式。
i
:在当前光标所在位置之前插入。a
:在当前光标所在位置之后插入(此时光标会向后移动一位,然后继续在光标之前插入)o
:在当前光标所在行的下一行插入。I
:在当前行的最前面进行插入。(insert before line)A
:在当前行的最后面进行插入。(append after line)O
:在当前行的上一行新建一行进行插入。(append a line above)
- 使用
Esc
又可以回到normal
模式(此时光标会向前移动一位)。输入:wq
(write quit) 保存退出;输入:q
退出;输入:q!
强制退出(不会保存做出的修改);使用:e!
重新加载而不保存。
VIM 的模式
- 进入 VIM 默认为
normal
(普通)模式。使用Esc
从insert
(插入)模式(插入模式下可以直接编辑)回到普通模式(普通模式下可以进行各种命令操作和移动操作);在插入模式下输入Ctrl
+O
可以在插入模式下执行命令模式下的命令。 -
command
(命令)模式:normal
(普通)模式下输入:
之后执行命令。比如:
分屏
:vs
(vertical split)左右分屏;:sp
(split)上下分屏
设置行号::set nu
;设置语法高亮::syntax on
-
visual
(可视)模式:一般用来块状选择文本。
normal
模式下输入v
(小写) 进入visual
选择模式;输入V
(大写) 选择行;使用Ctrl + v
进行方块选择。
VIM 编辑技巧
插入模式下如何快速纠错
-
Ctrl + h
:删除上一个字符 -
Ctrl + w
:删除上一个单词 -
Ctrl + u
:删除当前行
快速切换 insert 和 normal 模式
-
insert
模式进入normal
模式(主要是Esc
按起来不方便)
- 使用
Ctrl + c
(可能会中断某些插件)或者Ctrl + [
代替Esc
-
normal
模式进入insert
模式中最后一次编辑的位置进行插入
-
normal
模式下输入gi
快速跳转到你最后一次编辑的位置并进入插入模式
VIM 快速移动
-
h
(左移)、j
(下移)、k
(上移)、l
(右移) -
w
/W
移动到下一个world
/WORLD
开头 -
e
/E
移动到下一个world
/WORLD
结尾 -
b
/B
移动到上一个world
/WORLD
开头 -
word
指的是以非空白符分割的单词;WORD
指的是以空白符分割的单词
括号间跳转 %
使用 %
可以在一对括号间跳转。
小括号跳转(当光标在括号内部时使用)
-
])
:紧挨着的下一个)
-
[(
:紧挨着的上一个(
-
[
:往上 -
]
:往下
函数间跳转
-
[m
:跳转到上一个函数开头 -
[M
:跳转到上一个函数结尾 -
]m
:跳转到下一个函数开头 -
]M
:跳转到本函数结尾
跳转到定义处(和 Ctrl + 左键点击类似)
gd
(goto global declaration):找到本地定义
行间搜索移动
同一行快速移动的方式其实是搜索一个字符并且移动到该字符所在位置
- 使用
f{char}
可以移动到char
字符上,t
移动到char
的前一个字符 - 如果第一次没搜索到,可以用分号(
;
)或者逗号(,
)继续搜索该行下一个或上一个字符 -
F
表示反向搜索光标之前的字符
水平移动
-
0
移动到行首第一个字符,^
移动到行首第一个非空白字符(可以使用0w
代替) -
$
移动到行尾,g_
移动到行尾非空白字符
垂直移动
可以在句子(sentence)和段落(paragraph)间移动
- 使用括号
()
在句子间移动,可以用:help(
来查看帮助 - 使用
{}
在段落间移动 -
-
:移动到上一行行首 -
+
:移动到下一行行首
操作 | 含义 |
---|---|
Ctrl + Y
|
向上滚动一行 |
Ctrl + U
|
向上滚动半屏 |
Ctrl + B
|
向上滚动一屏 |
Ctrl + E
|
向下滚动一行 |
Ctrl + D
|
向下滚动半屏 |
Ctrl + F
|
向下滚动一屏 |
页面移动
-
gg
或[[
移动到文件开头;G
或]]
移动到文件结尾;可使用Ctrl + o
快速返回 -
H
/M
/L
跳转到屏幕的开头(Head)、中间(Middle)、结尾(Lower) -
Ctrl + u
向上翻页(upword);Ctrl + f
向下翻页(forward) -
zt
把光标所在行置为顶部 -
zz
把光标所在行置为中间 -
zb
把光标所在行置为底部
`` # 移动到上次位置,只能在两次位置间互相移动
VIM 快速增删改查
1. 增加字符
- 进入插入模式编辑文本
2.快速删除
-
normal
模式下使用x
快速删除一个字符; - 使用
d
(delete)配合文本对象 快速删除一个单词,如:daw
(delete around word)、diw
、dw
; -
dd
删除当前行; -
dt)
:删除括号内的内容,dt"
:删除双引号内的内容;(delete to char
:删除当前位置到指定字符处的内容) -
d$
:删除到行尾;d0
:删除到行首; -
d
和x
都可以搭配数字来执行多次,如2dd
:删除两行;2x
:删除两个字符。
3. 快速修改
-
normal
模式下使用r
(replace)可以替换一个字符;R
输入字符覆盖掉光标之后的内容并进入插入模式;s
(substitute)为删除当前字符并进入插入模式(可配合数字使用);S
删除当前行并进入插入模式 - 使用
c
(change)配合文本对象,可以快速修改 ,如caw
删除当前单词并进入插入模式,ct"
删除双引号中的内容并进入插入模式;C
删除当前行光标所在位置之后的内容并进入插入模式 - 也可配合数字使用
-
:help 命令
:查看命令用法及意义,如:help s
4. 快速查找
可以使用 :set hls
将搜索到的内容进行高亮显示;使用 :set incsearch
搜索时边搜索边高亮显示
- 使用
/
或者?
进行 向前 或 向后 搜索 - 使用
n
或N
跳转到 下一个 或 上一个 匹配 - 使用
*
或#
进行当前单词的 前向 或 后向 匹配
VIM 替换命令
substitute
命令允许我们查找并且替换掉文本,其支持正则表达式
:[range]s[ubstitute]/{pattern}/{string}/[flags]
- 使用冒号表示在命令模式下执行
-
range
表示操作范围,比如:10,20
表示行,%
表示全部 -
pattern
表示要替换的模式 -
string
表示替换后的文本 -
flags
表示标志,其有几个常用的标志,如下所示-
g
(global)表示全局范围内执行 -
c
(confirm)表示确认,可以确认或拒绝修改(每次替换前会进行确认) -
n
(number)报告匹配到的次数而不替换,可以用来查询匹配次数
-
如 :% s/this/self/g
表示将文本中所有的 this 替换为 self
:% s/self//n
查询文本中所有 self 的出现次数
VIM 多文件操作
1.Buffer 是指打开的一个文件的内存缓冲区
VIM 打开一个文件后会加载文件内容到缓冲区,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件,直到执行
:w
(write)的时候才会把修改的内容写入到文件中。
如何在 Buffer 之间切换?
- 用 VIM 打开一个文件后,输入
:e file_name
可以打开另一个文件(file_name为文件名) - 使用
:ls
会列举当前缓冲区,然后使用:b n
跳转到第 个缓冲区 -
:bpre
(跳转到上一个缓冲区)、:bnext
(跳转到下一个缓冲区)、:bfirst
(跳转到第一个缓冲区)、:blast
(跳转到最后一个缓冲区) - 或者用
:b buffer_name
加上 补全来跳转
2. 窗口是 Buffer 可视化的分割区域
- 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
-
Ctrl + w + s
水平分割,Ctrl + w + v
垂直分割,或者用:sp
和:vs
-
每个窗口可以继续被无限分割
如何切换窗口
切换窗口的命令都是使用 Ctrl + w
(window)作为前缀
命令 | 用途 | |
---|---|---|
Ctrl + w + w |
在窗口间循环切换 | |
Ctrl + w + h |
切换到左边窗口 | 为 时,可以左移窗口 |
Ctrl + w + j |
切换到下边窗口 | 为 时,可以下移窗口 |
Ctrl + w + k |
切换到上边窗口 | 为 时,可以上移窗口 |
Ctrl + w + l |
切换到右边窗口 | 为 时,可以右移窗口 |
如何重排窗口
重排窗口可以改变窗口的大小 :h window-resize
查看文档
命令 | 用途 |
---|---|
Ctrl + w + = |
使所有窗口等宽、等高 |
Ctrl + w + _ |
最大化活动窗口的高度 |
Ctrl + w + | |
最大化活动窗口的宽度 |
[N] + Ctrl + w + _ |
把活动窗口的高度设为行 |
[N] + Ctrl + w + | |
把活动窗口的宽度设为行 |
3. Tab 可以将窗口组织为一个工作区,可以将窗口分组
Tab 是可以容纳一系列窗口的容器 :h tabpage
命令 | 用途 |
---|---|
:tab[edit] {filename} |
在新标签页打开 {filename} |
Ctrl + w + T |
把当前窗口移动到一个新标签页 |
:tab[close] |
关闭当前标签页及其中的所有窗口 |
:tab[only] |
只保留活动标签页,关闭其他所有标签页 |
Tab 切换操作
Ex 命令 | 普通模式命令 | 用途 |
---|---|---|
tab[next] {N} |
{N}gt |
切换到编号为 {N} 的标签页 |
:tab[next] |
gt |
切换到下一标签页 |
:tab[previous] |
gT |
切换到上一标签页 |
Text Object(文本对象)
VIM里文本也有对象的概念,比如一个单词、一段句子、一个段落 ,很多其他编辑器经常只能操作单个字符来修改文本,比较低效;VIM 通过操作文本对象来修改要比只操作单个字符高效。
文本对象操作方式
[number]<command>[text object]
-
number
表示次数,command
是命令,d
(delete)、c
(change)、y
(yank)、v
(visual) -
text object
表示要操作的文本对象,比如单词(w
,word),句子(s
,sentence),段落(p
,paragraph)。
iw
表示 inner word,如果键入viw
命令,那么首先v
进入可视模式,然后iw
选中当前单词。
aw
表示 around word,它不但会选中当前单词,还会包含当前单词之后的空格。
VIM 复制粘贴与寄存器的使用
1. normal 模式下复制粘贴
- normal 模式下复制粘贴分别使用
y
(yank)和p
(put),剪贴:d
和p
(先删除后粘贴) - 我们可以使用
v
(visual)进入可视模式选中要复制的内容,然后使用y
复制,使用p
粘贴 - 配合文本对象:比如使用
yiw
复制一个单词,yy
复制一行 - 使用
u
可以撤回 - 使用
Ctrl
+r
可以反撤回
2. Insert 模式下复制粘贴
- 和其他文本编辑器相同,即使用
Ctrl + c
复制,Ctrl + V
粘贴;但是粘贴代码时会出现缩进混乱; - 当在插入模式下粘贴系统剪贴板的内容时,需要先按
Ctrl
+r
,然后按下+
即可; - 很多人在 vimrc 中设置了
autoindent
,粘贴 python 代码时缩进混乱,此时就需要使用:set paste
和:set nopaste
解决(使用o
进入下一行时会与上一行对齐)
深入寄存器(register)
VIM 不使用单一剪贴板进行剪贴、复制与粘贴,而是使用多组寄存器;VIM 在 normal 模式下复制剪贴的内容去哪了?VIM 里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同。
默认使用
d
删除或者y
复制的内容都放到了“无名寄存器”用
x
删除一个字符放到无名寄存器,然后用p
粘贴,可以调换两个字符通过
"{register_name}
前缀可以指定寄存器,不指定默认使用无名寄存器比如使用
"ayiw
复制一个单词到寄存器a 中,"bdd
删除当前行到寄存器b 中。可以使用
:reg register_name
查看register_name
寄存器中的内容VIM中
""
表示无名寄存器,缺省使用。"" p
就等同于p
在
normal
模式下操作d/y/x
等命令时,通过在命令前面加入寄存器的名字如"ayy
,来将命令生成的内容放入指定的寄存器中,如上面的a
寄存器中,而不是 vim 默认使用的""
寄存器和"0
寄存器。粘贴时,
normal
模式下通过在p
命令的前面加入寄存器的名字如"ap
,来将寄存器中的内容放入到光标所在的位置行上或下;insert
模式下使用<Ctrl>+R
和"a
来粘贴。
除了有名寄存器 ,VIM 中还有一些其他常见寄存器
- 复制专用寄存器,
"0
使用y
复制文本同时会被拷贝到复制寄存器 0 - 系统剪贴板
"+
,可以在复制前加上"+
复制到系统剪贴板-
vim --version | grep clipboard
查看 VIM 是否支持系统剪贴板,如果出现-clipboard
,说明你的 VIM 不支持系统剪切板。一般重新安装一下,然后配置。执行set clipboard=unnamedplus
即可sudo apt install vim-gtk
安装vim-gtk
即可(或者安装gvim
),安装完成后再执行vim --version | grep clipboard
此时应该已经支持 clipboard 功能。 -
:echo has('clipboard')
输出为表示支持系统剪贴板。还可以使用:set clipboard=unnamed
直接使用系统剪贴板。
-
- 其他一些寄存器,比如
"%
当前文件名,".
上次插入的文本
VIM宏(macro)
宏可以看做一系列命令的集合;可以使用宏“录制”一系列操作,然后用于“回放”;宏可以非常方便地把一系列命令用在多行文本上。
如何使用宏
宏的使用分为录制和回放
- 在
normal
模式下使用q
来录制,同时q
也表示结束录制 - 使用
q{register}
选择要保存的寄存器,把录制的命令保存在其中 - 使用
@{register}
回放寄存器中保存的一系列命令
实例:给多行超链接加双引号
- 先给一行加上双引号,然后再回放到其他所有行
- 先使用
q
录制,给一行加上双引号,之后使用q
退出 - 在剩下的所有行中回放录制的宏(先使用可视模式选中所有内容,然后输入
:normal @{register}
,即在可视模式下执行命令)
VIM 补全
- 使用
Ctrl + n
或Ctrl + p
补全单词 - 使用
Ctrl + x
加Ctrl + f
补全文件名 - 使用
Ctrl + x
加Ctrl + o
补全代码,需要开启文件类型检查(在执行:filetype on
之后执行:set filetype
),也可安装插件 - 当补全有多项匹配出现提示时,可以通过
Ctrl
+n
选择下一个,通过Ctrl
+p
选择上一个
VIM更换配色
- 使用
:colorscheme
显示当前的主题配色,默认为default
- 使用
:colorscheme <Ctrl + d>
可以显示所有的配色(注:colorscheme后有空格) - 使用
:colorscheme 配色名
可以更换配色
还可以从网上下载配色
VIM 映射
VIM 映射就是把一个操作映射到另一个操作。
基本映射
基本映射指的是 normal 模式下的映射。
- 使用
map
就可以实现映射。比如::map - x
:将-
映射为x
,:unmap -
取消映射;按下-
就可以删除字符;:map <space> viw
:按下空格可以选中整个单词;:map <c-d> dd
:使用Ctrl
+d
执行dd
删除一行
其他模式映射
用 nmap/vmap/imap
定义映射只在 normal/visual/insert
模式下分别有效。
非递归映射
使用 *map
对应的 nnoremap/vnoremap/inoremap
(nore 表示 no recursion 非递归) normal 模式下的非递归映射/ visual 模式下的非递归映射/ insert 模式下的非递归映射