codecamp

UNIX vi 编辑器使用向导

vi 编辑器使用向导

在 UNIX 操作系统中,文档编辑器有很多种,其中最友好的工具就是 vi. 该文档编辑器可以让用户在文件中基于上下文执行编辑操作。

现在,用户可以使用 vi 文档编辑器的升级版 VIM.这里的 VIM 中的 M 就是源自改善的意思。

vi 通常会被认为是 UNIX 编辑器的实施标准,原因如下:

  • 几乎在所有 UNIX 系列操作系统中都有效。
  • 它的具体实现都非常的类似。
  • 仅仅占用非常少的资源。
  • 与其他编辑器相比,用户界面更加友好。

用户可以使用 vi 编辑器来编辑已经存在的文件,当然也可以使用它创建一个新的文件。此外,用户也可以使用它来浏览一个文本文件。

开始使用 vi 编辑器

用户可以通过下面几种方法来开启 vi 编辑器:

指令 描述
vi filename 如果文件不存在,则创建这个文件,否则打开这个文件
vi -R filename 以只读的方式打开一个已存在的文件
view filename 以只读的方式打开一个已存在的文件

下面是一个创建新文件 testfile 的例子,当然,前提是该文件在当前目录内不存在。

    $vi testfile

然后用户会在屏幕上看到如下显示:

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

此时,应该注意到的是在每一行都的开头都会有一个波浪号(~),这个波浪号代表该行并没有被使用。如果某一行没有以波浪号开头,那么这就意味着有空格存在,也可能是换行符或其他的不易看见的符号。

所以,在我们正式使用 vi 编辑器之前,让我们理解一些微小但是很重要的。

操作模式

使用 vi 编辑器时通常会在下面两个模式之间来回切换:

  • 指令模式:该模式下,用户可以完成一些诸如保存文件、执行指令、移动光标、剪切或粘贴某行(字符)、查找或替代的管理功能。在该模式下,用户键入的所有内容都会被系统当做指令来执行。
  • 插入模式:该模式下,用户可以往文件内,键入文本。在该模式下,用户键入的所有内容都会被当做是文件输入而最后保存在文本中。

vi 编辑器通常会以指令模式打开。如果用户希望键入文本的话,用户必须把当前模式切换为插入模式。切换模式到插入模式时,用户可以简单的按 i 键。离开插入模式,可以按 Esc 键。

值得注意的是,如果用户不清楚当前处于哪种模式,用户可以按两次 Esc 键,编辑器就会回到指令模式。用户可以使用 vi 编辑器打开一个文本,并且键入一些字符,然后切换到指令模式,体验一下这前后的差别。

离开 vi 编辑器

离开 vi 编辑器的指令是 :q 。在指令模式下,一旦键入冒号后跟字母 q,再单击回车。如果文档有修改的话,编辑器会报出提示。如果不想看到这样的提示信息,用户可以使用 :q!。这个指令可以在不保存更改的情况下离开 vi 编辑器。

保存文档的指令时 :w。用户可以将其与上述的离开指令融合在一起使用,比如 :wq,然后单击回车。

保存文件更新且退出的最快捷的方法就是 ZZ 指令。当用户在指令模式下键入 zz 指令后,效果等同于 :wq

用户也可以通过再 :w 后指定特定的文件名来指定不同的文件名来保存。比如,如果用户希望将文件保存为 filename2,用户可以键入:w filename2, 然后点击回车。

在文件内移动光标

为了在文件内不影响文本内容的情况下移动光标,用户必须在指令模式(连续两次按下 Esc 键)下来操作。下面是文件内移动光标的相关指令:

指令 描述
k 向上移动一行
j 向下移动一行
h 将光标往左移动一个字符
l 将光标往右移动一个字符

下面是两个需要注意的重点:

  • vi 编译器是大小写敏感的,所以用户在指令模式下进行操作时要注意大小写。
  • 大部分 vi 编辑器中的指令都可以通过在动作行为前加个数字来表明希望发生的次数。比如,2j 意味着希望光标往下移动两行。

还有其他一些在文件内移动光标的方法。需要格外注意的是必须在指令模式下来操作。下面是其他在文件内移动光标的方法。

指令 描述
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指令

下面是一些和 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 编辑器时的重要提示:

  • 用户必须在指令模式下来键入指令(连续按两次 Esc 键,来保证当前处于指令模式)。
  • 用户要注意指令的大小写。
  • 用户只能在插入模式下来键入文本。
UNIX 通信工具
UNIX 什么是 Shell 脚本
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

UNIX 常用资源汇总

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }