Skip to content

Vim

约 2083 个字 预计阅读时间 8 分钟

Warning

由于我本人并不常用 vim,平日里大多使用 VSCode 等图形化编辑器来写代码写文档,因此这里我只打算简单记录一点 vim 的常见命令,更多内容请参考官方文档或其他教程。

编辑模式

Vim 的设计思路在我们花大部分时间在阅读、浏览文本,少部分时间用在编辑文本的基础上,它具有以下几种操作模式:

  • 正常模式(默认模式,Normal mode):可操控光标在文本各处移动,执行删除、复制、粘贴等命令
  • 插入模式(Insert mode):可插入文本,类似于其他文本编辑器的普通模式
  • 替换模式(Replace mode):可插入文本,插入的文本会覆盖光标所在位置的原有文本
  • 可视化模式(Visual mode):包括字符可视化模式、行可视化模式和块可视化模式,可选中一段文本进行操作
  • 命令行模式(Command-line mode):可执行保存、退出等命令

在不同的操作模式下,相同按键的功能会有所不同。例如在插入模式下 x 会向文本插入普通字符 x,而在正常模式下 x 则表示删除光标所在位置的字符,在可视化模式下 x 则表示删除选中的文本。

我们可以使用 ++Esc++ 键任何其他模式切换回正常模式,在普通模式下

  • 使用 i 键切换到插入模式
  • 使用 R 键换到替换模式
  • 使用 v 键切换到字符可视化模式
  • 使用 V 键切换到行可视化模式
  • 使用 ++Ctrl+v++ 切换到块可视化模式
  • 使用 : 键切换到命令行模式。

基本知识

插入文本

我们可以直接在正常模式下键入 i 进入插入模式,然后像在别的编辑器里那样输入文本,输入完成后按 ++Esc++ 键返回正常模式,但这显然不够高效。

缓存,标签页,窗口

在 Vim 中有着 buffer、 tab 和 window 三个概念:

  • buffer(缓存):Vim 中打开的每个文件都会被加载到一个 buffer 中,buffer 是对文件内容的抽象表示,可以在不同的窗口和标签页中显示同一个 buffer 的内容
  • tab(标签页):Vim 支持多标签页,每个标签页可以包含多个窗口,标签页用于组织和管理不同的工作空间
  • window(窗口):Vim 支持在同一个标签页中分割多个窗口,每个窗口可以显示不同的 buffer 或同一个 buffer 的不同部分

当我们使用 Vim 打开一个文件时,Vim 会默认打开一个 tab,这个 tab 中包含一个 window,window 中显示了该文件对应的 buffer 的内容。

当我们使用命令 :q 时实际上做的是关闭当前选中的 window,如果当前 tab 中只剩下一个 window,那么关闭该 window 的同时也会关闭该 tab,即返回我们的 shell 界面。

命令行模式

在正常模式下键入 : 键可以进入命令行模式,在命令行模式下我们可以执行一些常用的命令:

  • :q:退出当前窗口,如果当前窗口是最后一个窗口,则退出 Vim
  • :q!:强制退出当前窗口,放弃所有未保存的更改
  • :w:保存当前文件
  • :wq:x:保存当前文件并退出 Vim
  • :e <filename>:打开或编辑指定的文件
  • :ls:列出当前所有打开的 buffer
  • :help <command>:查看指定命令的帮助文档,例如 :help :w 查看保存命令 :w 的帮助文档,:help w 查看普通模式下 w 键的帮助文档

Vim 的接口

Vim 最重要的设计思想是 Vim 的界面本身是一个程序语言。键入操作(以及他们的助记名) 本身是命令,这些命令可以组合使用。

移动

大多数时候我们会在正常模式中使用移动命令让光标在文本中移动。Vim 中的移动命令也被称为“名词”,因为它们指向某些文本块。

描述移动的时候使用向前向后可能会有歧义,这里我干脆直接用“正向”和“反向”来描述移动方向,正向表示从文本开头到结尾的方向,反向表示从文本结尾到开头的方向。

  • 基本移动:h、j、k、l:分别向左、下、上、右移动一个字符
  • 关于单词:
    • w:正向移动到下一个单词开头
    • b:反向移动到上一个单词开头
    • e:反向移动到当前或下一个单词结尾
  • 行:
    • 0:移动到当前行的行首
    • ^:移动到当前行的第一个非空字符处
    • $:移动到当前行的行尾
  • 页面(屏幕):
    • H:移动到当前页面的顶部(highest)
    • M:移动到当前页面的中间(middle)
    • L:移动到当前页面的底部(lowest)
  • 翻页:
    • Ctrl+d:向下滚动半页
    • Ctrl+u:向上滚动半页
  • 文件:
    • gg:移动到文件开头
    • G:移动到文件结尾
    • nG:移动到文件的第 n 行,例如 5G 移动到第 5 行
  • 查找:
    • f<char>:正向查找字符 <char>,并将光标移动到该字符处
    • F<char>:反向查找字符 <char>,并将光标移动到该字符处
    • t<char>:正向查找字符 <char>,并将光标移动到该字符前一个位置
    • T<char>:反向查找字符 <char>,并将光标移动到该字符后一个位置

编辑

在 Vim 中,几乎所有原先需要用鼠标来做的事现在都可以用键盘来解决:编辑命令与移动命令结合使用,可以对文本进行各种操作。

Vim 的编辑命令也被称为“动词”,因为动词可以施加于名词(移动命令)上,从而对文本进行操作。

  • i 进入插入模式
  • O / o:在当前行上方/下方插入新行,并进入插入模式
  • d<motion>删除从光标当前位置到指定位置的文本
    • 例如 dw 删除从光标当前位置到下一个单词开头的文本
    • d$ 删除从光标当前位置到当前行行尾的文本
    • dd 删除当前行
  • c<motion>更改从光标当前位置到指定位置的文本,并进入插入模式
    • 例如 cw 更改从光标当前位置到下一个单词开头的文本
    • c$ 更改从光标当前位置到当前行行尾的文本
    • cc 更改当前行
  • x:删除光标所在位置的字符,等同于 dl
  • s:替换字符,等同于 xi
  • 可视化模式 + 操作
    • 先使用可视化模式选中一些文本,在使用 d 进行删除或 c 进行更改
  • u:撤销上一个操作(undo)
  • ++Ctrl+r++:重做上一个被撤销的操作(redo)
  • .:重复上一个编辑命令
  • y:复制(yank)选中的文本
    • 例如 yw 复制从光标当前位置到下一个单词开头的文本
    • y$ 复制从光标当前位置到当前行行尾的文本
    • yy 复制当前行
  • p:在光标后粘贴(put)复制的文本
  • P:在光标前粘贴(put)复制的文本

其他操作

计数

我们可以使用数字来重复执行某些操作,例如:

  • 5j:向下移动 5 行
  • 3w:正向移动到第三个单词开头
  • 3dw:删除从光标当前位置到第三个单词开头的文本

修饰语

我们可以使用修饰语来改变名词的含义。i 表示 inside,a 表示 around。

  • ci(:更改括号内的内容
  • di(:删除括号内的内容
  • da':删除当前单引号内的内容,包括单引号

同时我们还可以使用 % 来在括号、花括号、方括号等成对出现的符号之间跳跃,比如当我们的光标在一个左括号 ( 上时,按 % 会将光标跳转到对应的右括号 ) 上。

Comments