vim最全使用汇总

  • ~17.76K 字
  1. 1. 0. 为何要学 vim
    1. 1.1. 0.1 原文基础背景(精简保留)
  2. 2. 1. vi 的三种模式
    1. 2.1. 1.1 一般指令模式(command mode)
    2. 2.2. 1.2 编辑模式(insert mode)
    3. 2.3. 1.3 指令列命令模式(command-line mode)
    4. 2.4. 模式切换示意图
  3. 3. 2. 简易执行范例
    1. 3.1. 2.1 用 vi 建立 welcome.txt
    2. 3.2. 2.2 编辑→存档→离开的标准 5 步流程
  4. 4. 3. 按键说明(核心速查表)
    1. 4.1. 3.1 第一部份:一般指令模式可用按键
      1. 4.1.1. 移动游标
      2. 4.1.2. 搜寻与取代
      3. 4.1.3. 删除、复制、贴上、复原
    2. 4.2. 3.2 第二部份:一般指令模式 → 编辑模式
    3. 4.3. 3.3 第三部份:一般指令模式 → 指令列模式
      1. 4.3.1. 储存、离开、另存、读入
      2. 4.3.2. vim 环境的变更
    4. 4.4. 3.4 数字的意义速记
  5. 5. 4. 案例练习要点(9.2.3)
  6. 6. 5. 暂存档、救援回复与开启时的警告讯息
    1. 6.1. 5.1 暂存档机制
    2. 6.2. 5.2 模拟 vim 中断
    3. 6.3. 5.3 再次开启时的警告讯息(E325: ATTENTION)
    4. 6.4. 5.4 两个可能原因与处理
    5. 6.5. 5.5 六个可用按钮
  7. 7. 6. vim 的额外功能
    1. 7.1. 6.1 vim vs vi 的视觉差异
    2. 7.2. 6.2 区块选择(Visual Block)
    3. 7.3. 6.3 多文件编辑
    4. 7.4. 6.4 多窗口功能
    5. 7.5. 6.5 挑字补全功能
    6. 7.6. 6.6 vim 环境设定与记录(~/.vimrc, ~/.viminfo)
      1. 7.6.1. ~/.viminfo(自动产生)
      2. 7.6.2. 常用环境设定参数
      3. 7.6.3. ~/.vimrc 范例
    7. 7.7. 6.7 vim 常用指令示意图
  8. 8. 7. 其他 vim 使用注意事项
    1. 8.1. 7.1 中文编码的问题
      1. 8.1.1. 影响中文显示的 4 个因素
      2. 8.1.2. big5 vs utf8 选用建议
      3. 8.1.3. 修正语系编码(GNOME 环境)
    2. 8.2. 7.2 DOS 与 Linux 的断行字符
      1. 8.2.1. dos2unix / unix2dos 转换工具
    3. 8.3. 7.3 语系编码转换(iconv)
  9. 9. 8. 重点回顾(9.5)
  10. 10. 9. 本章练习速答(9.6)
    1. 10.1. 简答题精选
    2. 10.2. 实作题
  11. 11. 附录:常用指令总览(按模式分类)
    1. 11.1. 一般指令模式(移动)
    2. 11.2. 一般指令模式(编辑)
    3. 11.3. 一般指令模式(搜索与取代)
    4. 11.4. 一般指令模式 → 编辑模式
    5. 11.5. 一般指令模式 → 指令列模式
    6. 11.6. 区块选择(Visual Block)
    7. 11.7. 多文件编辑
    8. 11.8. 多窗口
    9. 11.9. 挑字补全
    10. 11.10. 暂存档救援
    11. 11.11. 环境设定(~/.vimrc)
    12. 11.12. 编码与断行转换
  12. 12. 原文图片引用索引(不做 OCR)
  13. 13. 原文 9.7 参考资料与延伸阅读
    1. 13.1. 对照核验结论

0. 为何要学 vim

原因 说明
①通用性 所有 Unix Like 系统都内置 vi 文书编辑器,其他编辑器不一定存在
②被其他指令调用 crontab / visudo / edquota 等指令默认用 vi 作编辑界面
③程序编辑能力 vim 可主动以字体颜色辨别语法正确性,方便程序设计
④执行速度快 程式简单,编辑速度相当快速

vi vs vim

  • vi:老式文书处理器,功能齐全但仍有进步空间。
  • vim:vi 的进阶版本,是「程序开发工具」而非文书处理软件。加入正規表示法搜尋、多檔案編輯、區塊複製等額外功能;可依副檔名或檔案開頭資訊自動判斷語法,以顏色顯示程式碼與一般資訊。

⚠️ 重點是第 ② 點:太多 Linux 指令預設使用 vi 作編輯介面,必須學會 vi 才能操作這些指令。
⚠️ 在 CentOS 7 一般帳號預設 vi 已被 vim 取代(執行 alias 可見 alias vi='vim');若要使用純 vi,需輸入絕對路徑 /bin/vi

0.1 原文基础背景(精简保留)

  • Linux 大多数设定档以 ASCII 纯文字保存,因此可用文字编辑器直接修改;纯文字本质是按编码系统将 0/1 转成可识别文字。
  • 不同发行版有不同的图形化管理工具(如 Red Hat/Fedora 的 ntsysvsetup,SuSE 的 YAST);只依赖这些工具,换发行版后可能无法操作,掌握文字编辑器更通用。
  • 其他文字介面编辑器还包括 emacspiconanojoevim;原文参考链接见文末。

1. vi 的三种模式

vi 共分三种模式,只有「一般指令模式」可与编辑模式和指令列模式切换,编辑模式与指令列模式之间不可互相切换

1.1 一般指令模式(command mode)

  • 以 vi 打开文件直接进入的默认模式
  • 可用「上下左右」按键移动游标
  • 可用「删除字符」「删除整列」「复制、贴上」处理文件内容
  • 无法编辑文件内容——必须按下 i/I/o/O/a/A/r/R 等键才会进入编辑模式

1.2 编辑模式(insert mode)

  • 在一般指令模式下按下 i, I, o, O, a, A, r, R 任一键进入
  • Linux 画面左下方会出现 --INSERT----REPLACE-- 字样
  • 此时除 [Esc] 外其他按键都视为输入
  • [Esc] 退出编辑模式,回到一般指令模式

1.3 指令列命令模式(command-line mode)

  • 在一般指令模式中输入 : / ? 三者之一进入
  • 游标移动到最底下一列
  • 可执行:搜寻资料、读取、存档、大量取代字符、离开 vi、显示行号等

模式切换示意图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     ┌─────────────┐
│ 一般指令模式 │ ←─ 打开 vi 的默认模式
│ command mode│
└──┬───┬──┬───┘
i/I/o/O │ │ │ :
/a/A/r/R│ │ │ / ?
▼ │ ▼
┌─────────┐│┌──────────┐
│ 编辑模式 │││指令列模式 │
│ insert │││command-line│
└────┬────┘│└────┬─────┘
│ Esc │ Esc │
└──┬──┴────┘

(回到一般指令模式)

⚠️ 编辑模式与指令列模式不能直接互切,必须先回一般指令模式。


2. 简易执行范例

2.1 用 vi 建立 welcome.txt

1
2
[dmtsai@study ~]$ /bin/vi welcome.txt
# 在 CentOS 7 一般帳號預設 vi 已被 vim 取代,需用絕對路徑執行純 vi

vi 画面结构

  • 上半部:文件实际内容
  • 最底下一列:状态显示列(如 [New File]"/etc/man_db.conf" [readonly] 131L, 5171C)或命令下达列

2.2 编辑→存档→离开的标准 5 步流程

  1. vi filename 进入一般指令模式
  2. i 进入编辑模式(左下角出现 --INSERT--)开始输入文字
  3. [Esc] 回到一般指令模式
  4. 输入 :wq 存档并离开
  5. 回到 shell 用 ls -l 确认文件已建立

⚠️ 权限为 -r--r--r-- 时无法写入,可用 :wq! 强制写入;但前提是「你的权限可以改变」该档案权限。
⚠️ ! 在 vi 当中常代表「强制」的意思。


3. 按键说明(核心速查表)

数字在 vi 中有意义:通常代表「重复做几次」或「去到第几个」。例如 50dd 删除 50 列、20j 向下移动 20 列。数字加在动作之前。

3.1 第一部份:一般指令模式可用按键

移动游标

按键 说明
h 游标向左移动一个字符
j 游标向下移动一个字符
k 游标向上移动一个字符
l 游标向右移动一个字符
n<space> n 为数字;按数字后再按空白键,游标向右移动该列 n 个字符(如 20<space>
[Ctrl]+[f] 屏幕「向下」移动一页(Page Down)(常用)
[Ctrl]+[b] 屏幕「向上」移动一页(Page Up)(常用)
[Ctrl]+[d] 屏幕「向下」移动半页
[Ctrl]+[u] 屏幕「向上」移动半页
+ 游标移动到非空白字符的下一列
- 游标移动到非空白字符的上一列
0[Home] 移动到这一列的最前面字符处(常用)
$[End] 移动到这一列的最后面字符处(常用)
H 游标移动到屏幕的最上方那一列的第一个字符
M 游标移动到屏幕的中央那一列的第一个字符
L 游标移动到屏幕的最下方那一列的第一个字符
G 移动到这个文件的最后一列(常用)
nG n 为数字;移动到这个文件的第 n 列(如 20G,可配合 :set nu)(常用)
gg 移动到这个文件的第一列,相当于 1G(常用)
n<Enter> n 为数字;游标向下移动 n 列(常用)

💡 hjkl 在键盘上排列在一起,可用来移动游标;多次移动可加数字(如 30j30↓)。

搜寻与取代

按键 说明
/word 向游标之下寻找一个名称为 word 的字符串。如 /vbird(常用)
?word 向游标之上寻找一个字符串名称为 word 的字符串
n 重复前一个搜寻的动作(如 /vbird 后按 n 继续向下搜寻)(常用)
N 反向进行前一个搜寻动作(如 /vbird 后按 N 向上搜寻)(常用)
:n1,n2s/word1/word2/g 在第 n1 与 n2 列之间寻找 word1 字符串并取代为 word2(如 :100,200s/vbird/VBIRD/g
:1,$s/word1/word2/g 从第 1 列到最后一列寻找 word1 并取代为 word2(常用)
:1,$s/word1/word2/gc 同上,但取代前确认提示(confirm)(常用)

💡 使用 /word 配合 nN 非常有帮助,可重複找到搜寻的关键字。

删除、复制、贴上、复原

对照原文发现以下项目此前遗漏,现已补入: d$d0y0y$c10cj

原文第 153 行是单行 HTML 表格,虽然界面显示会截断,但表格文本可以直接解析;以下内容已按原文逐项核对。

按键 说明 出处
x, X 在一列中,x 为向后删除一个字符(相当于 [Del]),X 为向前删除一个字符 9.6 简答题
nx n 为数字,连续向后删除 n 个字符(如 15x 删除 15 个字符) 9.2.3 案例 13
dd 删除游标所在的那一整列(常用) 9.6 简答题
ndd n 为数字,删除游标所在的向下 n 列(如 16dd 删 16 列)(常用) 9.6 简答题、9.2.3 案例 11
d1G 删除游标所在到第一列的所有资料 9.6 简答题
dG 删除游标所在到最后一列的所有资料 原文第 153 行
d$ 删除游标所在处到该列最后一个字符 原文此前遗漏
d0 删除游标所在处到该列最前面一个字符 原文此前遗漏
yy 复制游标所在的那一列(常用) 9.6 简答题
nyy n 为数字,复制游标所在的向下 n 列(如 6yy 复制 6 列)(常用) 9.6 简答题、9.2.3 案例 10
y1G 复制游标所在列到第一列的所有资料 原文第 153 行
yG 复制游标所在列到最后一列的所有资料 原文第 153 行
y0 复制游标所在字符到该列行首的所有资料 原文此前遗漏
y$ 复制游标所在字符到该列行尾的所有资料 原文此前遗漏
p, P p 将已复制资料贴在游标下一列,P 贴在游标上一列;如游标在第 20 列、复制 10 列,p 从第 21 列开始贴,P 会将原第 20 列推到第 30 列(常用) 原文第 153 行
J 将游标所在列与下一列的资料结合成同一列 原文第 153 行
c 变更/重复删除多个资料;如向下删除 10 列可用 10cj 原文此前遗漏
u 复原前一个动作(常用) 9.2.3 案例 9
[Ctrl]+r 重做上一个被复原的动作(常用) 原文第 153 行
. 重复前一个动作(常用) 9.5 重点回顾

J[Ctrl]+ry1GyG 均已在原始 Markdown 表格中确认,并按原文补入或校正。

3.2 第二部份:一般指令模式 → 编辑模式

按键 说明
i, I 进入插入模式:i 从目前游标所在处插入;I 在目前所在列的第一个非空白字符处开始插入(常用)
a, A 进入插入模式:a 从目前游标所在的下一个字符处开始插入;A 从游标所在列的最后一个字符处开始插入(常用)
o, O 进入插入模式:o 在游标所在的下一列插入新的一列;O 在游标所在处的上一列插入新的一列(常用)
r, R 进入取代模式:r 只会取代游标所在的那一个字符一次;R 会一直取代游标所在的文字直到按下 [Esc] 为止(常用)
[Esc] 退出编辑模式,回到一般指令模式(常用)

⚠️ 在 vi 画面左下角处会出现 --INSERT----REPLACE-- 字样。只有在左下角看到 INSERT 或 REPLACE 时才能输入字符

3.3 第三部份:一般指令模式 → 指令列模式

储存、离开、另存、读入

按键 说明
:w 将编辑的资料写入硬盘文件中(常用)
:w! 若文件属性为「唯读」时,强制写入该文件(仍受档案权限制约)
:q 离开 vi(常用)
:q! 若曾修改过文件又不想储存,使用 ! 强制离开不储存文件(常用)
:wq 储存后离开;:wq! 为强制储存后离开(常用)
ZZ 大写 Z;若文件没更动则不储存离开,若已被更动过则储存后离开
:w [filename] 将编辑的资料储存成另一个文件(类似另存新档)
:r [filename] 在编辑的资料中读入另一个文件的资料,加到游标所在列后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件
:! command 暂时离开 vi 到指令列模式下执行 command 的显示结果(如 :! ls /home 察看 /home 资讯)

vim 环境的变更

按键 说明
:set nu 显示行号,每一列的字首显示该列的行号
:set nonu 取消行号(与 :set nu 相反)

⚠️ ! 在 vi 中常具有「强制」的意思。

3.4 数字的意义速记

用法 例子 含义
数字 + 动作 50dd 删除 50 列
数字 + 移动 20j / 20↓ 向下移动 20 列
数字 + G 20G 移动到第 20 列

4. 案例练习要点(9.2.3)

以 CentOS 7.1 的 /etc/man_db.conf 为练习文件。15 步操作的典型指令速记:

步骤 操作 指令
1 /tmp 建立 vitest 目录 mkdir /tmp/vitest(原文此前省略)
2 进入 vitest 目录 cd /tmp/vitest(原文此前省略)
3 /etc/man_db.conf 复制到当前目录 cp /etc/man_db.conf .(原文此前省略)
4 用纯 vi 开启练习文件 /bin/vi man_db.conf(原文此前省略)
5 设定行号 :set nu
6 移到第 43 列向右 59 字符 43G59→(出现 as 这个单词)
7 移到第 1 列向下搜寻 gzip 1Ggg/gzip(到第 93 列)
8 29~41 列的 man → MAN 逐一确认 :29,41s/man/MAN/gc(持续按 y 会显示「13 列内置换 13 个字符串」)
9 全部复原 持续按 u;或 :q! 后重新读取
10 复制 66~71 这 6 列贴到最后 66G6yyGp
11 删除 113~128 共 16 列 113G16dd
12 另存为 man.test.config :w man.test.config
13 到 25 列删 15 字符 25G15x(出现 tree
14 第一列新增一列 1G → 大写 O(新增一列并进入插入模式)→ 输入 → [Esc]
15 储存后离开 :wq

5. 暂存档、救援回复与开启时的警告讯息

5.1 暂存档机制

  • vim 编辑时会在与被编辑文件的目录下建立 .filename.swp 暂存档
  • 例:编辑 /tmp/vitest/man_db.conf 时,vim 主动建立 /tmp/vitest/.man_db.conf.swp
  • 所有编辑动作会被记录到 .swp
  • 系统断线时,.swp 可发挥救援功能

5.2 模拟 vim 中断

1
2
3
4
5
6
7
8
[dmtsai@study vitest]$ vim man_db.conf
# 在 vim 一般指令模式下按 [Ctrl]-z,vim 被丢到背景执行
[1]+ Stopped vim man_db.conf

[dmtsai@study vitest]$ ls -al .man_db.conf.swp
-rw-r--r--. 1 dmtsai dmtsai 16384 Jul 6 23:54 .man_db.conf.swp

[dmtsai@study vitest]$ kill -9 %1 # 模拟断线

5.3 再次开启时的警告讯息(E325: ATTENTION)

1
2
3
4
5
6
7
8
9
E325: ATTENTION
Found a swap file by the name ".man_db.conf.swp"
owned by: dmtsai dated: Mon Jul 6 23:54:16 2015
file name: /tmp/vitest/man_db.conf
modified: no
user name: dmtsai host name: study.centos.vbird
process ID: 31851
...
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

5.4 两个可能原因与处理

原文还给出两种恢复入口:在 Vim 内执行 :recover,或从 shell 执行 vim -r man_db.conf;可用 :help recovery 查看恢复帮助。

原因 说明 处理
① 他人/程序同时在编辑同文件 Linux 多人多工,多人同时编辑会导致内容混乱 找到对方结束其 vim;若仅查阅可选 O
② 前一次 vim 中断(crashed) 不正常结束产生的后果 按下 R 救回未储存的工作;或按 D 删除暂存档

5.5 六个可用按钮

选项 说明 使用场景
[O] Open Read-Only 打开成唯读文件 仅想查阅文件内容,不编辑;或同学也在编辑同文件
[E] Edit anyway 用正常方式打开,不载入暂存档内容 易出现两使用者互相改变对方文件,不推荐
[R] Recover 载入暂存档的内容,救回之前未储存工作 上次 vim 中断要救回资料;救回后仍需手动删除 .swp
[D] Delete it 删除暂存档(确定无用时) 不确定暂存档来源,最常做的动作;vim 会建立新的 .swp
[Q] Quit 离开 vim,不进行任何动作,回到提示字元 不想编辑
[A] Abort 忽略这个编辑行为,类似 Quit 回到提示字元

⚠️ Recover 救回后储存离开 vim,.swp 不会自动删除,需手动删除以避免每次打开都出现警告。


6. vim 的额外功能

6.1 vim vs vi 的视觉差异

  • vim 具颜色显示功能,支援多种程序语法(syntax)
  • 编辑程序时(C 语言、shell script)可帮程序除错(debug)
  • vim 画面特色:
    • 註解(# 开头)列显示深蓝色
    • 最底下一列左边显示文件属性(唯读、列数、字符数)
    • 最底下一列右边显示游标位置(如 1,1 = 第 1 列第 1 个字符)
    • 最右下角显示目前画面占整体文件比例(如 1%

6.2 区块选择(Visual Block)

按键 说明
v 字符选择,将游标经过的地方反白选择
V 列选择,将游标经过的列反白选择
[Ctrl]+v 区块选择,可以长方形的方式选择资料
y 将反白的地方复制起来
d 将反白的地方删除掉
p 将刚刚复制的区块,在游标所在处贴上

典型应用:将 host1, host2... 复制并加到每一列最后面。

操作步骤:

  1. vim hosts 开启文件
  2. 移到第一列 hosth 上,按 [Ctrl]-v(左下角出现区块示意字样)
  3. 移到最底部,游标经过的区域会反白
  4. y 复制(反白区块消失)
  5. 移到第一列最右边,编辑模式向右按两个空白键,回一般指令模式后按 p 贴上

6.3 多文件编辑

按键 说明
:n 编辑下一个文件
:N 编辑上一个文件
:files 列出目前这个 vim 开启的所有文件

典型应用:将 hosts 前 4 列 IP 复制到 /etc/hosts

1
vim hosts /etc/hosts    # 一个 vim 开启两个文件

步骤:

  1. :files 察看编辑文件清单
  2. 在第一列输入 4yy 复制 4 列
  3. :n 切到第二个文件 /etc/hosts
  4. G 到最后一列,按 p 贴上
  5. u 还原,最后 :q 离开

⚠️ 多文件编辑可在同一个 Vim 会话中跨文件复制,避免打开两个独立 Vim 后无法直接用 nyy / p 传递内容;独立窗口间用鼠标复制还可能把 [Tab] 转为空格,导致排版内容变化。

6.4 多窗口功能

适用场景:

  • 一个文件很大,需对照前后资料
  • 两个文件需对照着看,不想用多文件编辑
按键 说明
:sp [filename] 开启一个新视窗;加 filename 表示在新视窗开启新文件,否则两视窗显示同一文件(同步显示)
[Ctrl]+w+ j[Ctrl]+w+↓ 先按 Ctrl 不放,按 w 后放开所有按键,再按 j(或向下方向键),游标移到下方视窗
[Ctrl]+w+ k[Ctrl]+w+↑ 同上,游标移到上面的视窗
[Ctrl]+w+ q 其实就是 :q 结束离开;先移到欲结束的视窗再 :q 或按此组合

操作范例

1
2
3
4
5
vim /etc/man_db.conf
1G " 到第一列
:sp " 再次打开同一文件(同文件两视窗)
G " 在新视窗到最后一列
:sp /etc/hosts " 再开一个新视窗编辑 /etc/hosts

6.5 挑字补全功能

vim 可依据副档名呼叫语法检验,提供关键字补全。必须使用正确副档名(如 .html / .php)否则 vim 不呼叫正确语法检验。

组合按键 补齐的内容
[Ctrl]+x[Ctrl]+n 透过目前正在编辑的「文件内容文字」作为关键字,予以补齐
[Ctrl]+x[Ctrl]+f 以当前目录内的「档名」作为关键字,予以补齐
[Ctrl]+x[Ctrl]+o 以副档名作为语法补充,以 vim 内建的关键字,予以补齐

应用范例:编写 HTML/CSS 时,输入 b 后按 [Ctrl]+x 再按 [Ctrl]+o,会出现 background 等相关字词,用上下键挑选。

💡 鸟哥认为第 1 和第 3 个组合键最有用。

6.6 vim 环境设定与记录(~/.vimrc, ~/.viminfo)

~/.viminfo(自动产生)

  • vim 会主动将你曾经做过的行为登录下来
  • 文件自动产生,不需自行建立
  • 下次编辑同文件时,游标停在上次离开的列;搜寻过的字符串在编辑其他文件时也会反白

常用环境设定参数

设定 说明
:set nu / :set nonu 设定与取消行号
:set hlsearch / :set nohlsearch hlsearch = high light search(高亮度搜寻),是否将搜寻的字符串反白。预设值是 hlsearch
:set autoindent / :set noautoindent 是否自动缩排
:set backup 是否自动储存备份档;预设 nobackup。设定后更动文件会在同目录产生 filename~ 备份原始内容
:set ruler 显示或不显示右下角状态列
:set showmode 是否显示 --INSERT-- 之类的字眼在左下角状态列
:set backspace=(0/1/2) 2 可删除任意值(含原已存在的文字);0/1 仅可删除刚刚输入的字符
:set all 显示目前所有的环境参数设定值
:set 显示与系统预设值不同的设定参数(即自行变动的部分)
:syntax on / :syntax off 是否依据程序相关语法显示不同颜色;可主动除错;编辑纯文字时可取消以免颜色干扰
:set bg=dark / :set bg=light 显示不同的颜色色调,**预设是 light**;註解深蓝色看不清楚可设为 dark

~/.vimrc 范例

vim 整体设定档在 /etc/vimrc(不建议修改);个人设定在 ~/.vimrc(预设不存在,手动建立)。前缀有无冒号 : 效果相同," 双引号为註解符号。

1
2
3
4
5
6
7
8
9
" ~/.vimrc 范例
set hlsearch " 高亮度反白
set backspace=2 " 可随时用倒退键删除
set autoindent " 自动缩排
set ruler " 可显示最后一列的状态
set showmode " 左下角那一列的状态
set nu " 可以在每一列的最前面显示行号
set bg=dark " 显示不同的底色色调
syntax on " 进行语法检验,颜色显示

⚠️ 不要用错註解符号(" 双引号),否则每次使用 vim 都会发生警告讯息。

6.7 vim 常用指令示意图

原文图片此前未保留:原文图 9.3.10 是一张「vim 常用指令示意图」,用于快速查询不同模式下的指令。图片资源位于:

![[file-20260819120542999.jpg]]

建议结合本精要的文字速查表使用,或打印该图贴于屏幕墙上查询。


7. 其他 vim 使用注意事项

7.1 中文编码的问题

vim 无法显示正常中文时,通常是编码问题。中文编码有 big5utf8 两种。

影响中文显示的 4 个因素

  1. Linux 系统预设支援的语系资料:与 /etc/locale.conf 有关
  2. 终端介面(bash)的语系:与 LANG, LC_ALL 变数有关
  3. 文件原本的编码
  4. 开启终端机的软件(如 GNOME 下的窗口介面)

⚠️ 第 ③ 与第 ④ 点最关键:只要这两点编码一致,就能正确看到与编辑中文文件。

big5 vs utf8 选用建议

  • big5:在写入某些资料库系统时,在「註、蓋、功」这些字体上会发生错误
  • utf8(万国码):近期以来大多希望使用 utf8 来进行中文编码
  • 但中文 Windows 上的软体常预设使用 big5(不一定是 Windows 系统的问题,有时是某些中文软体的预设值之故)

⚠️ Linux 本机前的 tty1~tty6 原本预设就不支援中文编码,一定看到乱码,不用考虑此问题。

修正语系编码(GNOME 环境)

1
2
3
[dmtsai@study ~]$ LANG=zh_TW.big5
[dmtsai@study ~]$ export LC_ALL=zh_TW.big5
# 然后在终端介面工具列:「终端机」→「设定字元编码」→「中文 (正体) (BIG5)」

7.2 DOS 与 Linux 的断行字符

系统 断行字符 说明
DOS(Windows) ^M$(CRLF) CR 与 LF 两个符号
Linux $(LF) 仅 LF 断行符号

⚠️ Linux 指令判断执行依据是 Enter(LF);DOS 多出的 ^M 会让 shell script 程式无法执行——误判指令内容。
⚠️ 不建议在 Windows 编辑好文件后直接上传到 Linux。

dos2unix / unix2dos 转换工具

原文安装流程此前省略dos2unix 可能未预装;无网络时切换 root,从安装光盘安装后再退出 root。

1
2
3
4
5
[dmtsai@study ~]$ su -
[root@study ~]# mount /dev/sr0 /mnt
[root@study ~]# rpm -ivh /mnt/Packages/dos2unix-*
[root@study ~]# umount /mnt
[root@study ~]# exit

说明:安装软件需要 root 权限。

指令语法

1
2
3
4
5
6
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]

选项与参数:
-k :保留该文件原本的 mtime 时间格式(不更新档案上次内容修订时间)
-n :保留原本的旧档,将转换后的内容输出到新档案,如:dos2unix -n old new

范例

1
2
3
4
5
6
7
8
9
10
11
# 范例一:将 man_db.conf 修改成 DOS 断行(用 -k 保留 mtime)
[dmtsai@study vitest]$ unix2dos -k man_db.conf
# 文件容量增加(多了 ^M)

# 范例二:转回 Linux 断行,保留旧档输出到 man_db.conf.linux
[dmtsai@study vitest]$ dos2unix -k -n man_db.conf man_db.conf.linux

# 用 file 指令验证
[dmtsai@study vitest]$ file man_db.conf*
man_db.conf: ASCII text, with CRLF line terminators # DOS 格式
man_db.conf.linux: ASCII text # Linux 格式

7.3 语系编码转换(iconv)

原文下载步骤此前省略:原文示例先用 wget 下载 big5 编码示例文件 vi.big5/tmp/vitest,再执行转换。

1
2
cd /tmp/vitest
wget https://linux.vbird.org/linux_basic/0310vi/vi.big5

将文件从一种编码转换为另一种,无需手动打开 vi 转存。

1
2
3
4
5
6
7
8
iconv --list
iconv -f 原本编码 -t 新编码 filename [-o newfile]

选项与参数:
--list :列出 iconv 支援的语系资料
-f :from,来源编码格式
-t :to,新编码格式
-o file :保留原本档案,使用 -o 新档名建立新编码档案

范例一:big5 → utf8

1
2
3
4
[dmtsai@study vitest]$ iconv -f big5 -t utf8 vi.big5 -o vi.utf8
[dmtsai@study vitest]$ file vi*
vi.big5: ISO-8859 text, with CRLF line terminators
vi.utf8: UTF-8 Unicode text, with CRLF line terminators

范例二:繁体 utf8 → 简体 utf8(需中转 big5 → gb2312)

1
2
[dmtsai@study vitest]$ iconv -f utf8 -t big5 vi.utf8 | \
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8

💡 iconv 支援的语系非常多,包含正体中文 big5/utf8、简体中文 gb2312。


8. 重点回顾(9.5)

  1. Linux 底下的设定档多为文字档,故使用 vim 即可进行设定编辑
  2. vim 可视为程式编辑器,可用以编辑 shell script、设定档等,避免打错字
  3. vi 为所有 unix like 的作业系统都会存在的编辑器,且执行速度快速
  4. vi 有三种模式,一般指令模式可变换到编辑与指令列模式,但编辑模式与指令列模式不能互换
  5. 常用的按键有 i, [Esc], :wq
  6. vi 的画面大略可分为两部份:(1) 上半部的本文与 (2) 最后一行的状态+指令列模式
  7. 数字是有意义的,用来说明重复进行几次动作的意思,如 5yy 为复制 5 列之意
  8. 游标的移动中,大写的 G 经常使用,尤其是 1G, G 移动到文章的头/尾功能
  9. vi 的取代功能也很棒::n1,n2s/old/new/g 要特别注意学习起来
  10. 小数点 . 为重复进行前一次动作,也是经常使用的按键功能
  11. 进入编辑模式几乎只要记住:i, o, R 三个按钮即可;尤其是新增一列的 o 与取代的 R
  12. vim 会主动的建立 swap 暂存档,所以不要随意断线
  13. 如果在文章内有对齐的区块,可以使用 [Ctrl]-v 进行复制/贴上/删除的行为
  14. 使用 :sp 功能可以分割视窗
  15. 若使用 vim 来撰写网页,若需要 CSS 元素资料,可透过 [Ctrl]+x, [Ctrl]+o 这两个连续组合按键来取得关键字
  16. vim 的环境设定可以写入在 ~/.vimrc 档案中
  17. 可以使用 iconv 进行档案语系编码的转换
  18. 使用 dos2unixunix2dos 可以变更档案每一列的行尾断行字符

9. 本章练习速答(9.6)

简答题精选

原文 9.6 还包含一项提示:在 Vim 中执行 :e! 可放弃当前未保存修改,重新载入原始文件内容。

问题 答案
第 34 列向右 15 字符 34G15→15l
去文件页首/页尾 页首 1Ggg;页尾 G
移到行头/行尾 行头 0;行尾 $
r 功能 取代游标所在的那个字符
另存新档 newfilename :w newfilename
进入编辑模式 i, I, a, A(本列输入,出现 –Insert–);o, O(新列输入);r, R(取代字符,左下角 –Replace–)
编辑模式跳回一般指令模式 [Esc]
上下左右键无法使用时移动游标 h, j, k, l 分别代表左、下、上、右
删除一列/n列/一字符 dd / ndd / xXdGd1G 分别表示删除到页尾及页首)
复制一列/n列并贴上 yy / nyy / pP
搜寻 string ?string(往前);/string(往后)
取代 word1 为 word2(含确认) :1,$s/word1/word2/g;含确认 :1,$s/word1/word2/gc
读入 filename :r filename
存档/离开/存档离开/强制存档离开 :w / :q / :wq / :wq!
还原成原始文件内容 :e!
不离开 vi 但执行 ls /home :! ls /home;或 [Ctrl]+z 暂时退出 vi 到指令列模式执行指令

实作题

  1. 用 vim 编辑 /etc/fstab,将 defatuls 改成 default(观察状态);註解该列(最前面加 #)会看到字体颜色变化
  2. ~/.vimrc 设定:
    • 搜寻高亮度反白:set hlsearch
    • 启动语法检验:syntax on
    • 预设启动行号:set nu
    • 两行状态列:set laststatus=2

附录:常用指令总览(按模式分类)

一般指令模式(移动)

1
2
3
4
5
6
7
8
9
10
11
12
h j k l        ← ↓ ↑ → 移动一个字符
0 / Home 行首
$ / End 行尾
H M L 屏幕顶/中/底
gg / 1G 文件第一列
G 文件最后一列
nG 第 n 列
n<Enter> 向下 n 列
n<space> 向右 n 字符
Ctrl+f / Ctrl+b 下/上翻一页
Ctrl+d / Ctrl+u 下/上半页
+ / - 非空白字符的下一列/上一列

一般指令模式(编辑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x / X          向后/向前删除一字符
nx 删除 n 个字符
dd 删除一列
ndd 删除 n 列
d1G / dG 删除到页首/页尾
d$ / d0 删除到行尾/行首
yy 复制一列
nyy 复制 n 列
y1G / yG 复制到页首/页尾
y0 / y$ 复制到行首/行尾
p / P 贴到下一列/上一列
J 合并下一列
c / 10cj 变更;示例为向下删除 10 列
u 复原
Ctrl+r 重做
. 重复前一个动作

一般指令模式(搜索与取代)

1
2
3
4
5
6
7
/word          向下搜寻
?word 向上搜寻
n 重复前一次搜寻
N 反向前一次搜寻
:n1,n2s/w1/w2/g 范围取代
:1,$s/w1/w2/g 全文取代
:1,$s/w1/w2/gc 全文取代并确认

一般指令模式 → 编辑模式

1
2
3
4
5
i / I          从游标处/列首非空白插入
a / A 从下一字符/列尾插入
o / O 下一列/上一列新增一列插入
r / R 取代一字符/连续取代
Esc 回一般指令模式

一般指令模式 → 指令列模式

1
2
3
4
5
6
7
:w / :w! / :q / :q! / :wq / :wq!
ZZ 未改不存档离开/已改存档离开
:w filename 另存
:r filename 读入文件
:n1,n2 w filename 范围另存
:! command 暂时执行 shell 指令
:set nu / nonu 行号

区块选择(Visual Block)

1
2
3
4
v              字符选择
V 列选择
Ctrl+v 区块选择
y / d / p 复制/删除/贴上

多文件编辑

1
2
:n / :N        下/上一个文件
:files 列出所有开启文件

多窗口

1
2
3
:sp [filename]     分割视窗
Ctrl+w j/k 切换到下/上视窗
Ctrl+w q 离开当前视窗

挑字补全

1
2
3
Ctrl+x Ctrl+n      以本文件内容补齐
Ctrl+x Ctrl+f 以档名补齐
Ctrl+x Ctrl+o 以语法关键字补齐

暂存档救援

1
2
3
vim -r filename     启动时救援
:recover 在 vim 中救援
.swp 文件 6 选项:O / E / R / D / Q / A

环境设定(~/.vimrc)

1
2
3
4
5
6
7
8
9
set nu / nonu
set hlsearch / nohlsearch
set autoindent / noautoindent
set backup
set ruler
set showmode
set backspace=2
syntax on / off
set bg=dark / light

编码与断行转换

1
2
3
4
5
6
7
# 断行字符转换
dos2unix [-kn] file [newfile]
unix2dos [-kn] file [newfile]

# 语系编码转换
iconv -f 原编码 -t 新编码 filename [-o newfile]
iconv --list # 列出支援的语系

原文图片引用索引(不做 OCR)

原文共有 16 个唯一图片引用;图片用于模式切换、界面状态、区块选择、多文件/多窗口、补全和指令示意。精简文档不把图片内容转成 OCR 文本,保留原图引用供需要时查看:

原文图示 图片引用
图 9.2.1:vi 三种模式关系图 file-20260819120542999.gif
图 9.2.2–9.2.5:新旧文件、编辑、保存退出界面 file-20260819120542998 1.jpgfile-20260819120542998.jpgfile-20260819120542995 1.jpgfile-20260819120542995.jpg
图 9.3.1–9.3.2:vim 语法高亮与状态信息 file-20260819120542993 1.jpgfile-20260819120542994 1.jpg
图 9.3.3–9.3.5:区块选择、复制、贴上 file-20260819120542994.jpgfile-20260819120542996.jpgfile-20260819120542993.jpg
图 9.3.6:多文件编辑 file-20260819120542992.jpg
图 9.3.7–9.3.8:多窗口 file-20260819120542991.jpgfile-20260819120542990.jpg
图 9.3.9:挑字补全 file-20260819120543000.jpg
图 9.3.10:vim 常用指令示意图 file-20260819120542999.jpg
Tips 图标 file-20260819120543000.gif

资源目录:框架-linux系统/assets/深入-vim编辑器的使用/;以上 16 个唯一文件均已在该目录找到。

原文 9.7 参考资料与延伸阅读

原文参考资料此前未纳入精简文档,现保留为链接索引:

对照核验结论

  • ✅ 原文第 9.2.2 节的长表格已直接从 Markdown 文本解析,不使用 OCR。
  • 已发现并补入 6 项此前遗漏:d$d0y0y$c10cj
  • 已恢复原文图 9.3.10 的图片引用;原文其余操作截图仍属于图示材料,未进行 OCR 转写。
  • J[Ctrl]+ry1GyG 均已在原始表格中确认。
  • ✅ 其余原文章节 9.1–9.7 的标题、代码示例、操作表格和注意事项已完成逐节核对。

说明:本次“”用于标圈本轮对照发现的遗漏,并不表示当前文档仍有未处理的遗漏。

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!