封面来源:https://geekdaxue.co/uploads/projects/haoyuechangge-quevp@vp0fm1/5643ae8476b3b305a0aacb8c33c0378c.jpeg

引言

在 Windows 系统上,我们一般使用 Notepad(记事本)或者是 Microsoft Office 作为文本编辑器(当然,也有用写字板或者 Notepad-- 等类似编辑器的),而在 Linux 上,不同的发行版(或桌面环境)为我们提供了不同的文本编辑器。例如,在 GNOME 上,默认的是 GNOME Text Editor,而 KDE Plasma 提供了 KWrite 和 Kate,其他的就不一一列举了。但是,如果摆在我们面前的是一个命令行界面,那上面的几个就完全没法运行(因为缺少图形界面配置)。这个时候也许有人会问:不是有 nano 吗?是的,但 nano 毕竟面向新手,尽管操作简单,其功能非常有限,默认也没有集成我们运维一行需要的代码高亮功能。因此,另一个选择,就是我们今天要讲的文本编辑器—— Vim.

关于 Vim

说起 Vim,就不得不提它的前辈—— Vi.

ViUnix 系统上最早的屏幕文本编辑器之一,由比尔·乔伊在 1976 年开发。它以简洁高效著称,尤其在低带宽终端环境下表现出色,仅仅在 Emacs 推出的前几年就成为当时程序员和系统管理员的首选工具。

Vi, Vim 和 Emacs 的爱恨情仇

正如开头所说,在命令行文本编辑器的世界里,Vim 并非唯一的选择。谈及它的历史,就不可避免地要提到另一个同样历史悠久且影响深远的编辑器——Emacs.

ViEmacs 的设计哲学截然不同,这也导致了它们之间长达数十年的“编辑器圣战”。Vi(以及后来的 Vim)秉承的是“模态编辑”理念,将插入文本和执行命令的模式分开,力求让手指不离键盘就能完成所有操作,效率极高。而 Emacs 则追求“用编辑器实现一切”,它本身就是一个可高度定化的运行时环境,通过 Elisp 语言,用户不仅可以编辑文本,还能集成邮件、新闻、调试器等功能,其目标是成为一个强大的工作平台。

尽管两者在理念上竞争,但它们共同定义了命令行文本编辑的黄金标准。Vim 以其无处不在(几乎所有类 Unix 系统都预装 Vi 兼容编辑器)和高效快捷著称;而 Emacs 则以其无与伦比的可扩展性和强大的功能集成见长。这场“圣战”没有真正的赢家,因为它们各自吸引着秉承不同哲学的信徒,共同推动了编辑器技术的不断发展,并为全世界的开发者和系统管理员提供了两种近乎完美的工具选择。

然而,随着计算机技术的发展,Vi 的功能逐渐显得局限。为适应更现代的编辑需求,布拉姆·米勒纳在 1991 年(也就是 Linux 内核第一个版本发布的同一年)基于 Vi 推出了增强版本——Vim(Vi Improved)。Vim 在完全兼容 Vi 的基础上,增加了多级撤销、语法高亮、插件扩展等强大功能。

如今,Vim 已成长为最受开发者喜爱的文本编辑器之一,有着诸如 NeoVimLunarVim 在内的多个分支。其独特的模态编辑思想,将命令与输入分离,尽管学习曲线陡峭,一旦熟练掌握却能极大提升编辑效率。无论是在服务器运维、程序开发还是日常文本处理中,Vim 都展现着历久弥新的价值。

安装与模式介绍

在 2025 年的今天,安装 Vim 是一件非常容易的事——因为各大发行版的软件包仓库内都有提供。在不同的发行版上安装 Vim 的命令如下:

# Debian/Ubuntu
sudo apt install vim

# Fedora/RHEL/CentOS
sudo dnf install vim

# Arch Linux/Manjaro
sudo pacman -S vim

# openSUSE
sudo zypper install vim

# NixOS
sudo nix-env -iA nixos.vim

或者,也可以搜索应用商店安装(如可能)。

下面来讲一讲 Vim 的几个模式:

  1. 命令模式(Command Mode):也叫作“一般模式”,这是进入 Vim 后首先看到的模式。请注意,不像 nano在此模式下无法对文本内容进行编辑必须切换到特定的“编辑模式”才能继续

  2. 编辑模式(Insert Mode):这是我们编辑文本时所处的模式。此时,我们可以对文本内容做任意改动。

  3. 命令行模式(Command Line Mode):也叫“扩展命令模式”“底线命令行模式”或“末行模式”。在该模式下,我们可以保存并退出编辑器,也可以丢弃更改,直接退出。这个模式下可用的命令是非常多的,一般在最后一行的开头有一个":"标识

  4. 可视模式(Visual Mode):这个模式允许我们在编辑器内选定一些文本并执行相关的命令。它的上手难度略微有些大,且现在鲜少有人使用。

基本命令

编辑一个文件

直接输入 vim FILENAME 即可开始编辑文件 FILENAME. 请注意,如果目标文件不存在,Vim 会自动创建一个同名的文件

切换模式

默认进入的模式是命令模式

要切换到编辑模式,只需按下 i 键:

此时可以直接编辑文本。按 Esc 键可以回退到命令模式。

要进入命令行模式,应输入":":

同样,退出该模式也是使用 Esc 按键。

保存并退出更改

命令行模式下,输入 w 命令以保存更改。后面有新文件名时,会将当前文件另存为新的文件

如果在输入 w 的同时再敲入 q,则会在保存更改的同时退出编辑器

请注意,q 命令的前提是需要保存更改。

强制退出

当你因为误操作不小心删除或更改了大片文本却不知道如何撤销,或者编辑器因某些原因卡死时,可以在命令行模式下直接使用 q! 命令强制退出。此时,你所做的一切改动都不会被保存(因为改动都在内存里面,这里利用的是内存的断电易失性)

进阶命令

下面的命令需要确保你处于命令模式

内容有些多,这里就用表格列出来。

里面只是一些常用的命令,疏漏在所难免。

更难的文本对象操作我们这里不会讲。

定位光标

上下左右移动(了解)

一般来说,我们可以直接使用方向键来移动光标。但实际上, Vim 也提供了其他方式让我们移动光标——不是 WSAD,而是 hjkl.

这是因为,以前的键盘是没有方向键的,并且在 Emacs 刚发明的那个年代,3D 游戏尚未兴起,人们没有用 WSAD 的惯例来控制方向。

定位到某个单词的开头结尾

命令

解释

w

将光标移动到下一个单词的开头

b

将光标移动到上一个单词的开头

e

将光标移动到当前单词的末尾

行内定位

命令

解释

0

跳到行首

$

跳到行末

^

跳到本行的第一个非空字符

n<Enter>

光标向下移动 n 行,输入 n 后按 Enter 键确认

f{char}

本行内光标位置开始向后的内容中查找第一个出现的字符 char

(这里的 {} 仅用于方便阅读与理解命令,实际输入命令时请不要输入)

t{char}

跳转到本行存在的指定字符 char 的前一个字符

文件内跳转

命令

解释

gg

跳到文件第一行

nG

跳到文件第 n 行。缺少 n 时,将跳转至最后一行

:LineNum

跳到文件的第 LineNum

Ctrl + F

向下翻页

Ctrl + B

向上翻页

查找与替换字符串

查找:

命令

解释

/str

从光标当前位置开始向下查找单词 str

n 查找下一个,N 查找上一个,注意大小写敏感

?str

从光标当前位置开始向上查找单词 str

*

查找与当前光标下的单词完全匹配的下一个词

替换:

你可能会发现,下面的命令和 sed 所使用的很像。

请注意,这些命令必须在命令行模式下使用。

命令

解释

:s/old/new/

将当前行第一个 old 替换为 new

:s/old/new/g

将当前行所有的 old 替换为 new

:a,b s/old/new/g

将第 a 行到第 b 行所有的 old 替换为 new

:%s/old/new/g

将整个文件内出现的所有 old 替换为 new

:%s/old/new/gc

效果同上,但在每次替换前 Vim 会请求确认

剪切,复制,粘贴或删除一行或多行内容

命令

解释

nx

从光标的当前位置开始,删除后面 n 个字符(缺少 n 时将仅删除光标所在的字符

ndd

从光标的当前位置开始,剪切下面的 n 行(缺少 n 时将仅剪切当前行)。

该命令也可以用于删除一行或多行内容

nyy

从光标的当前位置开始,复制下面的 n 行(缺少 n 时将仅复制当前行

p

将复制/剪切的内容粘贴在光标所在的下一行

P

将复制/剪切的内容粘贴在光标所在的上一行(注意是大写)

u

撤销/回退上一次做的更改

进入编辑模式的命令

命令

解释

i/I

i 表示在光标当前位置开始编辑,而 I 表示从当前行的第一个非空格/制表符开始编辑

a/A

a 表示在光标当前位置的下一个字符开始编辑,而 A 表示从当前行的最后一个字符开始编辑

o/O

o 表示在光标所在的下一行插入新的空行并编辑,而 O 表示在光标所在的上一行插入新的空行并编辑

显示/隐藏行号

不像 nanoVim 默认是隐藏行号的。如果要显示行号:

:set nu

要隐藏行号:

:set nonu

要显示控制字符:

:set list

总结

Vim 不仅仅是一个文本编辑器,它更代表了一种追求效率的哲学。从它的前身 Vi 在命令行时代的诞生,到它与 Emacs 在理念上的精彩博弈,再到自身通过模态编辑、组合命令和强大扩展性形成的独特生态,Vim 已经成为了程序员和系统管理员手中一件历久弥坚的利器。

它的学习曲线或许陡峭,初期会让人感到不适应。但一旦你突破了基础门槛,掌握了进阶命令,你就会发现一个全新的世界——在那里,编辑文本几乎成为一种无需思考的肌肉记忆,你的想法和意图能够几乎毫无延迟地转化为代码或文字。

总而言之,掌握 Vim 是一项一次投资、终身受益的技能。它让你无论在何种环境、何种设备上,都能拥有一个高效、强大且随心所欲的编辑环境。这正是 Vim 历经数十年技术变迁,依然屹立不倒、备受推崇的根本原因。

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维