本文最后更新于 209 天前 ,文中信息可能已经过时。如有问题请在评论区留言。

简介

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

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

连 vim 的官方网站 (https://www.vim.org/) 自己也说 vim 是一个程序开发工具而不是文字处理软件。

Vim 的三种模式

基本上 vi/vim 共分为三种模式,命令模式(Command Mode)、输入模式(Insert Mode)和命令行模式(Command-Line Mode)。

命令模式(Command Mode)

vim 的默认模式,即启动 vim 后就进入该模式,也称普通模式。在此模式下敲击键盘的动作会被识别为命令,而非输入字符,比如此时按下 i ,并不会输入字符 i ,而是进入输入模式。

输入模式(Insert Mode)

在命令模式下按下 i 即可进入输入模式,使用 Esc 键可以返回到命令模式。

当然也可使用 aos 等进入输入模式。参考 附录:vi / vim graphical cheat sheet

在输入模式中,可以使用如下按键:

  • 字符按键 以及 Shift 组合 :输入字符
  • Enter (回车键):换行
  • Backspace (退格键):删除光标前的一个字符
  • Delete (删除键):删除光标后的一个字符
  • 方向键 :在文件中移动光标
  • Home / End :移动光标到行首 / 行尾
  • Page Up / Page Down :上 / 下翻页
  • Insert :切换光标为输入 / 替换模式,光标将变成竖线 / 下划线
  • Esc :退出输入模式,切换到命令模式

命令行模式(Command-Line Mode)

在命令模式下按下 : (英文冒号)就可以进入命令行模式。

基本命令有:

  • :w :保存文件
  • :q :退出 vim 编辑器
  • :wq :保存文件并退出 vim 编辑器
  • :q! :强制退出 vim 编辑器,不保存修改

Esc 键可随时退出命令行模式。

Vim 命令大全

光标移动

单个字符移动
h向左移动使用 数字+字符 可实现多个字符移动。例如:2h 向左移动 2 个字符
l向右移动
j向下移动
k向上移动
单词移动
w将光标移动到下一个单词的开头使用 数字+字符 可实现多个单词移动。例如:2w 将光标移动到第二个单词的开头
b将光标移动到前一个单词的开头
e将光标移动到下一个单词的词尾
E移动到单词的词尾(忽略标点符号)
ge将光标移动到上一个单词的词尾
行移动
$将光标移动到当前行的行尾
0将光标移动到当前行的行首
^将光标移动到当前行的第一个非空字符(行首和第一个非空字符不一定是一个位置)
%用于符号间的移动,它会在一对 ()[]{} 之间跳跃
文本块移动
(移动到当前句子的开头
)移动到下一个句子的开头
{移动到当前段的开头
}移动到下一段的开头
[[移动到当前节的开头
]]移动到下一节的开头
在屏幕中移动
nG跳转到指定的第 nG 移动到文件最后一行行首```` (2 次单引号)返回跳转前的位置
gg移动到文件开头
n%按百分比移动。移动到文件中间,就使用 50%
H移动 home
M移动到屏幕中间
L移动到一屏末尾
Ctrl + G查看当前位置状态

文本插入操作

命令说明
i在当前光标的前面插入字符
a在当前光标的后面追加字符
o在当前光标的下一行行首插入字符
I在一行的开头添加文本
A在一行的结尾处添加文本
O在光标当前行的上一行插入文本
s删除当前光标处的字符并进入到插入模式
S删除当前光标所在的行,并进入插入模式
u撤销修改

文本删除操作

字符删除
x删除当前光标所在处的字符
X删除当前光标左边的字符
单词删除
dw删除一个单词 (从光标处到空格)
daw删除光标所在的整个单词(无论光标在什么位置,包括空白字符)
diw删除整个单词文本(保留空格字符)
d2w删除从光标开始处的 2 个单词
d$删除从光标到一行末尾的整个文本
d0删除从光标到一行开头的所有单词
dl删除当前光标处的字符(等价于 x
dh删除当前光标左边的字符(等价于 X
行删除
dd删除从当前光标处的一整行(等价于 D
5dd删除从光标开始处的 5 行代码
dgg删除从光标到文本开头
dG删除从光标到文本结尾
行合并
J删除一个分行符,将当前行与下一行合并

文本复制、剪切与粘贴

  • y :复制
  • p :粘贴
  • yw :复制一个单词。 【拓展】y2w:复制 2 个单词
  • y$ :复制从当前光标到行尾的所有单词
  • y0 :复制从当前光标到行首的所有单词
  • yy :复制一整行 【拓展】2yy:复制从当前光标所在行的 2 行

复制文本块

  1. 首先进入 visual 模式:v
  2. 移动光标选择文本
  3. 复制与粘贴操作。

文本修改与替换

  • cw :删除从光标处到单词结尾的文本并进入到输入模式
  • cb :删除从光标处到单词开头的文本并进入到输入模式
  • cc :删除一整行并进入到输入模式
  • ~ :修改光标下字符的大小写
  • r :替换当前光标下的字符
  • R :进入到替换模式
  • xp :交换光标和下一个字符

文本查找与替换

  • /string :正向查找。例如:/123 从光标处开始往后查找字符串 123
  • ?string :反向查找。例如:?123 从光标处开始往前查找字符串 123
  • :s/old/new :将当前行的第一个字符串 old 替换为 new
  • :s/old/new/g :将当前行的所有字符串 old 替换为 new
  • :90s/old/new/g :将指定行的所有字符串 old 替换为 new
  • :90,93s/old/new/g :将指定范围的行的所有字符串 old 替换为 new
  • :%s/old/new/g :将文本中所有的字符串 old 替换为 new
  • :%s/old/new/gc :依次替换每个字符串关键字
  • :%s/^old/new/g :将所有以 old 开头的字符串替换为 new

高亮显示

:set hls 设置高亮显示。

* 键将当前光标处的单词高亮显示,使用 n 浏览下一个查找结果。

撤销修改、重做与保存

  • u :撤销上一步操作
  • Ctrl + r :将原来的操作重做一遍
  • :U :恢复一整行(文件打开时的状态)
  • :q :若文件没有修改,直接退出
  • :q! :若文件已经修改,放弃修改退出
  • :wq :若文件已经修改,保存修改并退出
  • :e! :放弃修改,重新回到文件打开时的状态

Vim 环境变更

如果在 windows 下使用 gvim,以下设置基本可以通过 gvim 设置调整。

指令描述
:set nu显示行号
:set nonu取消行号
:set ts=4设置 tab space 为 4 个空格(等价于 :set tabstop=4
:set expandtabtab 替换为指定数量的空格
:set autoindent设置为自动缩进
:set wrap启动折行
:set nowrap禁止折行
:set autoread设置当文件变化时,自动读取新文件
:set hls设置搜索结果高亮(等价于 :set hlsearch
:set nohls关闭搜索结果高亮(等价于 :set nohlsearch
:set guifont=consolas:h14设置字体为 consolas,字号为 14
:set history=700设置保存命令的行数
:set ff=unix将文件切换为 unix 格式,每行以 \n 结尾
:set ff=dos将文件切换为 Windows 格式,每行以 \r\n 结尾
:set enconding=utf-8设置 vim 展示文本时的编码格式
:set fileencoding=utf-8设置 vim 写入文件时的编码格式
:set filetype=html设置文件类型,方便语法高亮
:set background=dark设置背景颜色

状态查询

Vim 查询当前状态的命令,形式是一般命令后面添加 ?

text
1
:set [keyword]?

示例:使用 :set ff=dos 设置文件格式,那么就可以使用 :set ff? :查询当前的文件格式。

参考

附录:vi / vim graphical cheat sheet

vi-vim-cheat-sheet

附录:vi / vim 键盘图(汉化)

vi-vim-cheat-sheet-sch

附录:vi / vim tutorial

vi-vim-tutorial-1

vi-vim-tutorial-2

vi-vim-tutorial-3

vi-vim-tutorial-4

vi-vim-tutorial-5

vi-vim-tutorial-6

vi-vim-tutorial-7