深入探索vi编辑器:从基础到高级应用
1. 基础操作与文件编辑
在编辑文件时,我们常常会遇到一些难以阅读的短行文本。这时,使用
J
命令可以将两行文本合并为一行。操作步骤如下:
1. 将光标定位到第一行的任意位置。
2. 按下
J
键,即可完成两行的合并。
例如:
Yesterday.
I received
the product demo.
按下
J
键后,文本变为:
Yesterday, I received the product demo.
如果在
J
命令前加上数字参数,还可以合并连续的多行文本。
在学习
vi
编辑器的过程中,我们可能会不小心做出一些错误的编辑操作。如果不想保存这些修改,直接退出编辑器,可以使用
:q!
命令。具体操作是在命令模式下输入
:q!
,然后按下回车键,这样自上次保存文件以来所做的所有编辑都会被丢弃。
2. 文件中的快速移动
在
vi
编辑器中,我们可以通过多种方式在文件中快速移动光标,提高编辑效率。
2.1 按屏幕移动
可以将
vi
文件想象成写在长卷纸上的文本,屏幕就像是一个窗口,通常显示24行文本。通过以下命令可以实现屏幕的滚动:
| 命令 | 功能 |
| ---- | ---- |
|
^F
| 向前滚动一屏 |
|
^B
| 向后滚动一屏 |
|
^D
| 向前滚动半屏 |
|
^U
| 向后滚动半屏 |
注:
^
代表
CTRL
键,例如
^F
表示同时按下
CTRL
键和
F
键。
此外,还有
^E
和
^Y
命令,分别用于向上和向下滚动一行,但在一些小型系统(如PDP - 11或PC - XT的Xenix)中不可用。
在当前屏幕内,还可以使用以下命令移动光标:
| 命令 | 功能 |
| ---- | ---- |
|
H
| 移动到屏幕的第一行 |
|
M
| 移动到屏幕的中间行 |
|
L
| 移动到屏幕的最后一行 |
|
nH
| 移动到屏幕顶部以下第n行 |
|
nL
| 移动到屏幕底部以上第n行 |
这些屏幕移动命令还可用于编辑操作,例如
dH
可以删除到屏幕显示的第一行。
在当前行内,也有一些常用的移动命令:
| 命令 | 功能 |
| ---- | ---- |
|
RETURN
| 移动到下一行的开头 |
|
A
| 移动到下一行的开头 |
|
+
| 移动到下一行的开头 |
|
-
| 移动到上一行的开头 |
|
A
| 移动到当前行的第一个字符,忽略空格或制表符 |
|
0
| 移动到当前行的第一个位置,即使该位置为空 |
2.2 按文本块移动
除了按屏幕和行移动,还可以按文本块(单词、句子或段落)来移动光标。之前我们已经学习过使用
w
和
b
命令向前和向后移动一个单词。以下是按句子和段落移动的命令:
| 命令 | 功能 |
| ---- | ---- |
|
)
| 移动到下一个句子的开头 |
|
(
| 移动到上一个句子的开头 |
|
}
| 移动到下一个段落的开头 |
|
{
| 移动到上一个段落的开头 |
vi
程序通过查找句点后至少两个空格,或行末的非空白句点来确定句子的结尾。如果句点后只有一个空格,句子将不会被识别。段落则定义为到下一个空白行或
mm
或
ms
宏包中的默认段落宏(如
-IP
、
.P
、
.PP
或
.QP
)的文本。这些被识别为段落分隔符的宏可以使用
:set
命令进行自定义。
我们还可以将数字与移动命令结合使用,例如
3)
可以向前移动三个句子。同时,移动命令也可用于编辑操作,如
d)
可以删除到当前句子的结尾,
2y}
可以复制( Yank)向前两个段落的内容。
2.3 按搜索移动
在大型文件中,通过搜索特定的文本模式可以快速定位到所需位置。搜索命令是
/
,操作步骤如下:
1. 输入
/
,此时
/
会显示在屏幕的底部。
2. 输入要搜索的模式(可以是一个单词或其他字符组合)。
3. 按下回车键,搜索将从当前光标位置开始向前进行,如果到达文件末尾仍未找到匹配项,会自动回到文件开头继续搜索。如果找到匹配项,光标将移动到该位置;如果未找到,屏幕底部的状态行将显示“Pattern not found”。
例如,要搜索“shows”,可以输入
/shows
并按下回车键。
还可以使用
?
命令进行反向搜索,操作方法与正向搜索类似,只是搜索方向相反。
搜索后,为了方便再次搜索相同的模式,提供了以下命令:
| 命令 | 功能 |
| ---- | ---- |
|
n
| 重复上一次搜索,方向相同 |
|
N
| 重复上一次搜索,方向相反 |
|
/<RETURN>
| 重复上一次正向搜索 |
|
?<RETURN>
| 重复上一次反向搜索 |
在当前行内,还有一个小型的搜索命令
f
,它可以将光标移动到该行中下一个指定字符的位置。例如,在编辑行“Today, I’ll start”时,输入
f'
,光标将移动到该行中第一个
'
字符的位置。使用
df'
可以删除到并包含指定字符(这里是
'
),此命令在删除或复制部分行时非常有用。
t
命令与
f
命令类似,但它会将光标定位在搜索字符的前一个位置。同样,也可以使用数字前缀来定位第n个匹配项,如
2ta
会将光标定位到该行中第二个
a
字符的前一个位置。
2.4 按行号移动
文件中的每一行都有一个顺序编号,通过指定行号可以快速在文件中移动。要显示行号,可以使用
:set nu
选项(此操作在后续章节会详细介绍)。在
vi
中,还可以使用
^G
命令在屏幕底部显示当前行号、文件的总行数以及当前行号占总行数的百分比。例如,对于文件“letter”,使用
^G
可能会显示:
'.letter" line 10 of 40 --25%--
使用
G
命令可以根据行号移动光标。如果在
G
命令前加上行号,如
44G
,光标将移动到第44行的开头;如果只输入
G
,光标将移动到文件的最后一行。
''
命令可以返回到原来所在行的开头,
``
命令可以精确返回到原来的位置。如果之前执行过搜索命令(
/
或
?
),则可以使用相应的命令返回到搜索开始时的光标位置。
通过
^G
显示的总行数,可以大致估算要移动的行数。例如,如果你在一个1000行文件的第10行,并且知道要在文件末尾附近开始编辑,可以使用
800G
大致定位到目标位置。
以下是按行号移动的mermaid流程图:
graph TD;
A[开始] --> B{是否知道目标行号};
B -- 是 --> C[输入行号+G命令];
B -- 否 --> D[使用^G查看当前行信息];
D --> E{估算目标行号};
E -- 是 --> C;
E -- 否 --> F[继续编辑或重新估算];
C --> G[光标移动到目标行];
G --> H[结束];
F --> B;
3. 高级操作与自定义设置
在掌握了
vi
编辑器的基本操作后,我们可以进一步学习一些高级操作和自定义设置,以满足更多的编辑需求。
3.1 命令行选项
vi
命令还有一些其他有用的选项:
-
直接定位到特定行或模式
:
-
vi +n letter
:打开
letter
文件并定位到第n行。
-
vi + letter
:打开
letter
文件并定位到最后一行。
-
vi +/pattern letter
:打开
letter
文件并定位到第一个匹配
pattern
的行。
例如,要打开
letter
文件并直接定位到包含“Alcuin”的行,可以使用命令
vi +/Alcuin letter
。需要注意的是,模式中不能包含空格,因为空格后的字符会被解释为文件名。
如果在编辑过程中需要中途离开,可以插入一个特定的模式(如
ZZZ
或
HERE
)来标记位置。下次返回文件时,只需使用
/ZZZ
或
/HERE
命令即可快速定位到标记处。
- 只读模式 :当我们只想查看文件内容,不想对其进行修改时,可以使用只读模式打开文件。有两种方式可以实现:
-
vi -R letter -
view letter
在只读模式下,可以使用所有的
vi
移动命令,但无法对文件进行任何编辑操作。
-
恢复缓冲区
:在编辑文件时,系统可能会出现崩溃的情况。为了避免丢失自上次保存以来所做的编辑,可以使用
-r选项恢复编辑缓冲区。具体操作是在系统恢复运行后,首次调用文件时使用vi -r letter命令。如果首次调用文件时没有使用-r选项,之前缓冲的编辑内容将会丢失。此外,还可以使用:pre命令强制系统保存缓冲区,这在没有写入权限但又不想丢失编辑内容时非常有用。
3.2 自定义
vi
编辑器
可以通过设置一些选项来影响
vi
编辑器的操作方式。例如,使用
:set
命令可以设置右边界,使
vi
自动换行,从而无需手动插入回车符。
vi
编辑器会读取主目录下的
.exrc
初始化文件,我们可以在该文件中放置
set
命令,以修改
vi
编辑器每次启动时的行为。此外,还可以在本地目录中设置
.exrc
文件,为不同的编辑环境初始化各种选项。例如,为编辑文本和编辑源程序分别定义不同的选项集。在启动
vi
时,会先执行主目录下的
.exrc
文件,然后执行当前目录下的
.exrc
文件。
通过以上这些高级操作和自定义设置,我们可以更加灵活、高效地使用
vi
编辑器进行文件编辑。
深入探索vi编辑器:从基础到高级应用
4. 插入模式的扩展运用
在
vi
编辑器中,除了基本的插入模式操作,还有一些额外的方式可以进入插入模式,以满足不同的编辑需求。
| 命令 | 功能 |
|---|---|
i
| 在当前光标位置前插入文本 |
I
| 在当前行的开头插入文本 |
a
| 在当前光标位置后插入文本 |
A
| 在当前行的末尾插入文本 |
o
| 在当前行的下一行插入新行并开始插入文本 |
O
| 在当前行的上一行插入新行并开始插入文本 |
例如,当你在编辑一个文件时,若想要在当前行开头添加内容,可直接按下
I
键进入插入模式进行输入;若想在当前行下方新开一行并输入,按下
o
键即可。
下面是一个简单的mermaid流程图,展示了不同插入模式命令的选择流程:
graph TD;
A[开始编辑] --> B{插入位置需求};
B -- 当前位置前 --> C[i命令];
B -- 当前行开头 --> D[I命令];
B -- 当前位置后 --> E[a命令];
B -- 当前行末尾 --> F[A命令];
B -- 当前行下一行 --> G[o命令];
B -- 当前行上一行 --> H[O命令];
C --> I[进入插入模式输入];
D --> I;
E --> I;
F --> I;
G --> I;
H --> I;
I --> J[结束插入];
5. 缓冲区的使用
在
vi
编辑器中,缓冲区用于存储删除、复制( Yank)和最后执行的命令等信息。这为我们的编辑操作提供了很大的便利。
5.1 删除与复制到缓冲区
当使用
d
命令进行删除操作或
y
命令进行复制操作时,被删除或复制的内容会被存储到缓冲区中。例如,使用
dw
可以删除一个单词并将其存储在缓冲区,使用
yy
可以复制当前行到缓冲区。
5.2 从缓冲区粘贴内容
当需要将缓冲区中的内容粘贴到文件中时,可以使用
p
或
P
命令。
p
命令会将缓冲区的内容粘贴到当前光标位置之后,
P
命令会将缓冲区的内容粘贴到当前光标位置之前。
以下是缓冲区操作的简单示例:
原始文本:This is a test.
操作:使用`dw`删除“is”,再使用`p`粘贴
结果:This is a test. is
6. 标记功能
在编辑大型文件时,我们可能需要频繁在不同位置之间切换。
vi
编辑器提供了标记功能,方便我们快速定位到之前标记的位置。
6.1 设置标记
使用
ma
(
a
可以是任意小写字母)命令可以在当前光标位置设置一个标记。例如,在编辑文件时,当你到达一个重要的位置,按下
ma
,就为该位置设置了一个名为
a
的标记。
6.2 跳转到标记位置
使用
'a
命令可以跳转到标记
a
所在行的开头,使用
a
命令可以精确跳转到标记
a
的位置。
下面是一个使用标记功能在文件中定位的mermaid流程图:
graph TD;
A[开始编辑文件] --> B{是否需要设置标记};
B -- 是 --> C[使用ma设置标记];
B -- 否 --> D{是否需要跳转到标记位置};
C --> D;
D -- 是 --> E{是否精确跳转};
E -- 是 --> F[使用``a``跳转];
E -- 否 --> G[使用'a跳转];
F --> H[到达标记位置继续编辑];
G --> H;
H --> I{是否继续编辑};
I -- 是 --> B;
I -- 否 --> J[结束编辑];
7. 综合运用与效率提升
在实际使用
vi
编辑器时,我们可以将上述各种操作和功能综合运用,以提高编辑效率。
例如,在编辑一个包含大量代码的文件时,我们可以先使用搜索命令
/
快速定位到关键代码段,然后使用标记功能标记该位置。在对代码进行修改时,使用移动命令(如按屏幕、文本块、行号移动)在代码中灵活穿梭。当需要复制或删除部分代码时,利用缓冲区功能进行操作。如果不小心进行了错误的编辑,还可以使用
:q!
命令不保存修改直接退出。
同时,通过自定义
vi
编辑器的设置,如设置右边界自动换行、显示行号等,可以让编辑过程更加舒适和高效。
总之,
vi
编辑器是一个功能强大且灵活的工具,通过深入学习和熟练掌握其各种操作和功能,我们可以在文件编辑工作中事半功倍。
超级会员免费看
10

被折叠的 条评论
为什么被折叠?



