Skip to content

Unix / Linux - vi 编辑器

vi 编辑器(及其增强版继承者 vim - Vi IMproved)是一个功能强大的、面向屏幕的文本编辑器,在类 Unix 系统中无处不在。虽然它以陡峭的学习曲线而闻名,但掌握其基础知识对于系统管理和开发来说是无价的。

为什么要学习 vi/vim?

  • 可用性(Availability):几乎总是存在,即使在最小的系统安装中也是如此。
  • 效率(Efficiency):模式编辑允许用少量按键完成复杂操作,一旦学会。
  • 资源占用少(Resourcefulness):它需要极少的系统资源。
  • 强大(Power):vim 提供了丰富的功能,如语法高亮、多级撤销、分割窗口和庞大的插件支持。

本教程重点介绍 vi 和 vim 共有的基本命令。我们将使用 vim 作为示例,因为这是大多数用户现在遇到的版本。如果你安装了 vim,可以尝试运行 vimtutor 来获取一个优秀的交互式教程。

  • vim filename: 打开 filename。如果文件不存在则创建它。
  • vim: 不指定文件打开 vim。
  • vim -R filename or view filename: 以只读模式打开。
$ vim my_document.txt

vim 启动时,你会看到文件内容(或空缓冲区),底部有状态信息。以 ~ 开头的行表示它们不是文件的一部分。

Vim 的强大之处(以及初学时的困惑)源于其模式化特性。你始终处于几种模式之一:

  • 普通模式(Normal Mode):默认模式。用于导航、命令、删除、复制、粘贴。按键被解释为命令,而不是文本输入。按 Esc 从其他模式返回此模式。
  • 插入模式(Insert Mode):用于直接向文件中输入文本。使用 i、a、o 等命令进入插入模式。按 Esc 退出插入模式并返回普通模式。
  • 可视化模式(Visual Mode):用于选择文本(按字符 v、按行 V、按块 Ctrl+V)。普通模式下的命令通常作用于可视化选区。按 Esc 退出。
  • 命令行模式(Command-Line Mode):在普通模式下输入 : 进入。允许执行扩展命令,如保存 (:w)、退出 (:q)、搜索/替换 (:s)、设置选项 (:set)。按 Enter 执行命令,Esc 取消。

经验法则:如果你不确定当前处于哪种模式,按一次或两次 Esc 键以确保处于普通模式。

在普通模式下,使用命令行模式 (:) 命令:

  • :q - 退出(如果文件有未保存的更改,则会失败)。
  • :q! - 不保存退出(放弃更改)。请务必谨慎使用!
  • :w - 写入(保存)当前文件。
  • :w filename - 写入(保存)到名为 filename 的新文件。
  • :wq - 写入(保存)然后退出。
  • :x - 如果有更改则写入(保存),然后退出(类似于 :wq)。

普通模式下的快捷键(无需输入 :):

  • ZZ - 保存并退出(等同于 :wq 或 :x)。
  • ZQ - 不保存退出(等同于 :q!)。

确保你处于普通模式 (Esc)。

按键操作
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds
tds

许多导航命令可以加上计数前缀(例如,5j 向下移动 5 行,3w 向前移动 3 个单词)。

命令操作
tds
tds
tds
tds
tds
tds

记住在插入文本后按 Esc 返回普通模式。

命令操作
tds
tds
tds
tds
tds
tds
tds
tds

将 d 与移动命令结合使用(例如,d2j 删除当前行和下一行,df<char> 删除直到下一个 <char> 出现的位置)。可以加上计数前缀(例如,3dd 删除 3 行)。

改变命令通常会删除文本,然后进入插入模式。

命令操作
tds
tds
tds
tds
tds
tds
tds

将 c 与移动命令结合使用(例如,c2w 改变接下来的两个单词)。可以加上计数前缀(例如,3cc 改变 3 行)。

复制 (Yank) 与粘贴 (Put)(普通模式)

Section titled “复制 (Yank) 与粘贴 (Put)(普通模式)”

y 代表 ‘yank’(复制)。

命令操作
tds
tds
tds
tds
tds

将 y 与移动命令结合使用。可以使用计数(例如,3yy 复制 3 行)。请注意,d 命令也会将删除的文本放入同一缓冲区中供粘贴。

使用可视化模式: 进入可视化模式(v、V、Ctrl+V),使用导航键选择文本,然后按 d 删除选区,按 y 复制选区,或按 c 改变选区。

  • u - 撤销上一次更改。Vim 支持多级撤销;持续按 u 可以进一步回退。
  • Ctrl+r - 重做上一次撤销的更改。
  • /<pattern> - 向前搜索 <pattern>。按 Enter。
  • ?<pattern> - 向后搜索 <pattern>。按 Enter。
  • n - 在同一方向重复上一次搜索。
  • N - 在相反方向重复上一次搜索。

有用设置(使用 :set 命令):

  • :set ic - 搜索时忽略大小写。
  • :set noic - 大小写敏感搜索(默认)。
  • :set hls - 高亮所有搜索匹配项。
  • :set is - 增量搜索(边输入边显示匹配项)。

要清除搜索高亮::noh (no highlight)。

语法::[range]s/search/replace/[flags]

  • :s/old/new/ - 替换当前行中 old 的第一次出现为 new。
  • :s/old/new/g - 替换当前行中 old 的所有出现为 new (g = 全局)。
  • :%s/old/new/g - 替换整个文件中 old 的所有出现为 new (% = 所有行范围)。
  • :%s/old/new/gc - 替换文件中所有出现,但对每次替换进行确认 (c)。

在命令行模式下:

  • :! command - 在 shell 中执行 command 并显示输出。按 Enter 返回 vim。(例如,:! ls -l,:! python script.py)
  • :r !command - 读取 command 的输出并将其插入到当前行下方。
  • :w !command - 将文件内容作为标准输入写入到 command。

在命令行模式下:

  • :set number 或 :set nu - 显示行号。
  • :set nonumber 或 :set nonu - 隐藏行号。
  • :set autoindent 或 :set ai - 自动缩进新行。
  • :set expandtab 或 :set et - 使用空格代替 Tab 字符。
  • :set tabstop=4 或 :set ts=4 - 设置 Tab 宽度为 4 个空格。
  • :set shiftwidth=4 或 :set sw=4 - 设置缩进宽度为 4 个空格。
  • :syntax on - 启用语法高亮(通常基于文件类型自动启用)。
  • :help option - 获取特定选项的帮助(例如,:help tabstop)。

要使设置永久生效,请将它们添加到你的 vim 配置文件中,通常是 ~/.vimrc。

这涵盖了基础知识。vim 功能极其深入;探索 vimtutor、内置帮助 (:help) 和在线资源,学习更多高级功能。