# vim超实用指南

vim是一个Unix文本编辑器，它以快速高效而闻名，是在终端中运行的小应用程序（当然也有图形界面），它最主要的特点是完全可以通过键盘控制，而不需要菜单栏或鼠标。

例如，将文本插入到文件中，按i键并输入。浏览文本或输入命令，在键盘上按Esc，然后按下对应的任何键或组合键。对于大多数人来说，是一种非常不寻常的文本编辑方式，但这是基于Linux环境工作的开发者编辑配置文件、更改脚本、编写代码等操作的主流方式。
本文将介绍一些必要的基本命令，以供大家很快很容易地掌握vim编辑器。建议初学者在使用中进行学习，而不是只看不动手。不实战操作，那你可能很快忘记这些命令。

![d8e0137324b5ce8481bf2dc089ab0a89_239604967_1_20220217084356538.jpeg](https://cdn.hashnode.com/res/hashnode/image/upload/v1653658300149/GC6EC2hrk.jpeg align="left")

**使用vim打开文件后，一般会用到三种模式：命令模式（command mode）、输入模式（insert mode）和底行命令模式（last line mode）**。    
刚启动vim时，默认进入命令模式。这时候，我们敲打键盘的字母会被识别为不同的命令。如方向键**h、j、k、l**；输入键**i、a、o，**切换到输入模式；冒号键:，切换到底行命令模式。   
进入输入模式，可以任意的码入字母、符号，按**esc**键退出到命令模式。   
在底行命令模式，可以输入单个或者多个命令，按**enter**键结束运行。   

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653658628609/ZG1AbVx2q.png align="left")

1、vim的进入和退出：vi、vim、:q、:q!、:wq
在terminal中直接敲vi或vim打开文本
:q 退出文件
:q! 强制退出文件，丢弃你所做的任何改动
:wq 保存修改，然后退出文件

2、移动光标：h、j、k、l键
h左移、l右移、j下移、k上移，熟练使用hjkl键，习惯之后我们能很快地在屏幕四处移动光标。

3、插入、删除和撤销：i、A、x、u键、ctrl r
在command模式下：按下i键可以进入insert模式，在光标后插入文字，输入完成按esc键（A键，光标移动到本行末输入）；按下x键可以删除光标所在位置的字符；按下u键可以撤销操作，回到上一步。ctrl r撤销掉撤销命令。
按下esc键会回到command模式或者撤销一个不想输入或部分完整的命令。
4、删除类命令：dw、d$、dd
dw 从光标处删除至一个单词的末尾
d$ 从光标处删除至本行末尾
dd 删除光标所在行

5、在动作前输入数字会使操作重复那么多次
3dd 执行三次光标所在行，即往下删除三行
2w   使光标向前移动两个单词
0      移动到光标的行首

6、关于定位和文件状态
gg                  跳到文件第一行
G / shift g   跳到文件最后一行
ctrl g           显示当前编辑文件名和文件中光标位置
gf                     进入光标所在位置路径的文件

7、关于搜索命令
/   加上字符串可以用于在当前文件中查找该字符串
？用于反向查找
例如：/error <回车> 即可在文件中查找error
n键向下继续搜索，N键或shift n键向上继续搜索（shift 小写=大写）

8、替换命令
:s/old/new/g    g是全局进行匹配
多种操作需要多加学习应用

9、在vim内执行外部命令
输入 :! 然后输入外部命令即可执行该外部命令
所有的 : 命令都必须以敲回车键结束

10、使用操作符y复制文本，使用p粘贴文本
配合可视模式使用
多行操作是经常会用到的，切记！

11、set设置一些选项
:set xxx 可以设置 xxx 选项。一些有用的选项如下：
'ic' 'ignorecase'       查找时忽略字母大小写
'is' 'incsearch'          查找短语时显示部分匹配
'hls' 'hlsearch'          高亮显示所有的匹配短语

12、获取在线系统帮助
如下三种方法：
- 按下 <HELP> 键 (如果键盘上有的话)
- 按下 <F1> 键 (如果键盘上有的话)
- 输入  :help <回车>

13、启用更多的vim的特性
Vim 的功能特性要比 Vi 多得多，但其中大部分都缺省没有启用。为了使用更多的特性，需要创建一个 vimrc 文件。

  1. 开始编辑 vimrc 文件，具体命令取决于所用的操作系统：
:edit ~/.vimrc               这是 Unix 系统所使用的命令
:edit $VIM/_vimrc       这是 MS-Windows 系统所使用的命令

  2. 接着读取 vimrc 示例文件的内容：
:r $VIMRUNTIME/vimrc_example.vim

  3. 保存文件，命令为：
:write

  下次启动 Vim 时，编辑器就会有了语法高亮的功能。
  可以把喜欢的各种设置添加到这个 vimrc 文件中。
  要了解更多信息请输入 :help vimrc-intro

14、使用<tab>键进行命令行补全
补全对于许多命令都有效，当输入: 命令时，tab键可以匹配补全。

15、vim自带了一个教程说明，我们可以直接输入vimtutor，打开教程做相应的练习即可。

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653658757341/D2MDaJ_cG.png align="left")
全局
:h[elp] 关键字 - 打开关键字帮助

:sav[eas] 文件名 - 另存为

:clo[se] - 关闭当前窗口

:ter[minal] - 打开一个shell窗口

K - 打开光标所在单词的man页面

移动光标
h - 左移光标

j - 下移光标

k - 上移光标

l - 右移光标

H - 移动到当前页面顶部

M - 移动到当前页面中间

L - 移动到当前页面底部

w - 移动到下个单词开头

W - 移动到下个单词开头(单词含标点)

e - 移动到下个单词结尾

E - 移动到下个单词结尾(单词含标点)

b - 移动到上个单词开头

B - 移动到上个单词开头(单词含标点)

ge - 移动到上个单词结尾

gE - 移动到上个单词结尾(单词含标点)

% - 跳转到配对的符号(默认支持的配对符号组:: '()', '{}', '[]' - 在vim中使用 :h matchpairs 获得更多信息)

0 - 移动到行首

^ - 移动到行首的非空白符

$ - 移动到行尾

g_ - 移动到行内最后一个非空白符

gg - 移动到文件第一行

G - 移动到文件最后一行

5gg or 5G - 移动到第五行

gd - 跳转到局部定义

gD - 跳转到全局定义

fx - 移动到字符 x 下次出现的位置

tx - 移动到字符 x 下次出现的位置的前一个字符

Fx - 移动到字符 x 上次出现的位置

Tx - 移动到字符 x 上次出现的位置的后一个字符

; - 重复之前的f、t、F、T操作

, - 反向重复之前的f、t、F、T操作

} - 移动到下一个段落 (当编辑代码时则为函数／代码块)

{ - 移动到上一个段落 (当编辑代码时则为函数／代码块)

zz - 移动屏幕使光标居中

Ctrl   e - 向下移动屏幕一行(保持光标不动)

Ctrl   y - 向上移动屏幕一行(保持光标不动)

Ctrl   b - 向上滚动一屏

Ctrl   f - 向下滚动一屏

Ctrl   d - 向下滚动半屏

Ctrl   u - 向上滚动半屏

插入模式 - 插入/追加文本
i - 从光标前开始插入字符

I - 从行首开始插入字符

a - 从光标后开始插入字符

A - 从行尾开始插入字符

o - 在当前行之下另起一行, 开始插入字符

O - 在当前行之上另起一行, 开始插入字符

ea - 从当前单词末尾开始插入

Ctrl   h - 在插入模式下，删除光标前的字符

Ctrl   w - 在插入模式下，删除光标前的单词

Ctrl   j - 在插入模式下，另起一行

Ctrl   t - 在插入模式下，向右缩进，宽度由 shiftwidth 控制

Ctrl   d - 在插入模式下，向左缩进，宽度由 shiftwidth 控制

Ctrl   n - 在插入模式下，在光标之前插入自动补全的下一个匹配项

Ctrl   p - 在插入模式下，在光标之前插入自动补全的上一个匹配项

Ctrl   rx - 插入寄存器 x 的内容

Ctrl ox - 暂时进入正常模式以发出一个正常模式命令 x。

Esc - 退出插入模式

编辑文本
r - 替换当前字符

R - 在 ESC 按下之前，替换多个字符

J - 将下一行合并到当前行, 并在两部分文本之间插入一个空格

gJ - 将下一行合并到当前行, 两部分文本之间不含空格

gwip - 重新调整段落

g~ - switch case up to motion

gu - 小写操作修饰符

gU - 大写操作修饰符

cc - 将光标所在的行删除, 然后进入插入模式

C - 将光标处到行尾删除, 然后进入插入模式

c$ - 将光标处到行尾删除, 然后进入插入模式

ciw - 将光标所在的单词删除, 然后进入插入模式

cw or ce - 从光标位置开始, 修改单词

s - 删除当前字符, 然后进入插入模式

S - 清空当前行, 然后进入插入模式 (同cc)

xp - 当前字符后移

u - 撤销

U - 撤销上一次的改动行的操作

Ctrl r - 重做（取消撤销）

. - 再次执行上个命令

选择文本（可视化模式）
v - 进入可视化模式, 移动光标高亮选择,  然后可以对选择的文本执行命令

V - 进入可视化模式(行粒度选择)

o - 切换光标到选择区开头/结尾

Ctrl   v - 进入可视化模式(矩阵选择)

O - 切换光标到选择区的角

aw - 选择当前单词

ab - 选择被 () 包裹的区域(含括号)

aB - 选择被 {} 包裹的区域(含花括号)

at - 选择被 <> 标签包裹的区域(含<>标签)

ib - 选择被 () 包裹的区域(不含括号)

iB - 选择被 {} 包裹的区域(不含花括号)

it - 选择被 <> 标签包裹的区域(不含<>标签)

Esc - 退出可视化模式

可视化模式命令
> - 向右缩进

< - 向左缩进

y - 复制

d - 剪切

~ - 大小写切换

u - 将选中文本转换为小写

U - 将选中文本转换为大写

剪切, 复制, 粘贴
yy - 复制当前行

2yy - 复制 2 行

yw - 复制当前单词

yiw - 复制光标处的单词

yaw - 复制光标处的单词及其前后的空格

y$ - 复制, 从光标位置到行末

p - 在光标后粘贴

P - 在光标前粘贴

dd - 剪切当前行

2dd - 剪切 2 行

dw - 剪切当前单词

diw - 删除光标处的单词

daw - 删除光标处的单词及其前后的空格

D - 剪切, 从光标位置到行末

d$ - 剪切, 从光标位置到行末 (同<kbd>D</kbd>)

x - 剪切当前字符

文字缩进
>> - 将当前行向右缩进，宽度由 shiftwidth 控制

<< - 将当前行向左缩进，宽度由 shiftwidth 控制

>% - 向右缩进 () 或 {} 内的区域 (光标需置于括号上)

>ib - 向右缩进 () 内的区域

>at - 向右缩进 <> 标签内的区域

3== - 自动缩进 3 行

=% - 自动缩进 () 或 {} 内的区域 (光标需置于括号上)

=iB - 自动缩进 {} 内的区域 (光标需置于括号上)

gg=G - 自动缩进整个缓冲区

]p - 粘贴并调整缩进至当前行

退出
:w - 保存

:w !sudo tee % - 使用 sudo 保存当前文件

:wq or :x or ZZ - 保存并退出

:q - 退出(修改未保存时警告)

:q! or ZQ - 不保存强制退出

:wqa - 保存所有标签页并全部退出

查找/替换
/pattern - 查找<kbd>pattern</kbd>

?pattern - 向上查找<kbd>pattern</kbd>

n - 查找下一个

N - 查找上一个

:%s/old/new/g - 替换全部

:%s/old/new/gc - (逐个)替换

:noh[lsearch] - 移除搜索结果的高亮显示

多文件搜索
:vim[grep] /pattern/{`{file}`} - 在多个文件中搜索 <kbd>pattern</kbd>

:cn[ext] - 移动至下一个

:cp[revious] - 移动至上一个

:cope[n] - 打开搜索结果列表

标签
:tabnew or :tabnew {page.words.file} - 在新标签中打开文件

Ctrl   wT - 将窗口变成标签

gt or :tabn[ext] - 切换到下一个标签

gT or :tabp[revious] - 切换到上一个标签

#gt - 切换到第<kbd>#</kbd> 个标签

:tabm[ove] # - 移动标签到第<kbd>#</kbd> 位(下标从 0 开始)

:tabc[lose] - 关闭当前标签

:tabo[nly] - 关闭其他标签

:tabdo command - 在所有标签中执行命令 

多文件编辑
:e[dit] 文件名 - 新建缓冲区打开 filename

:bn[ext] - 切换到下个缓冲区

:bp[revious] - 切换到上个缓冲区

:bd[elete] - 关闭缓冲区

:ls or :buffers - 列出所有打开的缓冲区

:sp[lit] 文件名 - 新建缓冲区打开 filename 并水平分割窗口

:vs[plit] 文件名 - 新缓冲区打开 filename 并垂直分割窗口

:vert[ical] ba[ll] - edit all buffers as vertical windows

:tab ba[ll] - edit all buffers as tabs

Ctrl   ws - 水平分割窗口

Ctrl   wv - 垂直分割窗口

Ctrl   ww - 在窗口间切换

Ctrl   wq - 关闭窗口

Ctrl   wx - 将窗口切换到下一个窗口

Ctrl   w= - 使所有窗口的高度和宽度相等

Ctrl   wh - 切换到左侧窗口

Ctrl   wl - 切换到右侧窗口

Ctrl   wj - 切换到下侧窗口

Ctrl   wk - 切换到上侧窗口

Ctrl   wH - 使游标所在视窗全高并移至最左 (最左垂直视窗)

Ctrl   wL - 使游标所在视窗全高并移至最右 (最右垂直视窗)

Ctrl   wJ - 使游标所在视窗全宽并移至最下 (最下水平视窗)

Ctrl   wK - 使游标所在视窗全宽并移至最上 (最上水平视窗)


![bae55.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1653659157702/QlDRo4Bo-.png align="left")

