Skip to content

掌握 Vim 使用 ​

Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

Neovim 是基于 Vim 的速度更快的编辑器,也是 Vim 的良好替代品。官网: https://neovim.io/

运行模式 ​

vi/vim 可以分为三种状态,分别是普通模式、插入模式和命令模式,各模式的功能区分如下:

普通模式 ​

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段,以其它任何模式按 Esc 即可进入普通模式

按键描述助记
i在当前光标字符前插入insert
a在当前光标字符后插入append
I在当前行首插入Insert
A在当前行尾插入Append
o在下方开一新行,插入open
O在上方开一新行,插入Open
r替代字符,将当前字符替代为紧跟着输入的字符replace
R进入替代模式,将当前及之后的字符都替代为紧跟着输入的字符串,直到按 Esc 返回 Normal 模式Replace
gj移动到屏幕折行后的下行
gk移动到屏幕折行后的上行

命令模式 ​

命令模式是在普通模式下按 : 进入,用于搜索、保存退出等操作。

命令说明
:w保存文件
:w file另存为文件
:q退出
:q!放弃修改退出
:wq保存修改并退出
:e hd.ts打开 hd.ts 文件
:e src/**/index.ts打开 src 子目录下的 index.ts,按 tab 键有文件列表提示

可视化模式 ​

在普通模式下按 v 进入可视模式

指令说明
v字符可视化模式,文本选择是以字符为单位
V行可视化模式,文本选择是以行为单位
Ctrl+V块可视化模式,可以选择一个矩形内的文本

下面是指定在行首添加 houdunren.com 的示例:

  1. Shift+V 进入可视模式
  2. :normal 表示在可视模式执行 normal 指令
  3. Ihoudunren.com 表示在行首插入 houdunren.com

常用命令 ​

移动命令 ​

Vim 的各种移动命令主要是在标准模式下:

按键描述
h光标左移
j光标下移
k光标上移
l光标右移
0跳到行首,可以理解为无穷大的 h
^跳到行首开始的第一个非空白字符
$跳到行尾,可以理解为无穷大的 l
gg跳到首行,可以理解为无穷大的 k
G跳到末行,可以理解为无穷大的 j
w跳到下一个词首
ge跳到上一个词尾
b跳到单词开头
e跳到单词尾部
5k向上移动 5 行
5j向下移动 5 行
5w向后移动 5 个词
fx向前移动到字符 x 上
Fx向后移动到字符 x 上
tx移动到字符 x 前
Tx向后移动到字符 x 前
zz当前行设为页面中心
Ctrl+o移动到上次编辑位置,可以跨文件操作
Ctrl+i从上次编辑位置移动到本次编辑位置,可以跨文件操作

制表符 ​

按键说明
:6,16>6 行到 16 行向右缩进
:6,16<6 行到 16 行向左缩进

选择 ​

按键说明
vt]选择到 ],不包含 ],也适用于 ),}
va]选择到 ],包含 ],也适用于 ),}

剪切操作 ​

按键说明
x删除当前光标所在处的字符
X删除当前光标左边的字符
d$删除从光标到一行末尾的整个文本
d0删除从光标到一行开头的所有单词
dd删除当前光标处的一整行
5dd删除从光标开始处的 5 行代码
dgg删除从光标到文本开头
dG删除从光标到文本结尾
di"删除在引号之间的内容
dit删除HTML标签内容
dtx向后删除字符直到遇到第一个x字符
dw删除到下一个单词的词首
dW删除到右边界
daw删除到左或边界,适合删除 HTML 属性
diw删除光标所在单词
daw删除光标所在单词,包括空格
dit删除 html 标签内容
dat删除 html 标签
vat选择 html 标签
D删除到行尾
C删除到行尾,进入插入模式
c^删除到行首
c$删除到行尾
ciw删除单词并进行修改
caw删除单词和空格并进行修改

复制粘贴 ​

按键说明
y复制
p粘贴
yy复制一整行
2yy复制从当前光标所在行开始的 2 行
yit复制标签内容
yat复制完整标签
yG复制到最后
y{复制到段落开始
y}复制到段落结尾
yiw复制单词并移到词首
yaw复制单词并移到上个单词尾部
yit复制 html 标签内容
yat复制 html 标签
yi{复制 { 内的内容,不包含 {,也适用于( }等
ya{复制 { 内的内容,包含 {,也适用于( }等

删除修改 ​

按键说明
cw删除从光标处到单词结尾的文本并进入到插入模式
cb删除从光标处到单词开头的文本并进入到插入模式
cc删除一整行并进入到插入模式
r替换当前光标下的字符
R进入到替换模式
ctx向后修改内容到 x,也就是意味着删除光标到 x 中间内容,并进入插入模式
ci"改写双引号中的内容
cc编辑当前行
c^删除到行首,并进入编辑模式
c$删除到行尾,并进入编辑模式
cw删除到词结束并进入编辑
ciw删除整个单词并进入编辑
caw删除整个单词并进入编辑,包含左右空格边界
d2t)删除到第2个括号
Shift+d删除到行尾
d+^删除到行首
d+$删除到行尾
d+$删除到行尾
c+^删除到行首,并进入编辑
c+$删除到行尾,并进入编辑
di}删除花括号内容,不包含 },也适用于 )、]
da}删除花括号内容,包含 },也适用于 )、]
diw删除单词,不包含左右空格边界
daw删除单词,包含左右空格边界
d2i}删除2层}的内容
d2i}删除 2 层 } 的内容
dip删除连接段落
cip删除连接段落,并进入编辑
dit删除 HTML 标签内容
cit删除 HTML 标签内容,并进入编辑模式

注释操作 ​

按键说明
gcc注释
gc2j注释两行

环绕字符 ​

按键原内容结果
单词加引号 ysiw'houdunren.com'houdunren.com'
添加标签 ysiwt h2houdunren.com

houdunren.com

整行加引号 yss"houdunren.com 后盾人"houdunren.com 后盾人"
替换为单引号 cs"'"houdunren"'houdunren.com'
整行替换 cS'"'houdunren'"houdunren"
替换引号为标签 cs"t h2'houdunren'

houdunren

删除引号 ds''ds'ds
删除标签 dst
houdunren
Houdunren

查找替换 ​

按键说明
:/string正向查找
:?string反向查找
fx向后查找 x 字符,按 ; 继续查找
Fx向前查找 x 字符,按 ; 继续查找
fa向右查找 a
Fa向左查找 a
2fa向右查找第 2 个 a
2Fa向左查找第 2 个 a
:%s/hd/houdunren/g全局搜索hd替换为houdunren
:5,12s/hd/houdunren/g从第5行到12行替换hd为houdunren
:.,+2s/hd/houdunren/g从当前行到后两行替换hd为houdunren

快速跳转 ​

按键说明
gg跳转到第一行
G跳转到最后一行
5G跳到第 5 行
:5跳转到第 5 行(命令模式)
{到段首
}到段尾
Shift+*向下跳转到同名单词位置
Shift+#向上跳转到同名单词位置
Shift+n跳转到使用 Shift+* 的下一个单词
Ctrl+d向下翻半页
Ctrl+u向上翻半页
Ctrl+f向下翻页
Ctrl+b向上翻页
%跳转到匹配的块如 }、)、]

撤销重做 ​

如果使用 VSCode 也可以直接使用 Ctrl+Z 等原来的方式操作

按键说明
u撤销上一步的操作
Ctrl+r将原来的撤销重做一遍

窗口管理 ​

命令说明
:vs 或 :vsplit左右分屏
:sp 或 :split上下分屏
:vertical resize 80设置宽度 80%
:resize 80设置高度 80%
Ctrl+w c关闭当前窗口
Ctrl+w o关闭其他窗口
Ctrl+w h切换左边窗口
Ctrl+w j切换上边窗口
Ctrl+w k切换下面窗口
Ctrl+w l切换右面窗口
Ctrl+w w窗口间循环切换
Ctrl+w x窗口互换
Ctrl+w H从水平布局到垂直布局
Ctrl+w J从垂直布局到水平布局
:ls查看缓冲区文件

文件操作 ​

使用编辑器时我需要在最近文件间的切换操作,VIM 提供了相关的指令

命令说明
:w保存文件
:e编辑文件
:ls查看缓冲区文件
:bn编辑下一个文件
:bp编辑上一个文件
Ctrl+6最近被编辑的两个文件之间的切换
:b1~n编辑打开的文件,1~n 是缓冲区文件列表的序号
gf光标停留文件路径字符时,使用 gf 可以直接打开访问文件

标签管理 ​

命令说明
:tabe打开新标签
:tabnext下一标签
:+tabnext上一标签

修改配置文件来定义键盘映射会让操作变得方便:

vim
"============标签管理============
map tt :tabe<CR>
map tj :-tabnext<CR>
map tk :+tabnext<CR>

缓冲区 ​

命令说明
:ls查看缓冲区文件
:bn编辑下一个文件
:bp编辑上一个文件

块操作 ​

使用块操作可以批量操作内容:

命令说明
v普通块模式
Shift+v行块模式
Ctrl+v可视块模式

下面使用行块模式批量添加内容:

  1. 进行行块模式
  2. 敲 : 进入命令模式
  3. 之后敲的命令就是对每行的操作,比如敲入 :normal I houdunren- 表示在 normal 模式下首行前添加 houdunren- 字符

下面通过可视块批量在每行前添加字符 houdunren:

  1. Ctrl+v 进入可视块模式
  2. Shift+G 选中到页面底部
  3. Shift+i 进入编辑模式,输入 houdunren
  4. Esc 所有可视块区域前添加了字符 houdunren

拼写检查 ​

nvim 内置了对错误单词的拼写检查,执行以下命令开关拼写检查:

vim
:set spell!

标准模式下:

  • 移动到错误单词上按 z= 将弹出建议的单词,然后敲单词前的数字键就可以完成替换

编辑模式:

  • 在编辑模式下按 Ctrl+x s 也会弹出单词建议

其他命令 ​

命令说明
zc折叠代码块
zo展开代码块
zC折叠所有代码块
zO展开所有代码块

键盘映射 ​

可以对按键布局进行自定义设置,在 ~/.config/nvim/init.vim 文件中配置:

  • nmap 为 normal 模式
  • imap 为 insert 模式
  • <LEADER> 为前缀键,let mapleader=" " 将 LEADER 定义为空格
  • C 为 ctrl 键如 <C-b> 指 ctrl+b
vim
" ============ 键盘映射
let mapleader=" "
nmap ge :CocCommand explorer
nmap S :w <CR>
nmap Q :q <CR>
nmap <C-p> :FZF <CR>
nmap H <Home>
nmap L <End>
imap jj <Esc>

" ============ 分屏
nmap <LEADER>vh :vsplit<CR>
nmap <LEADER>vj :split<CR>
nmap <LEADER>w <C-w>

" ============ 文件树
nmap <C-b> ge <CR>

屏幕分割 ​

命令说明
split水平分屏
vsplit垂直分屏

可以在配置文件中定义热键,来简化分屏操作:

vim
"分屏热键
nmap sl :set splitright<CR>:vsplit<CR>
nmap sh :set nosplitright<CR>:vsplit<CR>
nmap sk :set nosplitbelow<CR>:split<CR>
nmap sj :set splitbelow<CR>:split<CR>

剪贴板共享 ​

manjaro 系统剪贴板共享,需要安装以下命令:

bash
sudo pacman -S xsel

然后在 ~/.config/nvim/init.vim 配置文件中添加:

vim
set clipboard+=unnamedplus