Unix/Linux - vi 编辑器教程

在本章中,我们将了解 vi 编辑器在 Unix 中的工作原理。 在 Unix 中有许多编辑文件的方法。 使用面向屏幕的文本编辑器 vi 编辑文件是最好的方法之一。 此编辑器使您能够在文件中的其他行的上下文中编辑行。

称为 VIM 的 vi 编辑器的改进版本现在也已可用。 这里,VIM 代表 Vi IMproved.

vi 通常被认为是 Unix 编辑器中事实上的标准,因为 −

  • 它通常适用于所有 Unix 系统。

  • 它的实现在所有方面都非常相似。

  • 它只需要很少的资源。

  • 它比 edex 等其他编辑器更易于使用。

您可以使用 vi 编辑器编辑现有文件或从头开始创建新文件。 您也可以使用此编辑器来读取文本文件。


启动 vi 编辑器

下表列出了使用 vi 编辑器的基本命令 −

序号 命令 & 描述
1

vi filename

如果文件不存在则创建一个新文件,否则打开一个现有文件。

2

vi -R filename

以只读模式打开现有文件。

3

view filename

以只读模式打开现有文件。

下面是创建一个新文件 testfile 的例子,如果它在当前工作目录中不存在的话 −

$vi testfile

以上命令会产生如下输出 −

|
~
~
~
~
~
~
~
~
~
~
~
~
"testfile" [New File]    

您会注意到光标后的每一行都有一个波浪号 (~)。 波浪号表示未使用的行。 如果一行不是以波浪号开头并且看起来是空白的,则存在空格、制表符、换行符或其他一些不可见的字符。

您现在有一个打开的文件可以开始处理。 在继续之前,让我们了解一些重要的概念。


操作模式

在使用vi编辑器时,我们通常会遇到以下两种模式 −

  • 命令模式 − 此模式使您能够执行管理任务,例如保存文件、执行命令、移动光标、剪切(拉动)和粘贴行或词,以及查找和替换。 在这种模式下,无论您键入什么,都将被解释为命令。

  • 插入模式 − 此模式使您能够将文本插入到文件中。 在此模式下键入的所有内容都被解释为输入并放入文件中。

vi 始终以命令模式 启动。 要输入文本,您必须处于插入模式,只需键入 i。 要退出插入模式,请按 Esc 键,这会将您带回命令模式。

提示 − 如果您不确定自己处于哪种模式,请按两次 Esc 键; 这将带您进入命令模式。 您使用 vi 编辑器打开一个文件。 从键入一些字符开始,然后进入命令模式以了解其中的区别。


退出 vi

退出 vi 的命令是 :q。 进入命令模式后,输入冒号和"q",然后回车。如果您的文件以任何方式被修改,编辑器都会警告您,并且不会让您退出。 要忽略此消息,退出 vi 而不保存的命令是 :q!。 这使您可以在不保存任何更改的情况下退出 vi。

保存编辑器内容的命令是:w。 您可以将上述命令与 quit 命令结合使用,或者使用 :wq 并返回。

保存更改并退出 vi 的最简单方法是使用 ZZ 命令。 当您处于命令模式时,键入 ZZZZ 命令的工作方式与 :wq 命令相同。

如果您想为文件指定/说明任何特定名称,可以通过在 :w 之后指定它来实现。 例如,如果您想将正在处理的文件另存为名为 filename2 的另一个文件名,您可以键入 :w filename2 并返回。


在文件中移动

要在文件中移动而不影响文本,您必须处于命令模式(按两次 Esc)。 下表列出了一些可用于一次移动一个字符的命令 −

序号 命令 & 描述
1

k

光标上移一行

2

j

将光标向下移动一行

3

h

将光标向左移动一个字符的位置

4

l

将光标向右移动一个字符位置

在文件内移动需要考虑以下几点 −

  • vi 区分大小写。 使用命令时需要注意大小写。

  • vi 中的大多数命令都可以以您希望该操作发生的次数作为前缀。 例如,2j 将光标向下移动光标位置两行。

在 vi 中还有许多其他的在文件内移动的方法。 请记住,您必须处于命令模式(按两次 Esc)。 下表列出了一些在文件中移动的命令 −

序号 命令 & 描述
1

0 or |

将光标定位在行首

2

$

将光标定位在行尾

3

w

将光标定位到下一个单词

4

b

将光标定位到前一个单词

5

(

将光标定位到当前句子的开头

6

)

将光标定位到下一句的开头

7

E

移动到空白分隔词的末尾

8

{

向后移动一段

9

}

向前移动一个段落

10

[[

向后移动一个部分

11

]]

向前移动一个部分

12

n|

移动到当前行的 n

13

1G

移动到文件的第一行

14

G

移动到文件的最后一行

15

nG

移动到文件的第 nth

16

:n

移动到文件的第 nth

17

fc

前进到c

18

Fc

回到c

19

H

移动到屏幕顶部

20

nH

从屏幕顶部移至第 n

21

M

移动到屏幕中间

22

L

移动到屏幕底部

23

nL

从屏幕底部移动到第 n

24

:x

冒号后跟数字会将光标定位在由 x 表示的行号上


控制命令

以下命令可与控制键一起使用以执行下表中给出的功能 −

序号 命令 & 描述
1

CTRL+d

向前移动 1/2 屏幕

2

CTRL+f

向前移动一屏

3

CTRL+u

向后移动 1/2 屏幕

4

CTRL+b

向后移动一屏

5

CTRL+e

将屏幕上移一行

6

CTRL+y

将屏幕向下移动一行

7

CTRL+u

将屏幕向上移动 1/2 页

8

CTRL+d

将屏幕向下移动 1/2 页

9

CTRL+b

将屏幕向上移动一页

10

CTRL+f

将屏幕向下移动一页

11

CTRL+I

重绘屏幕


编辑文件

要编辑文件,您需要处于插入模式。 从命令模式进入插入模式的方法有很多种 −

序号 命令 & 描述
1

i

在当前光标位置之前插入文本

2

I

在当前行的开头插入文本

3

a

在当前光标位置之后插入文本

4

A

在当前行的末尾插入文本

5

o

在光标位置下方为文本输入创建一个新行

6

O

在光标位置上方为文本输入创建一个新行


删除字符

这是一个重要命令列表,可用于删除打开文件中的字符和行 −

序号 命令 & 描述
1

x

删除光标所在位置的字符

2

X

删除光标所在位置之前的字符

3

dw

从当前光标位置删除到下一个单词

4

d^

从当前光标位置删除到行首

5

d$

从当前光标位置删除到行尾

6

D

从光标位置删除到当前行的末尾

7

dd

删除光标所在行

如前所述,vi 中的大多数命令都可以以您希望该操作发生的次数作为前缀。 例如,2x 删除光标位置下的两个字符,2dd 删除光标所在的两行。

建议在我们继续之前先练习这些命令。


更改命令

您还可以在 vi 中更改字符、单词或行而不删除它们。 下面是相关命令 −

序号 命令 & 描述
1

cc

删除该行的内容,使您处于插入模式。

2

cw

将光标所在的单词从光标更改为单词的小写 w 结尾。

3

r

替换光标下的字符。 输入替换后vi返回命令模式。

4

R

覆盖以当前光标下的字符开头的多个字符。 您必须使用 Esc 停止覆盖。

5

s

用您键入的字符替换当前字符。 之后,您将处于插入模式。

6

S

删除光标所在的行并用新文本替换它。 输入新文本后,vi 仍处于插入模式。


复制和粘贴命令

您可以从一个地方复制行或单词,然后您可以使用以下命令将它们粘贴到另一个地方 −

序号 命令 & 描述
1

yy

Copies the current line.

2

yw

从小写 w 光标所在的字符复制当前单词,直到单词结尾。

3

p

将复制的文本放在光标之后。

4

P

将抽取的文本放在光标之前。


高级命令

有一些高级命令可以简化日常编辑并允许更有效地使用 vi −

序号 命令 & 描述
1

J

将当前行与下一行连接起来。 j 个命令加入许多行。

2

<<

将当前行向左移动一个移位宽度。

3

>>

将当前行向右移动一个移位宽度。

4

~

切换光标下字符的大小写。

5

^G

同时按下 Ctrl 和 G 键显示当前文件名和状态。

6

U

将当前行恢复到光标进入该行之前的状态。

7

u

这有助于撤消在文件中所做的最后更改。 再次输入"u"将重新进行更改。

8

J

将当前行与下一行连接起来。 计数加入那么多行。

9

:f

显示当前在文件中的位置%和文件名,文件总数。

10

:f filename

将当前文件重命名为文件名。

11

:w filename

写入文件文件名。

12

:e filename

用文件名打开另一个文件。

13

:cd dirname

将当前工作目录更改为目录名。

14

:e #

在两个打开的文件之间切换。

15

:n

如果您使用 vi 打开多个文件,请使用 :n 转到系列中的下一个文件。

16

:p

如果您使用 vi 打开多个文件,请使用 :p 转到系列中的上一个文件。

17

:N

如果您使用 vi 打开多个文件,请使用 :N 转到系列中的上一个文件。

18

:r file

读取文件并将其插入到当前行之后。

19

:nr file

读取文件并将其插入到 n 行之后。


单词和字符搜索

vi 编辑器有两种搜索方式:stringcharacter。对于字符串搜索,使用 /? 命令。 当您启动这些命令时,刚刚键入的命令将显示在屏幕的最后一行,您可以在其中键入要查找的特定字符串。

这两个命令仅在搜索发生的方向不同 −

  • / 命令在文件中向前(向下)搜索。

  • ? 命令在文件中向后(向上)搜索。

nN 命令分别以相同或相反的方向重复先前的搜索命令。 有些字符具有特殊含义。 这些字符前面必须有反斜杠 (\),才能作为搜索表达式的一部分包含在内。

序号 字符和描述
1

^

在行首搜索(在搜索表达式的开头使用)。

2

.

匹配单个字符。

3

*

匹配前一个字符的零个或多个。

4

$

行尾(在搜索表达式的末尾使用)。

5

[

开始一组匹配或不匹配的表达式。

6

<

这是放在用反斜杠转义的表达式中,以查找单词的结尾或开头。

7

>

这有助于查看上面的 '<' 字符描述。

字符搜索在一行内搜索命令后输入的字符。fF 命令只在当前行搜索一个字符。f 向前搜索,F 向后搜索,光标移动到找到的字符的位置。

tT命令只在当前行搜索一个字符,但是对于t,光标移动到字符之前的位置, T 向后搜索行到字符之后的位置。


set 命令

您可以使用以下 :set 命令更改 vi 屏幕的外观。 进入命令模式后,键入 :set,然后输入以下任何命令。

序号 命令 & 描述
1

:set ic

搜索时忽略大小写

2

:set ai

设置自动缩进

3

:set noai

取消自动缩进

4

:set nu

在左侧显示带有行号的行

5

:set sw

设置软件制表位的宽度。 例如,您可以使用此命令将移位宽度设置为 4 — :set sw = 4

6

:set ws

如果设置了wrapscan,并且在文件底部没有找到这个词,它会尝试从头开始搜索

7

:set wm

如果此选项的值大于零,编辑器将自动"自动换行"。 例如,要将换行边距设置为两个字符,您可以键入::set wm = 2

8

:set ro

将文件类型更改为"只读"

9

:set term

打印终端类型

10

:set bf

丢弃输入中的控制字符


运行命令

vi 具有从编辑器中运行命令的能力。 要运行命令,您只需要进入命令模式并键入:! 命令。

例如,如果您想在尝试使用该文件名保存文件之前检查该文件是否存在,您可以键入 :! ls 并且您将在屏幕上看到 ls 的输出。

您可以按任意键(或命令的转义序列)返回您的 vi 会话。


替换文字

替换命令 (:s/) 使您能够快速替换文件中的单词或单词组。 以下是替换文本的语法 −

:s/search/replace/g

g 代表全局。 此命令的结果是更改了光标行上的所有匹配项。


重要注意事项

以下几点将有助于您使用 vi 取得成功 −

  • 您必须处于命令模式才能使用这些命令。 (随时按两次 Esc 以确保您处于命令模式。)

  • 你必须小心这些命令。 这些是区分大小写的。

  • 您必须处于插入模式才能输入文本。