Vim 是 Linux 上常用的文本编辑器,但是它的使用方法和很多现代编辑器不同,初学者可能会觉得使用困难

最好的学习 Vim 的方式是查看官方的内置帮助文件

vim
:help

# Vim

不同于一般编辑器的直接输入,Vim 存在使用模式,一般有如下四个

  • 正常模式 (Normal mode)
  • 插入模式 (Insert mode)
  • 可视模式 (Visual mode)
  • 命令模式 (Command mode)

编辑器的底部会显示当前所处的模式

  • -- INSERT -- 表示插入模式
  • -- VISUAL -- 表示可视模式
  • : 表示命令模式
  • 没有任何标识表示正常模式

# 正常模式

Vim 在启动时,一般默认为正常模式
在任意模式下,按 Esc 键可以切换回正常模式
命令模式或者可视模式下执行完操作以后,就会自动进入正常模式

正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作
此时键盘的输入不会被视为文本内容,而是视为命令

在这个模式下,可以通过键盘在文本中快速移动光标

# 插入模式

在正常模式中按下个别字母键(如 iao 等)可以进入插入模式
在插入模式下,键盘的输入会被直接视为文本内容
按下 Esc 键可以退出插入模式,回到正常模式

# 可视模式

在正常模式下,按下 v 键可以进入可视模式
在可视模式下,可以使用光标移动键选择文本内容

# 命令模式

在正常模式下,按下 : 键可以进入命令模式
在命令模式下,可以输入各种命令来执行文件操作,如保存、退出、查找等
按下 Enter 键可以执行命令,执行完毕后会自动回到正常模式

# 基本操作

通过 Vim 打开文件

vim <file>

也可以同时打开多个文件

vim <file1> <file2> ...

直接打开多个文件时,Vim 默认显示第一个文件,可以通过命令模式切换

  • :ls 列出所有打开的文件
  • :b1 切换到第 1 个文件
  • :b2 切换到第 2 个文件
  • 以此类推

如果需要分屏,加入 -O-o 参数

vim -On file1 file2
vim -on file1 file2
  • -O 参数表示垂直分屏
  • -o 参数表示水平分屏
  • n 表示分屏的数量,替换为数字,默认是 2

也可以分割当前打开的文件

  • Ctrl + w + v 垂直分屏
  • Ctrl + w + s 水平分屏

在已经打开了的 Vim 窗口中,可以通过命令模式分割打开新的文件

  • :vsp <file> 垂直分屏打开文件
  • :sp <file> 水平分屏打开文件

但是光标在不同文件中不是直接切换移动,需要使用快捷键

  • Ctrl + w + h 切换到左侧窗口
  • Ctrl + w + j 切换到下方窗口
  • Ctrl + w + k 切换到上方窗口
  • Ctrl + w + l 切换到右侧窗口

文件位置的切换

  • Ctrl + w + H 将当前窗口移动到最左侧
  • Ctrl + w + J 将当前窗口移动到最下方
  • Ctrl + w + K 将当前窗口移动到最上方
  • Ctrl + w + L 将当前窗口移动到最右侧

关闭分屏

  • Ctrl + w + c 关闭当前窗口
  • Ctrl + w + q 关闭当前窗口,如果是最后一个窗口则退出 Vim

退出 Vim

  • :w 保存文件,但是不退出
  • :w! 强制保存文件
  • :w <file> 另存为文件
  • :q 退出当前窗口,如果是最后一个窗口则退出 Vim
  • :q! 强制退出当前窗口,不保存修改
  • :wq 保存并退出当前窗口,也可以使用快捷键 ZZ
  • :x 保存并退出当前窗口,等同于 :wq
  • :e <file> 打开文件
  • :e! 放弃修改,重新加载当前文件

# 文本输入

如果需要在 Vim 中输入文本,需要进入插入模式,插入模式有多种进入方式

  • i 在光标所在的 字符前,插入文本
  • I 在光标所在行的 行首,插入文本
  • a 在光标所在的 字符后,插入文本
  • A 在光标所在行的 行尾,插入文本
  • o 在光标所在行的 下方,插入新行,插入文本
  • O 在光标所在行的 上方,插入新行,插入文本
  • s 删除光标所在的 字符,并进入插入模式
  • S 删除光标所在的 整行,并进入插入模式
  • cw 删除光标所在位置到单词结尾的内容,并进入插入模式

# 命令

在命令模式下,可以输入各种命令来执行文件操作

  • ':set nu` 显示行号
  • :set nonu 关闭行号显示
  • :n 定位到 n 行
  • /<text> 查找文本 <text>
  • n1,n2d 删除第 n1 行到第 n2 行的内容
  • u 撤销上一步操作