在 UNIX 操作系统中,文档编辑器有很多种,其中最友好的工具就是 vi. 该文档编辑器可以让用户在文件中基于上下文执行编辑操作。
现在,用户可以使用 vi 文档编辑器的升级版 VIM.这里的 VIM 中的 M 就是源自改善的意思。
vi 通常会被认为是 UNIX 编辑器的实施标准,原因如下:
用户可以使用 vi 编辑器来编辑已经存在的文件,当然也可以使用它创建一个新的文件。此外,用户也可以使用它来浏览一个文本文件。
用户可以通过下面几种方法来开启 vi 编辑器:
指令 | 描述 |
---|---|
vi filename | 如果文件不存在,则创建这个文件,否则打开这个文件 |
vi -R filename | 以只读的方式打开一个已存在的文件 |
view filename | 以只读的方式打开一个已存在的文件 |
下面是一个创建新文件 testfile 的例子,当然,前提是该文件在当前目录内不存在。
$vi testfile
然后用户会在屏幕上看到如下显示:
|
~
~
~
~
~
~
~
~
~
~
~
~
"testfile" [New File]
此时,应该注意到的是在每一行都的开头都会有一个波浪号(~),这个波浪号代表该行并没有被使用。如果某一行没有以波浪号开头,那么这就意味着有空格存在,也可能是换行符或其他的不易看见的符号。
所以,在我们正式使用 vi 编辑器之前,让我们理解一些微小但是很重要的。
使用 vi 编辑器时通常会在下面两个模式之间来回切换:
vi 编辑器通常会以指令模式打开。如果用户希望键入文本的话,用户必须把当前模式切换为插入模式。切换模式到插入模式时,用户可以简单的按 i 键。离开插入模式,可以按 Esc 键。
值得注意的是,如果用户不清楚当前处于哪种模式,用户可以按两次 Esc 键,编辑器就会回到指令模式。用户可以使用 vi 编辑器打开一个文本,并且键入一些字符,然后切换到指令模式,体验一下这前后的差别。
离开 vi 编辑器的指令是 :q
。在指令模式下,一旦键入冒号后跟字母 q,再单击回车。如果文档有修改的话,编辑器会报出提示。如果不想看到这样的提示信息,用户可以使用 :q!
。这个指令可以在不保存更改的情况下离开 vi 编辑器。
保存文档的指令时 :w
。用户可以将其与上述的离开指令融合在一起使用,比如 :wq
,然后单击回车。
保存文件更新且退出的最快捷的方法就是 ZZ 指令。当用户在指令模式下键入 zz 指令后,效果等同于 :wq
。
用户也可以通过再 :w 后指定特定的文件名来指定不同的文件名来保存。比如,如果用户希望将文件保存为 filename2,用户可以键入:w filename2, 然后点击回车。
为了在文件内不影响文本内容的情况下移动光标,用户必须在指令模式(连续两次按下 Esc 键)下来操作。下面是文件内移动光标的相关指令:
指令 | 描述 |
---|---|
k | 向上移动一行 |
j | 向下移动一行 |
h | 将光标往左移动一个字符 |
l | 将光标往右移动一个字符 |
下面是两个需要注意的重点:
还有其他一些在文件内移动光标的方法。需要格外注意的是必须在指令模式下来操作。下面是其他在文件内移动光标的方法。
指令 | 描述 |
---|---|
0 或 l | 光标回到行首 |
$ | 光标回到行末尾 |
w | 光标移动到下一个字 |
b | 光标移动到前一个字 |
( | 光标移动到当前句子的开头 |
) | 光标移动到下个句子的开头 |
E | 光标移动空白分割单词的末尾 |
{ | 光标往后移动一段 |
} | 光标往前移动一段 |
[[ | 光标往后移动一节 |
]] | 光标往前移动一节 |
n| | 光标移动到当前行的n列 |
1G | 光标移动到文件的第一行 |
G | 光标移动到文件的最后一行 |
nG | 光标移动到文件的第 n 行 |
:n | 光标移动到文件的第 n 行 |
fc | 光标往前移动到 c |
Fc | 光标往后移动到 c |
H | 光标移动到屏幕的首部 |
nH | 光标移动到屏幕从顶部查第 n 行 |
M | 光标移动到屏幕的中间 |
L | 光标移动到屏幕的底部 |
nL | 光标移动到从屏幕底部往上第 n 行 |
:x | 光标移动到行号为 x 的行 |
下面是一些和 Control 键配合使用的指令:
指令 | 描述 |
---|---|
CTRL+d | 向前移动半个屏幕 |
CTRL+f | 向前移动整个屏幕 |
CTRL+u | 向后移动半个屏幕 |
CTRL+b | 向后移动整个屏幕 |
CTRL+e | 屏幕往上移动一行 |
CTRL+y | 屏幕往下移动一行 |
CTRL+u | 屏幕往上移动半个页面 |
CTRL+f | 屏幕往下移动一个页面 |
CTRL+l | 重绘屏幕 |
只有在插入模式下才可以对文本进行编辑。从指令模式切换为插入模式可以有很多种方法:
指令 | 描述 |
---|---|
i | 当前位置前插入文本 |
I | 当前行首插入文本 |
a | 当前位置后插入文本 |
A | 当前行末尾插入文本 |
o | 在光标位置下方新建一行来输入文本 |
a | 在光标位置上方新建一行来输入文本 |
下面是关于用来在打开的文件中删除字符或行的指令列表:
指令 | 描述 |
---|---|
x | 删除光标位置下的字符 |
X | 删除光标位置前的字符 |
dw | 删除光标位置到下一个字间的所有字符 |
d^ | 删除光标位置到行首间的所有字符 |
d$ | 删除光标位置到行末尾间的所有字符 |
D | 删除光标位置到当前行末尾间的所有字符 |
dd | 删除一整行 |
正如前面所述,vi 中的大部分指令都可以在前面加数字来表示希望执行的次数。比如,2x 意味着会删除当前光标位置下的两个字符,2dd 意味着删除两行。
本教程建议在学习后面相关内容前可以多多练习以上内容。
用户可以在不删除文本的情况下对字符、字和行进行更改。下面是相关指令:
指令 | 描述 |
---|---|
cc | 删除当前行,仅留下用户键入的文本 |
cw | 删除光标所在的单词,并进入插入模式 |
r | 替换掉光标下的字符,vi 在替换结束后回到指令模式 |
R | 覆写当前光标处的多个字符,只有使用 Esc 才可以停止覆写 |
s | 将当前字符替换为用户键入的字符,之后,仍处于插入模式 |
S | 删除光标所在行,替换为用户键入的文本,之后,系统仍处于插入模式 |
用户可以从一个地方复制一行或一个字,然后粘贴到其他地方,相关指令如下:
指令 | 描述 |
---|---|
yy | 复制当前行 |
yw | 复制当前字 |
p | 在光标后粘贴 |
P | 在光标前粘贴 |
有一些高级的指令可以简化日常编辑操作:
指令 | 描述 |
---|---|
J | 当前行与下一行想连接,定义一个数字可以连接好多行 |
当前行往左跳转,一个 shift 的宽度 | |
>> | 当前行往右跳转,一个 shift 的宽度 |
~ | 当前光标下,大小写切换 |
U | 将当前行重新回到光标刚到这里的状态 |
u | 撤销该文件的最后一个更改,再次键入u就是重新实现更新 |
:f | 在屏幕上显示当前光标的半分比、文件名级文件总数 |
:f filename | 重命名当前文件到 filename |
:w filename | 写到文件 filename |
:e filename | 打开另一个文件 filename |
:cd dirname | 切换当前目录到目录 dirname |
:e # | 在两个已打开的文件间切换 |
:n | 用户在使用 vi 打开多个文件的情况下,使用该指令一次切换到下一个文件 |
:p | 用户在使用 vi 打开多个文件的情况下,使用该指令一次切换到上一个文件 |
:N | 用户在使用 vi 打开多个文件的情况下,使用该指令一次切换到下一个文件 |
:r file | 读取文件 file,然后在当前行的后面进入插入模式 |
:nr file | 读取文件 file,然后在当前行的后面n行进入插入模式 |
vi 编辑器有两种搜索方式:字符串和字符。对于字符串搜索,需要使用到 /
和 ?
指令。当用户开始键入这些指令的时候,这些指令就会显示在屏幕的底部,这样,用户就可以加入指定的字符串来进行搜索了。
这两个指令仅仅在搜索方向上有所不同:
/
指令是从上往下搜索。?
指令时从下往上搜索。n 和 N 指令用于以同样或相反的方向重复上述搜索指令。在搜索指令中,一些字符串拥有特殊的意义。就需要使用转意符()。
指令 | 描述 |
---|---|
^ | 在行的首部开始搜索 |
. | 匹配单个字符 |
* | 匹配0个或更多个前面的字符 |
$ | 在行末尾开始搜索 |
[ | 启动一个匹配或者不匹配的表达式 |
在表达式中,来找到一个字的开头或结尾 | |
> | 参考上面的 |
用户可以通过如下指令来改变 vi 界面的外观和友好程度:set 指令。下述指定必须在指令模式下键入。
指令 | 描述 |
---|---|
:set ic | 搜索的时候忽略大小写 |
:set ai | 设置自动缩进 |
:set noai | 不设置自动缩进/td> |
:set nu | 在左侧显示行号 |
:set sw | 设置制表符的宽度。比如,:set sw=4 意味着将制表符宽度设置为4 |
:set ws | 如何循环搜索被设置,则如果在文件底部没有搜索到,会重新从文件开头开始搜索。 |
:set wm | 如果这个选项有一个值大于零,编辑器会“自动换行”。 |
:set ro | 更改文件读写类型为只读 |
:set term | 输出终端类型 |
:set bf | 忽略控制字符 |
vi 编辑器可以运行指令集。为此,用户必须在指令模式下输入 :!
指令。
比如,如果用户在保存文件前,希望检测文件是否已存在,那么用户可以键入 :! ls
,然后用户就看以在屏幕上看到 ls 指令的的输出。
按任意键后,会回到 vi 界面。
:s/
指令可以快速替换字或者一组字。下面是语法:
:s/search/replace/g
g 代表全局。该指令的意思就是出现在光标所在行的所有匹配字符都会被替换。
下面是使用 vi 编辑器时的重要提示:
UNIX环境UNIX 中一个重要的概念是环境,它是由环境变量所定义。一些环境变量是由系统设置,有一些是由用户设置的,还有一些是被 ...
Shell数组一个 Shell 变量只能够容纳一个值。这种类型的变量称为标量变量。Shell 数组变量可以同时容纳多个值,它支持不同类型的...
Shell基本操作符每一种 Shell 都支持各种各样的操作符。我们的教程基于默认的 Shell(Bourne),所以在我们的教程中涵盖所有重要的...
前言前面章节已经介绍了Shell编程范例之数值、布尔值、字符串、文件、文件系统、进程等的操作。这些内容基本覆盖了网络中某个独...
upstream 模块简介Nginx 模块一般被分成三大类:handler、filter 和 upstream。前面的章节中,读者已经了解了 handler、filter。...