VIM使用

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

325.2.3VIM使用

本节没有展示可编译的 C 源码。视频虽然把练习文件命名为 a.c,但文件内容只是为了演示编辑、打包和搜索而随意输入的字符串,不是 C 程序。因此标题下不添加 c 代码块,也不能根据 .c 扩展名虚构源码。

视频环境为 Ubuntu 20.04,普通用户名是 wfeng,主要在 ~/test 目录操作。本节依次演示 Vim、gedit、nano,以及 tar、find、grep、dmesg。以下内容把画面中的实际命令、原笔记的识别错误和适合日常使用的规范写法区分开来。

一、Linux文本编辑

Linux 中既有 Vim、nano 这类终端编辑器,也有 gedit 这类图形文本编辑器。编辑器只负责查看和修改文本;把文件命名为 .c 不会让编辑器变成编译器,也不会让普通文本自动成为 C 源码。

1.1 Linux基础命令安装方式

1.1.1 sudo apt install vim

视频在 Vim 尚未安装时直接输入:

vim

系统报告找不到该命令,并列出 vim、vim-tiny、vim-athena、vim-gtk3、vim-nox、neovim 等可安装软件包。这个列表是可用方案提示,不是按优劣排列的推荐榜;原笔记所说“安装第一个备选包即可”并不严谨。课程选择的是常规终端版 Vim:

# 刷新过软件包索引后,安装名为 vim 的软件包。
sudo apt install vim

视频从当时配置的 Ubuntu 20.04 focal-updates 软件源安装 Vim。画面显示下载约 1,243 kB、新增约 3,121 kB 磁盘占用,并最终完成软件包设置。这些版本号和容量只反映当时的软件源状态,不能当成每次安装的固定结果。

如果 APT 请求确认,应先检查将安装、升级或删除哪些包,再决定是否继续;安装后可核验:

# 显示实际调用的 vim 路径。
command -v vim

# 显示 Vim 版本和编译特性,输出通常较长。
vim --version

vim-tiny 是精简版本,部分功能可能缺失;图形变体和 Neovim 也各有用途。初学本课程时直接安装 vim,可以与视频保持一致,但不代表其他方案无效。

1.1.2 vim使用方法

视频先运行一次不带文件名的 vim,随后退出并执行:

# 打开已有的 a.c;若文件不存在,则建立一个与该名称关联的新缓冲区。
vim a.c

新缓冲区显示为 "a.c" 0L, 0C。此时只是编辑器准备使用这个文件名;只有执行写入命令后,磁盘上的文件才会创建或更新。

Vim 的关键是先分清当前模式。原笔记中的“命令模式、输入模式、编辑模式”容易把概念混在一起,较准确的基础划分如下:

模式如何进入主要用途画面线索
普通模式(Normal)启动 Vim 时默认进入;从插入模式按 Esc 返回移动、删除、复制、粘贴等命令通常没有 -- INSERT --
插入模式(Insert)普通模式按 i、a 等像普通编辑器一样输入文字底部显示 -- INSERT --
命令行模式(Command-line)普通模式按 :执行写入、退出、设置等 Ex 命令底部出现冒号和命令文本

Vim 还有可视模式等其他模式,本节没有必要一次全部掌握。若不确定当前状态,可先按 Esc 回到普通模式;重复按一次通常也无妨。

视频实际演示了以下普通模式命令:

按键作用注意事项
i在光标所在字符之前进入插入模式i 是小写字母
a在光标所在字符之后进入插入模式适合在当前字符后追加
x删除光标下的字符删除内容会进入 Vim 寄存器,并非等同于系统回收站
dd删除当前整行连续命令可配合撤销恢复

误删后不要急于退出:普通模式按 u 可撤销,按 Ctrl+R 可重做。这是实用补充,视频没有展开演示。

写入和退出命令必须先回到普通模式,再输入冒号命令:

命令准确含义
:w把当前缓冲区写入文件,不退出
:wq写入后关闭当前窗口;若是最后一个窗口则退出 Vim。视频使用的就是此命令
:q在没有未保存修改时退出;存在修改时会拒绝退出,并非直接“无保存退出”
:q!放弃当前缓冲区尚未写入的修改并退出
:wq!在 Vim 允许的范围内强制写入并退出,例如覆盖只读属性提示;不能绕过操作系统的文件权限,也不会自动获得 root 权限

这些命令区分大小写,课程强调的 wq 应写成小写。视频保存退出后执行 cat a.c,终端显示了刚才输入的文本,证明写入已经落到磁盘。

行号和搜索的规范写法是:

:set number
:set nonumber
/要搜索的文本
?要搜索的文本
  • :set number 可缩写为视频中的 :set nu,用于显示行号;:set nonumber 或 :set nonu 隐藏行号。
  • 普通模式直接输入 /模式 并回车,会向前搜索;输入 ?模式 并回车,会向后搜索。搜索模式默认按正则表达式解释。
  • n 按原搜索方向寻找下一处,N 按相反方向寻找。因此不能简单记成“n 永远向下、N 永远向上”。
  • 视频思维导图写成了 Esc + :/文本,画面也输入过 :/f。Vim 能把 /f 解释为 Ex 地址,但它不是初学者最清楚的搜索写法;单纯搜索应使用 /f。
  • 搜索是否区分大小写会受 ignorecase、smartcase 等设置影响;不要脱离配置绝对化描述。
1.1.2.1 文本编辑

视频打开了外部教程/思维导图,提到更多常用按键。可在已经理解模式的基础上记住:

普通模式按键作用
I在本行第一个非空白字符前进入插入模式
A在行尾进入插入模式
o在当前行下方新建一行并进入插入模式
O在当前行上方新建一行并进入插入模式
p在适当位置粘贴寄存器内容
u撤销最近一次更改

其中 i、a、x、dd 是本视频在编辑器内明确操作的核心命令;I、A、o、O 等来自画面中的扩展资料,不应误写成这一小节全部逐项演示过。原转录中的“jd it”是对 gedit 的误识别,不是另一种工具。

初学 Vim 时,最小闭环是:vim 文件名 → 按 i 输入 → 按 Esc 返回普通模式 → 输入 :wq 保存退出。理解这条状态转换比死背大量按键更重要。

二、文本编辑器

2.1 gedit

视频使用的真实命令是:

# 用图形文本编辑器 gedit 打开同一个文件。
gedit a.c

原笔记中的“输入 date 后再输入 a.c”来自语音识别错误。gedit 是 GNOME 桌面环境中的图形文本编辑器,界面接近常见的记事本类应用;它不是 C 编译器。

画面中的操作顺序是:打开 a.c、继续输入任意文本、通过右下角菜单开启 Display line numbers、点击 Save、关闭窗口。原转录中的“c5”实际是在说保存操作,不是命令。常见版本也支持 Ctrl+S 保存,但视频画面实际采用的是点击 Save。

如果关闭时还有未保存修改,gedit 通常会提示保存或放弃。图形编辑器容易上手,Vim 则更适合纯终端、远程登录或无法启动桌面的环境;应按场景选择,而不是把其中一个绝对化为另一个的“临时替代品”。

2.2 nano

视频随后执行:

# 在终端中用 GNU nano 打开 a.c。
nano a.c

画面显示 GNU nano 4.8。nano 是无模式的终端文本编辑器,输入文字时不需要像 Vim 那样先切换到插入模式,底部两行会显示常用快捷键。

在 nano 的提示中,^ 代表 Ctrl 键,不代表大写、Shift 或需要先输入一个脱字符。例如:

屏幕提示实际按键作用
^G HelpCtrl+G打开帮助
^O Write OutCtrl+O写出文件;随后确认文件名
^X ExitCtrl+X关闭缓冲区并退出

视频编辑后顶部出现 Modified,说明缓冲区有未保存修改。此时按 Ctrl+X,nano 会询问是否保存;必须根据需要作答,不能把 Ctrl+X 理解成任何情况下都会静默保存。nano 并非“很少使用所以不用学习”,它在快速改配置、远程维护和救援环境中都很实用;本节掌握打开、写出、退出和读懂底部提示即可。

三、文本处理相关命令总结

3.1 压缩和解压缩

tar 的核心用途是把多个文件和目录组织成一个归档文件,或从归档中提取内容。单独使用视频中的 tar -cvf 只归档、不压缩,所以 .tar 不能直接叫“压缩包”。

常用选项如下:

选项含义
-c创建新归档
-x从归档中提取
-t只列出归档内容,不提取
-v显示正在处理的文件名,可选
-f指定归档文件;它后面的参数就是归档名
-z让 tar 通过 gzip 压缩或解压,通常配合 .tar.gz

规范示例:

# 只归档两个明确指定的文件,不压缩。
tar -cvf test.tar a.c c.txt

# 提取前先查看归档内的路径。
tar -tvf test.tar

# 把归档提取到事先创建并确认过的目录。
mkdir extracted
tar -xvf test.tar -C extracted

# 创建 gzip 压缩归档;这是扩展用法,视频未演示。
tar -czvf test.tar.gz a.c c.txt

* 会先由 Shell 展开,通常不包含以点开头的隐藏文件,还可能把不想归档的文件一起选中。处理重要目录时优先写清具体路径。不要直接在重要目录中提取来源不明的归档,因为归档中的同名路径可能覆盖现有内容;应先用 -t 检查,再提取到单独目录。

3.2 查找文件命令

本标题由原笔记保留,但本小节的原始内容和视频实际都仍在演示 tar,并不是查找文件。视频首先用 ls 看见当前目录有 a.c 和 c.txt,随后实际输入:

# 视频中的原样命令:teat.tar 是把预期的 test.tar 拼错了。
tar -cvf teat.tar *

命令成功列出并归档 a.c、c.txt。再次 ls 后,目录中多了 teat.tar,原文件仍然存在。tar -c 不会自动删除输入文件,也不会因为归档名拼错就报错——只要该名称合法,它就会创建这个名称的归档。

为验证提取效果,视频继续执行:

# 删除原来的两个练习文件;这是课程验证步骤,日常操作前必须确认路径。
rm a.c c.txt

# 从视频实际创建的 teat.tar 中提取文件。
tar -xvf teat.tar

提取输出再次列出 a.c、c.txt,最后 ls 显示这两个文件和 teat.tar。因此本段正确结论是:视频成功完成了归档和提取;归档名是误拼的 teat.tar;没有演示压缩算法。日常应统一使用预期名称,例如 test.tar,并在删除原文件前先用 tar -tvf test.tar 检查归档内容。

3.3 查找文件中的字符命令

这一标题下的视频实际包含两类不同任务:find 查文件路径,grep 查文件内容。

使用 find 按名称查找文件

视频先执行:

sudo find /home/wfeng -name "*.c"

输出包含 /home/wfeng/test/a.c。原笔记把用户名错写成了 wang,也漏掉了通配模式的引号。更合适的普通用户写法是:

# 在自己的家目录中查找文件名以 .c 结尾的普通文件。
find /home/wfeng -type f -name '*.c'
  • /home/wfeng 是搜索起点,应尽量选择最小而明确的目录。
  • -type f 只匹配普通文件。
  • -name 匹配路径最后一段,即基本文件名,而不是文件内容。
  • 必须引用 '*.c',防止 * 在 find 启动前就被当前 Shell 展开。

视频又把起点扩大到根目录 /,先搜索所有 *.c,看到 Linux 头文件、Vim 示例、Snap 目录和自己的 a.c 等大量结果;再执行:

sudo find / -name a.c

画面仍出现 /run/user/1000/doc、/run/user/1000/gvfs 的 Permission denied,最后找到 /home/wfeng/test/a.c。即使使用 sudo,某些用户态 FUSE 挂载点也可能拒绝访问。全盘搜索慢、输出多,还会遍历挂载的其他文件系统;不要把 sudo find / ... 当作默认写法,只在确有授权和需要时使用。

使用 grep 查找文件内容

视频执行:

grep "d" a.c

grep 输出的是包含匹配项的整行,并不是只输出字符 d。画面把命中的字符显示为红色,是当时环境的颜色配置效果,不是任何环境下都必然出现。更明确的字面量搜索可写为:

# 显示行号,按固定字符串而不是正则表达式搜索,并在适合时着色。
grep -n --color=auto -F 'd' a.c

# 忽略英文大小写搜索 usb;视频未在文件上演示这一扩展选项。
grep -ni -F 'usb' a.c

默认 grep 把模式解释为基本正则表达式,通常区分大小写;-F 才是固定字符串,-i 忽略大小写,-n 显示行号。没有输出通常表示没有匹配;退出状态 0 表示找到,1 表示未找到,2 表示发生错误,脚本中应区分这些状态。

3.4 内核打印命令

dmesg 更准确的定位是:读取或控制内核环形缓冲区。它不是内核本身的“打印命令”,也不是“开机以来所有日志”的永久全集。缓冲区容量有限,旧消息可能被覆盖;它通常包括启动初始化以及启动后新产生的驱动、设备和内核事件。

视频直接执行:

# 显示当前可读取的内核环形缓冲区内容。
dmesg

输出行首出现类似 [7372.196861] 的时间戳。默认原始时间通常表示从系统启动开始经过的秒数,不是“第零秒”等自然语言标签;休眠、唤醒和时间换算还可能影响其准确性。某些系统启用了 kernel.dmesg_restrict,普通用户会得到权限错误;只有在账户获授权且确有需要时才使用 sudo dmesg。

视频还执行:

# 把 dmesg 的标准输出通过管道交给 grep,只保留含小写 usb 的行。
dmesg | grep usb

其中 | 是管道:左侧命令的标准输出成为右侧命令的标准输入。为同时匹配 USB、usb 等大小写形式,可写:

dmesg | grep -i --color=auto usb

看到某些 USB 或蓝牙初始化消息,只能作为设备枚举、驱动加载和故障排查的线索,不能单凭一行日志断言设备完全正常。需要实时观察新内核消息时可用 dmesg -w;若系统使用 systemd journal,也可用 journalctl -k 查看内核日志。两者的数据保留、权限和时间格式不同。

四、本节关键纠正

原笔记或容易误解的说法精校后的结论
从系统提示里安装第一个备选包即可备选包功能不同;课程明确选择 sudo apt install vim
Vim 有“命令、输入、编辑”三种模式本节应区分普通模式、插入模式和命令行模式;搜索又由 / 或 ? 启动
:q 就是不保存退出有未保存修改时 :q 会拒绝;丢弃修改退出是 :q!
:wq! 能强制解决任何写入问题它不能绕过文件系统权限或自动取得 root 权限
n 总是下一个、N 总是上一个n 沿原搜索方向重复,N 沿相反方向重复
输入 date 再输入 a.c 打开 gedit实际命令是 gedit a.c;gedit 是编辑器,不是编译器
nano 底部是 Ctrl+大写字母^X 表示 Ctrl+X,与 Shift 或字母大小写无关
tar -cvf 会压缩文件它只创建 tar 归档;加 -z 等压缩选项才会压缩
视频创建的是 test.tar预期名称是 test.tar,实际误输并成功创建的是 teat.tar
find /home/wang -name *.c 是视频命令实际用户是 wfeng,通配模式应加引号;通常无需用 sudo 搜自己的家目录
grep 只输出匹配字符并必然标红默认输出整条匹配行;颜色取决于选项或环境配置
dmesg 保存开机后的全部永久日志它读取有限的内核环形缓冲区,旧消息可能被覆盖
a.c 就是本节 C 源码文件中只有编辑练习用的随机文本,没有可收录的 C 程序

核对依据

Prev: 管理员apt Next: GCC使用