VIM使用
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 Help | Ctrl+G | 打开帮助 |
^O Write Out | Ctrl+O | 写出文件;随后确认文件名 |
^X Exit | Ctrl+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 程序 |
核对依据
- 本地
videos/325.2.3VIM使用.mp4:逐段核对 Vim 安装与编辑模式、:wq、gedit 和 nano 界面、teat.tar的实际拼写、文件删除与提取、find权限报错、grep输出以及dmesg | grep usb;视频时长约 17 分 38 秒。 - 本地
transcripts/325.2.3VIM使用.txt与.srt:核对教师讲述,并结合画面纠正gedit、tar等语音识别错误。 - Vim 官方入门帮助:编辑第一个文件、Vim 文件编辑与退出帮助、Vim 搜索帮助:核对普通/插入模式、写入与退出、
/、?、n、N的语义。 - Ubuntu Focal
apt手册:核对通过 APT 安装软件包的基本流程和交互边界。 - Ubuntu
gedit手册:核对 gedit 的文本编辑器定位及通过命令行文件参数打开文档的行为。 - GNU nano 官方速查表与GNU nano 手册:核对
Ctrl+O、Ctrl+X以及^代表 Control 键。 - GNU tar 官方手册:核对创建、列出、提取、详细输出以及归档与压缩的区别。
- GNU Findutils:Shell 通配模式与
-name基本文件名匹配:核对通配符引用和文件名匹配范围。 - GNU grep 官方手册:核对逐行输出、固定字符串、行号、颜色和退出状态。
dmesg(1)上游手册页:核对内核环形缓冲区、权限限制、时间戳、持续跟随等行为。