Linux vi 编辑器的命令行模式是其核心操作模式之一,用户在 vi 中打开文件后,默认进入的就是这种模式,命令行模式主要用于导航、执行文本操作命令(如复制、粘贴、删除、查找等),以及进入其他模式(如插入模式、末行模式),熟练掌握命令行模式的操作是高效使用 vi 的关键,以下将详细介绍该模式的功能、常用命令及使用技巧。

在命令行模式下,所有输入都会被解释为命令,而非文本内容,用户需要明确当前所处的模式,避免误操作,若在命令行模式下直接输入字母,系统会将其视为命令执行,而非插入文本,这种设计虽然初学者可能感到不适应,但一旦熟练,便能通过快捷键实现高效编辑。
基本导航命令
导航是命令行模式最基础的功能,通过快捷键快速定位光标位置,提高编辑效率。
- 字符级导航:
h:光标左移一个字符。l:光标右移一个字符。j:光标下移一行。k:光标上移一行。^:移动到当前行的第一个非空白字符。- 移动到当前行的末尾。
- 单词级导航:
w:移动到下一个单词的起始位置(标点符号视为分隔符)。e:移动到下一个单词的末尾。b:移动到上一个单词的起始位置。W、E、B:与w、e、b类似,但将标点符号视为单词的一部分。
- 行与屏幕级导航:
gg:跳转到文件的第一行。G:跳转到文件的最后一行。nG(如5G):跳转到第n行。H:跳转到屏幕的第一行。M:跳转到屏幕的中间行。L:跳转到屏幕的最后一行。
- 滚动屏幕:
Ctrl+f:向下滚动一页(forward)。Ctrl+b:向上滚动一页(backward)。Ctrl+d:向下滚动半页(down)。Ctrl+u:向上滚动半页(up)。
文本编辑命令
命令行模式支持高效的文本编辑操作,包括删除、复制、粘贴等,这些命令通常与动作命令结合使用。
- 删除命令(d):
x:删除光标所在处的字符。X:删除光标左侧的字符。dd:删除当前行。ndd(如3dd):删除从当前行开始的n行。d^:删除从光标处到行首的内容。d$:删除从光标处到行尾的内容。dw:删除一个单词。dG:删除从当前行到文件末尾的所有内容。
- 复制命令(y):
yy:复制当前行。nyy(如2yy):复制从当前行开始的n行。y^:复制从光标处到行首的内容。y$:复制从光标处到行尾的内容。yw:复制一个单词。
- 粘贴命令(p):
p:将缓冲区中的内容粘贴到光标所在位置的下一行(针对行操作)或光标右侧(针对字符操作)。P:将缓冲区中的内容粘贴到光标所在位置的上一行(针对行操作)或光标左侧(针对字符操作)。
- 替换与撤销:
r:替换光标所在处的字符(如ra将当前字符替换为a)。R:进入替换模式,连续替换光标处的字符。u:撤销上一次操作。Ctrl+r:重做被撤销的操作。
搜索与替换命令
- 文本搜索:
/pattern:从光标处向下搜索匹配pattern的文本,按n跳转到下一个匹配项,N跳转到上一个匹配项。?pattern:从光标处向上搜索匹配pattern的文本,n和N的跳转方向与 相反。
- 替换命令(需进入末行模式):
s/old/new:替换当前行中第一个old为new。s/old/new/g:替换当前行中所有old为new。%s/old/new/g:替换整个文件中所有old为new。n,ms/old/new/g:替换第n行到第m行中所有old为new。
其他实用命令
- 重复执行:
(点号):重复上一次的编辑命令(如删除、复制等)。
(图片来源网络,侵删) - 合并行:
J:将当前行与下一行合并为一行。
- 显示/隐藏行号:
set nu:显示行号。set nonu:隐藏行号。
- 退出 vi:
q:退出 vi(若未修改文件)。q!:强制退出 vi(不保存修改)。wq或x:保存修改并退出。
命令行模式与模式的切换
命令行模式是 vi 的“中枢”,通过特定命令可进入其他模式:
- 按
i(insert)、a(append)、o(open new line below)等进入插入模式,用于输入文本。 - 按 (冒号)进入末行模式,执行保存、退出、替换等全局命令。
- 按
v进入可视模式,选择文本块后进行编辑操作。 - 插入模式下按
Esc键可返回命令行模式。
命令行模式操作技巧
- 组合命令:通过“操作+动作”组合实现高效编辑,如
d2w(删除两个单词)、y3l(复制三个字符)。 - 使用寄存器:通过
"寄存器号+命令操作指定寄存器,如"ayy将当前行复制到寄存器a,"ap从寄存器a粘贴。 - 标记与跳转:通过
m(mark)设置标记(如ma在当前行设置标记a),通过 (单引号)跳转到标记位置(如'a跳转到标记a所在行)。
以下为常用命令的总结表格:
| 命令类型 | 命令 | 功能说明 |
|---|---|---|
| 光标移动(字符级) | h、j、k、l | 左、下、上、右移动光标 |
| 光标移动(行级) | gg、G、nG | 跳转至首行、末行、第n行 |
| 光标移动(单词级) | w、e、b | 跳转至下一个单词首/末、上一个单词首 |
| 删除 | dd、ndd、dw | 删除当前行、n行、一个单词 |
| 复制 | yy、nyy、yw | 复制当前行、n行、一个单词 |
| 粘贴 | p、P | 粘贴至光标下/上或左/右 |
| 撤销与重做 | u、Ctrl+r | 撤销、重做操作 |
| 搜索 | /pattern、?pattern | 向下/向上搜索文本 |
| 退出 | wq、:q! | 保存退出、不保存强制退出 |
相关问答FAQs
Q1: 在 vi 命令行模式下,如何快速删除从当前光标到行首的内容?
A1: 使用命令 d^。d 表示删除操作,^ 表示跳转到当前行的第一个非空白字符,组合后即可删除光标到行首的所有字符,若光标位于某行中间,输入 d^ 后,该行从光标处到行首的内容将被删除。
Q2: 如何在 vi 命令行模式下替换整个文件中所有特定字符串?
A2: 需进入末行模式执行替换命令,在命令行模式下按 ,输入 %s/old_string/new_string/g,按回车即可。 表示整个文件,s 表示替换,old_string 为被替换的字符串,new_string 为替换后的字符串,g 表示全局替换(即替换所有匹配项,而非仅第一个),若需确认替换,可将 g 改为 gc,即 %s/old_string/new_string/gc,此时每次替换前会提示用户确认。

