vi初次使用:通过临时文件学习输入、保存、退出和基本编辑

vi是一个在终端屏幕上修改文本文件的编辑器。如果您连接到服务器并打开文件,但无法输入字符,或者您按下退出键却输入到了正文中,那么首先需要区分您是处于输入状态还是命令执行状态。

没有必要从一开始就记住所有命令。打开一个新的练习文件,用i输入,用Esc结束输入,然后用:wq保存并退出,您的第一个任务就完成了。本文将从这个5分钟的练习开始,逐步扩展到移动、行编辑、搜索和替换。

许多环境中,vi命令实际上运行的是Vim (Vi IMproved)。但并非所有的vi都是Vim。以下核心命令是根据POSIX vi/ex规范选择的,并在macOS的Vim 9.1上进行了执行验证。屏幕显示和一些详细操作可能会因实现或设置而异。POSIX vi规范, Vim官方入门

表示空白终端屏幕和练习文件输入·保存的概念图

首先5分钟:创建、保存并重新打开文件

本练习需要安装了vi和mktemp的shell。以下临时目录创建方式在Linux和macOS中常用,但mktemp本身不被视为POSIX vi的功能。我们只使用新的文本文件,而不是现有的配置文件或操作文件。

Shell是vi运行前和退出后输入命令的终端状态。首先,在shell中执行以下两行。如果第一行失败,则不会执行第二行。

vi_lab_dir=$(mktemp -d)
vi "$vi_lab_dir/practice.txt"

vi_lab_dir是一个shell变量,用于记住本次练习的临时目录。它将在同一个终端中持续使用。空白屏幕下方的~不是文件中包含的波浪号,而是表示尚未有文本的屏幕区域。

1. 用i输入,用Esc结束输入

vi首次打开时通常处于命令状态。在这里按一次小写字母i会切换到输入状态。直接输入以下三行,并在最后一个green后面按Esc。行之间按Enter,但最后一行后面不要按额外的Enter。

apple red
banana yellow
apple green

此时,i和Esc是您按下的键,而不是写入文件的字符。特别是,以下说明中Esc → :w → Enter这样的顺序并不意味着要输入箭头。

在输入状态下,字符键会进入正文。在命令状态下,相同的键会执行移动或编辑操作。如果状态混淆,请按Esc返回命令状态,然后开始下一个操作。Vim中显示的– INSERT –等提示并非所有vi都以相同方式显示。输入和命令状态说明

vi命令状态和输入状态通过i和Esc切换,以及通过Enter执行冒号命令的流程

图:基于官方文档重构。Vim输入状态和保存·退出。

2. 用:w保存,用:q退出

在按下Esc的状态下,输入:w并按Enter。

:w

按下冒号:会进入屏幕下方的冒号命令输入状态,在这里输入命令。在这里,您必须按Enter才能执行命令。:w将当前编辑内容保存到文件,并保持编辑器打开。如果出现保存错误,则不视为已保存。

如果保存成功,接着按:q和Enter。

:q

返回shell后,读取文件。这不是在vi中输入的命令。

cat "$vi_lab_dir/practice.txt"

如果最初输入的三行原样输出,则表示输入和保存已确认。像本练习这样编辑单个文件时,:q是退出命令,如果存在未保存的更改,通常会拒绝退出。Vim保存·退出说明

3. 重新打开,添加一个字符,然后用:wq退出

在shell中重新打开同一个文件。

vi "$vi_lab_dir/practice.txt"

在命令状态下,按顺序按下以下键。

G → $ → a → ! → Esc → :wq → Enter

G移动到文件的最后一行,$移动到当前行的最后一个字符。a在当前字符之后开始输入,因此!会附加在green后面。用Esc结束输入后,执行:wq保存并退出。再次用cat检查时,最后一行应该是apple green!。

4. 尝试用:q!放弃未保存的更改

重新打开文件并按G。接着按小写字母o在当前行下方创建新行,输入temporary note,然后按Esc。这次尝试执行:q。可能会出现拒绝退出并提示有未保存更改的信息。

如果您决定放弃此附加行,请按Esc,然后输入以下命令并按Enter。

:q!

:q!是放弃自上次保存以来所做更改并退出的命令。它不是文件删除命令。在shell中用cat读取时,之前保存的三行和green!仍然存在,而未保存的temporary note则没有了。如果从未保存过的新文件中使用:q!退出,新内容可能不会被创建为文件。退出和放弃更改说明

输入位置和移动:到需要的地方进行修改

重新打开同一个文件可以继续进行下一个练习。最初,将光标放在行首,比较i和a的区别会更容易。

按0会移动到当前行的第一个字符。在这里按i并输入Note: 后按Esc,文本Note: 会插入到光标所在字符之前,例如Note: apple red。相反,如果用$移动到行尾,然后用a输入,它会附加到最后一个字符之后。o会在当前行下方创建新行并立即开始输入。

位置移动和编辑在命令状态下进行。h、j、k、l分别表示左、下、上、右。如果在输入状态下按j,可能会输入字符j而不是向下移动,因此请先按Esc。

跳过多个字符时,w和b很方便。w移动到下一个单词的开头,b移动到上一个单词的开头。如果在单词中间按b,它会首先返回到当前单词的开头。单词边界不仅受空格影响,也受符号影响,因此最初请用apple red这样简单的文本进行练习。

文件最后一行可以用G移动,第一行可以用1G移动。0是数字零,o是小写字母o。它们是不同的命令。Vim基本移动

行删除·复制·粘贴:p将什么放在哪里?

如果不需要保存之前的输入实验,请用:q!退出并重新打开同一个文件。以下练习将以保存的三行为基础进行。

首先,用1G移动到第一行,然后按yy。这是按两次小写字母y的操作,复制当前整行。接着按小写字母p,结果如下:

apple red
apple red
banana yellow
apple green!

用yy复制的是行单位文本。因此,p会将其作为新行插入到光标所在行的下方。这与在当前字符后面立即连接字符串的操作不同。当用p插入字符单位复制的内容时,它会插入到当前字符后面,但本次yy练习是行单位的。POSIX行单位粘贴, Vim复制·粘贴

复制的内容会进入寄存器,即vi内部记忆文本的空间。本练习中未指定名称的p默认使用无名寄存器的内容。如果将其视为自动粘贴终端或操作系统剪贴板内容的命令,则容易混淆。

接下来,按dd删除当前行,然后立即按一次u撤销该删除。dd也会将删除的行放入寄存器。因此,如果在yy之后执行dd,则下一个p要插入的内容可能会不同。最初,通过复制后立即粘贴、删除后立即撤销来练习,更容易确认结果。

也可以练习移动已删除的行。在原始三行中,如果将光标放在第一行并按dd,banana yellow会上升到第一行。在这种状态下,如果按p,被删除的apple red会插入到当前光标所在的banana行下方。它不是根据删除前的位置进行粘贴的。

u的撤销历史因实现而异。这里只学习撤销上一次更改的操作。我们不假设Vim的多级撤销或Ctrl-r重做在所有vi中都相同。Vim和vi的撤销差异

搜索和替换:先查找,再缩小范围进行更改

搜索是在命令状态下输入/apple并按Enter。

/apple

它会在当前光标位置之后查找匹配的位置。小写字母n以与上次搜索相同的方向查找下一个匹配项,大写字母N则以相反方向查找。搜索是否从文件末尾绕回到开头可能因设置而异。在/搜索之后,n通常向前查找,N向后查找。Vim搜索说明

替换不仅在屏幕上查找文本,还会更改实际的编辑内容。以下示例在默认设置下将apple替换为orange。每行都是比较范围的独立示例,并非要求从上到下连续执行。

WRIMO-MD-TABLE-0]%表示文件整行范围,末尾的g表示该行内的所有匹配项。仅仅添加g并不意味着替换整个文件。例如,如果当前行是apple apple,则:s/apple/orange/的结果是orange apple,:s/apple/orange/g的结果是orange orange。Vim替换和范围

最初,用/apple确认位置,然后只替换当前行。如果结果正确,则扩展到所需的行范围。:%s/…/…/g可以一次性替换不同上下文中的相同单词。

查找部分会根据正则表达式的模式规则进行解释。特别是,像.这样的符号可能具有不同于字面字符的含义,替换内容中的&也具有特殊含义。请勿将本文中简单的英文单词示例直接应用于任意路径或复杂字符串。如果在替换后立即发现错误结果,请按Esc后按u撤销上一次更改并进行确认。用:w保存的更改即使之后使用:q!也不会自动撤销。

练习后的最小参考表

下表中,移动·编辑键在按Esc后的命令状态下使用。冒号命令和搜索最后需要按Enter。区分大小写。

目的 键或命令 记住的要点
返回命令状态 Esc 结束输入并开始下一个命令
开始输入 i / a / o 字符前 / 字符后 / 当前行下方新行
保存·退出 :w / :q / :wq 保存 / 退出 / 保存并退出
放弃更改并退出 :q! 放弃上次保存后的更改
移动一格 h / j / k / l 左 / 下 / 上 / 右
行·单词移动 0 / $ / w / b 行首字符 / 行尾字符 / 下一个·上一个单词开头
文件末尾·开头 G / 1G 最后一行 / 第一行
行删除·复制·粘贴 dd / yy / p 行单位内容粘贴到当前行下方
撤销上次更改 u 本文仅假设一次撤销
查找·下一个结果 /单词 / n / N 搜索 / 同方向 / 反方向

Vim的gg、Visual选择模式、Ctrl-r、:syntax、vimtutor未包含在本文的vi通用练习中。在确认实际执行程序为Vim后,可以单独学习。

完成练习后,用:wq或:q!退出vi。如果不再需要文件,请在同一个shell中按如下方式清理本次创建的文件和空目录。rmdir在目录中存在其他文件时会拒绝删除。

rm "$vi_lab_dir/practice.txt"
rmdir "$vi_lab_dir"

执行验证范围和来源

2026年10月9日,在macOS arm64上,使用/usr/bin/vi和Vim 9.1(补丁1~1752),以兼容模式打开临时文本文件,不使用用户设置、历史记录或交换文件进行了验证。确认了输入、保存·退出、未保存状态下:q的拒绝和:q!后文件的保留、移动、行复制·删除·粘贴、一次撤销、搜索方向、替换范围和结果。

这些结果是在Vim中进行的练习。其他vi实现、读者的服务器设置、键映射、韩语输入法和终端剪贴板操作未进行执行验证。POSIX官方页面直接访问时出现访问受阻,因此通过可搜索的规范片段进行了交叉验证,并未下载并审查整个规范文本。详细说明结合使用了以下Vim官方帮助和实际命令结果。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注