跳过正文
  1. 文章/

第11讲:使用编辑器(上)

·4543 字·10 分钟
Euin
作者
Euin
这里记录我的技术笔记、学习心得与生活随笔。
Linux 入门 - 这篇文章属于一个选集。
§ 1: 本文

视频时长: 28分28秒

概述
#

本节视频讲解 vi 编辑器的三种核心模式(一般模式、插入模式、命令行模式)及其切换方式,演示光标移动、翻页、文本查找等常用操作。vi 是 Linux/Unix 系统中最基础的文本编辑器,几乎所有 Linux 发行版都预装了它。掌握 vi 是运维和开发工作的必备技能。

[TOC]

核心要点
#

1. vi 与 vim 的关系
#

发展历史
#

vi(Visual Interface)诞生于 1976 年,由 Bill Joy 在加州大学伯克利分校开发,是 Unix 系统最早的屏幕编辑器。它的前身是行编辑器 ex,vi 在 ex 的基础上增加了全屏可视编辑能力。

vim(Vi Improved)由 Bram Moolenaar 于 1991 年发布,在 vi 基础上增加了大量功能,包括语法高亮、多级撤销、代码折叠、插件系统等。今天几乎所有的 Linux 发行版都默认使用 vim 替代原始 vi。

特性vivim
语法高亮不支持支持
多级撤销(Ctrl+r 重做)不支持(只有一次撤销)支持无限撤销
代码折叠不支持支持
分屏编辑不支持支持(:split / :vsplit)
插件系统不支持支持(通过 .vimrc 和插件管理器)
可视化选择不支持支持(可视模式 v / V / Ctrl+v)
跨平台Unix几乎所有操作系统

Ubuntu 中的实际情况
#

Ubuntu 系统中 vi 命令实际指向的是 vim.tiny(精简版 vim),保留了 vi 的兼容性,但功能受限。可以通过以下命令查看:

$ which vi
/usr/bin/vi

$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Mar 15  2024 /usr/bin/vi -> /etc/alternatives/vi

$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 Mar 15  2024 /etc/alternatives/vi -> /usr/bin/vim.tiny

推荐安装完整版 vim:

$ sudo apt update
$ sudo apt install vim -y

安装后,可以配置 update-alternatives 将 vi 指向完整版 vim,或者直接使用 vim 命令。

学习建议
#

对于初学者,强烈建议运行 vim 自带的教学工具:

$ vimtutor

vimtutor 是一个约 30 分钟的交互式教程,覆盖了 vim 的核心操作。支持多语言,在中文系统中会自动使用中文版。


2. 三种模式系统
#

vi/vim 编辑器与普通文本编辑器的最大区别在于模式系统。现代编辑器(如 VS Code、记事本)是"无模式"的,任何时候按下键盘都是在输入文本。而 vi/vim 有三种工作模式,每种模式下的按键行为完全不同。

这是 vi 最核心的设计理念,也是初学者需要花时间适应的部分。

三种模式概览
#

模式用途进入方式
一般模式(Normal)浏览文件、执行命令(删除、复制、粘贴等)打开文件时默认进入;在插入模式按 Esc
插入模式(Insert)输入/编辑文本在一般模式按 i、a、o、I、A、O 等
命令行模式(Command-line)保存文件、退出、查找替换、设置选项在一般模式按 :(冒号)

模式切换图示
#

                     打开文件
                        |
                        v
                   +----------+
           i/a/o   |          |   :
        +--------->| 一般模式  |<------+
        |          | (Normal) |       |
        |          |          |       |
        |          +----------+       |
        |              ^  ^           |
        v              |  |           |
   +----------+    Esc |  | Esc    +------------+
   |          |--------+  +--------|            |
   | 插入模式  |                   | 命令行模式   |
   | (Insert)  |                   | (Cmd-line)  |
   +----------+                   +------------+

关键规则:插入模式和命令行模式不能直接互相切换,必须经过一般模式作为中转。

判断当前模式
#

  • 一般模式:左下角无特殊提示(或显示文件名)
  • 插入模式:左下角显示 -- INSERT ---- 插入 --
  • 命令行模式:左下角显示 : 开头的命令输入区

3. 插入模式快捷键详解
#

从一般模式进入插入模式有多种方式,每种方式适用于不同场景。选择正确的插入方式可以大大提高编辑效率。

全称功能使用场景
iinsert光标前插入最常用,在字符前开始输入
aappend光标后插入在字符后追加内容
IInsert at line start跳转到行首并插入在行开头添加注释或缩进
AAppend at line end跳转到行尾并插入在行尾添加分号、文本
oopen below下方新建一行并插入在段落之间添加新行
OOpen above上方新建一行并插入在当前行上方插入内容

实操示例
#

假设有以下文本,光标在字母 w 处:

hello world
按键结果说明
ihelloworld
ahello world
Ihello world
Ahello world
ohello world 后换行新建在下方新建空白行并定位光标
O换行后 hello world在上方新建空白行并定位光标

4. 替换与修改
#

除了插入模式,vi/vim 还提供了替换和修改操作,这些操作在一般模式下直接执行,无需进入插入模式。

功能说明
r替换光标处一个字符按 r 后再按目标字符,替换后自动回到一般模式
R进入替换模式(连续替换)输入的字符会逐个覆盖光标后的原有字符,直到按 Esc
s删除光标处字符并进入插入模式“substitute” 的缩写,相当于 xi
S删除整行并进入插入模式“Substitute line” 的缩写,相当于 cc
cw删除光标后一个单词并进入插入模式“change word”
C删除光标到行尾并进入插入模式“Change to end”

实操示例
#

# 假设原文为:Hello World!
# 光标在 W 处

r J    # 结果:Hello Jorld!    (W 变成 J,光标不动,仍在一般模式)
R Java # 结果:Hello Java!     (逐个替换,按 Esc 退出)

# 假设原文为:foo_bar_baz,光标在第一个下划线处
s      # 删除下划线,进入插入模式

5. 一般模式命令详解
#

一般模式是 vi/vim 的"指挥中心",绝大多数操作都在此模式下完成。

5.1 光标移动
#

方向记忆技巧
hh 在最左侧(最左边的字母)
jj 像一个向下的箭头
kk 像一个向上的箭头
ll 在最右侧(最右边的字母)

为什么用 hjkl 而不是方向键? vi 诞生时,当时的键盘(如 ADM-3A 终端)没有独立的方向键,hjkl 就是方向键的标记位置。使用 hjkl 可以让你在编辑时手不离开主键盘区域,提高效率。建议从一开始就养成使用 hjkl 的习惯。

5.2 单词级移动
#

功能
w跳到下一个单词开头(word)
b跳到上一个单词开头(back)
e跳到当前/下一个单词结尾(end)
# 示例:The quick brown fox(光标在开头)
# 按 w  -> The |quick brown fox
# 再按 w -> The quick |brown fox
# 按 b  -> The |quick brown fox(回退)

5.3 页面与文件级移动
#

功能
Ctrl+f向下翻一页(Forward)
Ctrl+b向上翻一页(Backward)
Ctrl+d向下翻半页(Down)
Ctrl+u向上翻半页(Up)
gg跳到文件第一行
G跳到文件最后一行
nG 或 :n跳到第 n 行
0(数字零)跳到行首
$跳到行尾

实操示例
#

# 打开一个长文件并快速定位
vim /var/log/syslog

gg          # 跳到文件开头
G           # 跳到文件末尾
100G        # 跳到第 100 行
:500        # 也跳到第 500 行(在命令行模式下)
Ctrl+f      # 向下翻页
Ctrl+b      # 向上翻页

5.4 文本查找
#

功能
/text向下(文件尾部方向)查找 text
?text向上(文件头部方向)查找 text
n跳转到下一个匹配项
N跳转到上一个匹配项
# 在一般模式下
/error          # 查找 "error"
?warning        # 反向查找 "warning"

# 找到后
n               # 下一个匹配
N               # 上一个匹配

# 查找选项
:set hlsearch   # 高亮所有匹配项(:set hls)
:set nohlsearch # 取消高亮(:set nohls)
:set incsearch  # 增量搜索(每输入一个字符实时匹配)

大小写敏感性

:set ignorecase    # 查找时忽略大小写(:set ic)
:set smartcase     # 智能大小写:全部小写时忽略大小写,有大写时区分大小写

6. 实用命令速查
#

6.1 文件操作
#

命令说明
:w保存文件(write)
:q退出(quit)
:q!强制退出,不保存修改
:wq:x保存并退出
:w filename另存为 filename
:e filename打开另一个文件(edit)
:r filename将 filename 的内容读入当前光标位置

6.2 环境检查命令
#

# 在 Linux 终端中执行
which vi               # 查看 vi 命令的实际路径
ls -l /usr/bin/vi      # 查看 vi 是否为符号链接
vim --version          # 查看 vim 版本和编译选项
vim --version | head   # 只看头部信息

7. 初学者配置建议(.vimrc)
#

vim 的配置文件是 ~/.vimrc(用户级别),通过配置可以让 vim 更加易用。以下是一个适合初学者的基础配置:

" 基础设置
set number              " 显示行号
set relativenumber      " 显示相对行号(便于跳转)
set cursorline          " 高亮当前行
set showmatch           " 高亮匹配的括号
set ruler               " 右下角显示光标位置

" 搜索设置
set hlsearch            " 高亮搜索结果
set incsearch           " 增量搜索(实时匹配)
set ignorecase          " 搜索时忽略大小写
set smartcase           " 智能大小写

" 缩进设置
set autoindent          " 自动缩进
set smartindent         " 智能缩进
set tabstop=4           " Tab 显示为 4 个空格宽度
set shiftwidth=4        " >> 缩进使用 4 个空格
set expandtab           " 将 Tab 转换为空格

" 编码
set encoding=utf-8      " 使用 UTF-8 编码
set fileencodings=utf-8,gbk,gb2312,cp936  " 自动检测编码顺序

" 快捷键
nmap <space> <PageDown> " 空格键向下翻页

" 禁用兼容模式(必须放在最前面)
set nocompatible

配置文件创建方式:

# 创建或编辑 .vimrc
vim ~/.vimrc

# 让配置立即生效(无需重启 vim)
:source ~/.vimrc

8. 常见操作场景
#

场景一:编辑系统配置文件
#

# 编辑 /etc/apt/sources.list(需要 sudo)
sudo vim /etc/apt/sources.list

# 在 vim 中:
# gg       - 跳到文件开头
# /main    - 查找 "main"
# n        - 跳到下一个匹配
# i        - 进入插入模式修改
# Esc      - 回到一般模式
# :wq      - 保存退出

场景二:编写 Shell 脚本
#

vim myscript.sh

# 在 vim 中:
i                       # 进入插入模式
#!/bin/bash             # 输入 shebang
echo "Hello World"      # 输入脚本内容
Esc                     # 回到一般模式
:w                      # 保存(不退出)
:!bash %                # 运行当前脚本测试(% 代表当前文件名)
:q                      # 退出

场景三:查看日志文件(只读模式)
#

# 使用 -R 参数以只读模式打开
vim -R /var/log/syslog
# 或使用 view 命令(等同于 vim -R)
view /var/log/syslog

# 在只读模式中:
G                       # 跳到末尾(最新日志)
?error                  # 反向查找 "error"
n                       # 向上找上一个匹配
:q                      # 退出

9. 初学者常见问题 FAQ
#

Q1: 进入 vi 后无法输入文字,按键变成各种奇怪操作? A: 这是因为 vi 打开后默认处于一般模式,不是插入模式。按 i 键进入插入模式,左下角会出现 -- INSERT -- 提示,这时才能正常输入文字。

Q2: 不知道自己在哪个模式怎么办? A: 按 Esc 键多次(听到"滴"声或闪屏),确保回到一般模式。在一般模式下按 i 进入插入模式,按 : 进入命令行模式。

Q3: vi 和 vim 有什么区别,应该学哪个? A: 学 vim。vim 完全兼容 vi 的所有操作,同时提供了更多实用功能。现代 Linux 系统中的 vi 命令通常就是 vim 的别名。建议直接运行 vimtutor 开始学习。

Q4: 方向键能用吗? A: 能用,但不推荐。hjkl 能让你手不离开主键盘区域,编辑效率更高。从初学阶段就刻意练习 hjkl,一两周即可适应。

Q5: 误操作后如何撤销? A: 在一般模式下按 u(undo)撤销上一次操作。按 Ctrl+r(redo)重做被撤销的操作。vim 支持多级撤销,可以一直按 u 退回到打开文件时的状态。

Q6: 如何复制粘贴? A: 在一般模式下,yy 复制当前行,p 粘贴到下一行,P 粘贴到上一行。dd 剪切(删除)当前行。

Q7: 光标移到了行中间,如何快速回到行首或行尾? A: 按 0(数字零)跳到行首,按 $ 跳到行尾。

Q8: 怎么知道当前在哪一行? A: 按 Ctrl+g 显示文件名和当前行号。也可以在 .vimrc 中配置 set ruler,让 vim 在右下角持续显示行号和列号。

Q9: 编辑了一半想退出但不想保存? A: 按 Esc 确保在一般模式,然后输入 :q!(quit, no write),强制退出不保存。

Q10: 如何快速在文件中跳转到特定行? A: 按 数字 + G,例如 50G 跳到第 50 行。也可以在命令行模式下输入 :50


10. vim 与其他编辑器对比
#

特性vimnanoVS CodeNotepad++
模式编辑是(三种模式)否(无模式)否(可通过插件模拟)
启动速度极快(<0.1s)慢(数秒)中等
内存占用极小(~10MB)极小大(~500MB+)中等
SSH 远程编辑原生支持原生支持需额外配置不支持
图形界面无(终端内)无(终端内)
插件生态丰富(通过 vim-plug 等)极少极丰富中等
学习曲线陡峭平缓平缓平缓
适合场景服务器管理、快速修改配置文件简单文本编辑大型项目开发Windows 桌面编辑

什么时候用 vim?

  • 通过 SSH 连接远程服务器编辑文件
  • 在没有图形界面的终端环境中工作
  • 需要快速修改配置文件
  • 追求极致编辑效率

什么时候用 VS Code 等 IDE?

  • 大型项目开发,需要代码补全、调试、Git 图形化
  • 需要预览 Markdown、查看图片等非纯文本操作
  • 团队协作,使用相同的开发环境

建议:两种工具都要掌握,根据场景选择最合适的。


11. 进阶扩展
#

  • 可视模式(v / V / Ctrl+v):可视化选择文本区域
  • 删除与修改命令(d / c / x / dd / cc)
  • 复制粘贴与寄存器操作(y / p / “+y 系统剪贴板)
  • 搜索替换(:s/old/new/g / :%s/old/new/gc)
  • 多文件与分屏编辑(:split / :vsplit / :tabnew)
  • 录制宏(q 寄存器录制 + @ 回放)
  • 插件管理器(vim-plug)基础使用

注意事项
#

  • vi/vim 打开后默认处于一般模式,按 i 才能开始输入
  • 使用 hjkl 前确保 Caps Lock 已关闭(大写锁定会改变按键行为)
  • 小写 n = 查找下一个匹配,大写 N = 查找上一个匹配
  • 小写 r = 替换光标处单个字符,大写 R = 进入连续替换模式
  • 任何时候不确定当前状态时,多按几次 Esc 回到一般模式
  • 编辑系统配置文件时建议先用 sudo cp 备份原文件
  • 退出时用 :q! 放弃修改,用 :wq:x 保存退出
Linux 入门 - 这篇文章属于一个选集。
§ 1: 本文

相关文章