Chapter 13. 编辑

Table of Contents
13.1. 介绍 vi
13.2. 设定 vi
13.3. 在 vi 中使用 tag

13.1. 介绍 vi

这一章 (介绍 vi) 是由 Jason R. Fink 所贡献

vi 编辑器似乎不需要介绍给熟悉 UNIX 的使用者。vi 编辑器最初 是由 Sun Microsystems 公司的 Bill Joy 所开发的,它是具有弹性 弹性,容易使用的轻量级 ASCII 编辑器并且 是杀死新手的毒药。这一章将会向新手介绍 vi 编辑器或许给老手 也提供一些意见。

前半段会介绍编辑,储存,剪下/贴上和搜寻档案的功能。 后半段将会一步一步地示范来帮助你开始使用 vi。

这里主要是介绍 vi 编辑器, 不是你认为的完全指导手册。主要是 帮助 vi 的初次使用者并教导 足够的技能来修改和建立档案。

13.1.1. vi 的界面

vi 编辑器和其它以终端机接口为基础的软件在使用上并没有太大的不同, 除了一项例外,它并不使用 tab type(或是所谓的 curses)形式的接口, 虽然许多种类的 vi 使用了 curses,但是它并不 具有和典型 curses 接口一样的感觉和外观。它具有两种工作模式, 命令编辑。这似乎有些 奇怪,但它和你所认为的窗口接口基础的编辑并没有多大差别。举例来说, 如果你使用 gedit 并且利用鼠标在一些文字上产生反白效果,选择剪下和 贴上,在整个过程中,你只使用了鼠标而没有实际地编辑(当然你也可以 这样做做)。在 vi 中,可以在命令模式使用 dd 来 执行像删除一行的简单动作,将那一行移到你希望置放的地方之下并在 命令模式中按下 p 键。我们几乎可以说是 "鼠标模式 vs. 命令模式"的模拟(虽然它们并不完全一致, 但在观念上是相似的)。

在任何以终端机为基础的软件上,使用这个简单的方法来启动 vi:

vi filename
      

要特别注意的是,当一个档案被编辑时,它是被加载到内存 buffer 中。而其余的文字将会参考在 buffer 中的档案,并置放在适当的 上下文之中。档案只有在当使用者使用写入 命令时,才会改变。

13.1.2. 切换到编辑模式

vi 编辑器提供了许多选项可以在启动以后被使用,在此时我们将只会 介绍预设的启动。依照上述的方法,编辑器预设的启动模式是命令模式, 所以基本上,所以你并不能键入文字并写入 buffer。因此你必须离开 命令模式来键入文字。以下的文字描述了编辑启动的模式:

a     Append after cursor.
A     Append to end of line.
C     Change the rest of current line.
cw    Change the current word.
i     Insert before cursor.
I     Insert before first non blank line.
o     Open a line below for insert
O     Open a line above for insert.
      

13.1.3. 切换模式 & 储存 Buffers 到档案

当然,光是知道编辑命令是不够的,而且你无法回到命令模式并储存 档案,要进行切换,简单地按下 ESC 键。要能 键入想要的命令,必须要使用分号。写入命令便是所有命令集当中的 一个。要执行它,简单地键入 :

在键入分号以后,分号(或是你使用的命令) 提示符号会出现在屏幕的左下角。现在让我们看看储存的命令:

:w    Write the buffer to file.
:wq   Write the buffer to file and quit.
      

13.1.4. 剪下和贴上

不能处理文字区快的编辑器能有多好?当然 vi 支持这项特征并且 和 vi 大部的命令一样具有直观性。要复制一行而 删除它,在命令模式简单地键入 yyY,则该行将会被 复制到 buffer 中。要置放该行在某处,将光标移动到想要置放的 地方之上并按下 p 键来执行"贴上" 命令。要搬移一行,简单地使用 dd 命令删除 该行,移动光标并贴上。

13.1.4.1. 噢,我不是故意的!

还原也是相当简单的,u 还原了最后一步的 动作而 U 则还原了最后一行的删除或是改变。

13.1.5. 在 Buffer 中浏览

大部分的 vi 入门或导览皆始于浏览,不像大部分的编辑器一样, 需要某些功能来浏览(这就是为什么行的搜寻是由下而上)。根据 你所喜爱的 vi(甚至 vi 而不是 elvis, nvi 或 vim),你可以同时使用编辑和命令模式浏览。

对初学者而言,我觉得先切换至命令模式再浏览会比较安全。 不被承认或不被支持成方向键的浏览按键如下:

k     Moves the cursor up one line.
j     Moves the cursor down one line.
l     Moves the cursor right one character.
h     Moves the cursor left one character.
      

如果终端机承认或支持它们,方向键可以在命令模式中被用来 浏览 buffer。

要执行简单的"单点浏览",vi 支持跳跃至某一行,只要简单 地键入行数至冒号提示符号后即可。例如,如果要跳至第 223 行, 在编辑模式中进行这样的动作即可:

ESC
:223
      

13.1.6. 在档案中搜寻

vi 编辑器支持正规的表达语法进行搜寻,和在命令模式中有些许的 不同。在命令模式中,简单地键入 / 键,然后 键入所要搜寻的字符串,举例来说,我要搜寻 foo

/foo
      

也可以插入不同的叙述,例如我要搜寻 foo bar

/foo bar
      

13.1.6.1. 额外的浏览命令

搜寻和卷动画面并非是浏览 buffer 的唯一方法。 底下列出一些有用的浏览命令:

0     Move to beginning of line.
$     Move to end of line.
b     Back up one word.
w     Move forward one word.
G     Move to the bottom of the buffer.
H     Move to the top line on the screen.
L     Move to the last line on the screen.
M     Move the cursor to the middle of the screen.
N     Scan for next search match but opposite direction.
n     Scan for next search match in the same direction.
	

13.1.7. 范例

现在让我们使用介绍过的项目,进行一个范例。首先,我们开启 一个空白档至 buffer 中。使用以下指令:

# vi foo.txt
      

接着,我们切换至编辑模式并输入由一行空白行隔开的两行, 记得我们的 buffer 是空白的,所以必须按下 i 键来插入并输入一些文字:

This is some text

there we skipped a line
~
~
~
~
      

现在按下 ESC 键,切换回命令模式。

现在我们已在命令模式了,让我们储存该档案。首先,按下 : 键,光标应该会位于左下角,并在 提示符号之后。在提示符号 : 中,键入 w 并按下 ENTER 或是 RETURN 键。则档案已经被储存了。应该会展示 一些讯息,一些 vi 编辑器将会告诉你文件名称,行数和档案大小。

现在可以进行浏览了,光标会位于档案被储存时的地方。试着使用 方向键来移动它。如果无法运作,则试着按下 hjkl 键来移动它。

最后,让我们再做两件事,首先,将光标移至第一行的第一个字符。 在该行试试一些在命令模式中,其它的浏览键,按下以下按键数次:

$
0
$
0
      

游标应该会在该行的首尾间跳动。

接着,按下 / 键并搜寻以下的字符串:

/we	
      

光标应该会跳至第一次出现 we 之处。

现在储存并离开该档:

:wq
      

13.2. 设定 vi

NetBSD 所提供的标准编辑器即是 vi, 也是许多人的最爱与最恨。如果你不使用 vi,请跳过这一段,不然请在 安装其它版本的 vi 之前,阅读它。 NetBSD 的 vi (nvi) 是由 UCB 的 Keith Bostic 所撰写的,此编辑器是可免费散布的版本,且有许多强大的延伸,而仍然 非常兼容于最初的 vi。 Nvi 已经变成 BSD 上 vi 的标准版了。

我们最有兴趣的延伸部份为:

13.2.1. 在 .exrc 中设定延伸选项

以下 .exrc 文件的范例中,展示了一些延伸选项 的开启。

set showmode ruler
set filec=^[
set cedit=^[
      

第一行开启了在状态列上展示光标位置(列与行)和目前模式 (命令,插入,附加)。的功能。 第二行(^[ 表 ESC 字符)以 ESC 字符开启了文件名称补强的功能。 第三行开启了命令列历史编辑的功能(也是利用 ESC 字符)。 例如:写入 ':' 然后按下 ESC 会开启一个窗口,里面列有先前执行过 的命令,可以编辑和执行(在一个命令上按下 Enter 可以执行它。)

13.2.2. 文件

原始码的压缩档 (src.tgz) 包含了许多关于 (n)vi 和 ex 的有用文件,位于 /usr/src/usr.bin/vi/docs 目录中。 例如:

  • Edit: A tutorial

  • Ex Reference Manual

  • Vi man page

  • An Introduction to Display Editing with Vi by William Joy and Mark Horton

  • Ex/Vi Reference Manual by Keith Bostic

  • Vi Command & Function Reference

  • Vi tutorial (beginnner and advanced)

如果你从未使用过 vi,"Vi tutorial" 是一个好的起始点。 参考它是有帮助的且它向读者介绍了所有的 vi 命令,可以在一边阅读 时,一边做测试。 由 William Joy 和 Mark Horton 撰写的 An Introduction to Display Editing with Vi 也是一个非常好的开始。

如果你要学习关于 vi 更多的知识和 nvi 的延伸,你可以读 由 Keith Bostic 所撰写的 Ex/Vi Reference Manual, 其中包含了编辑器的所有命令和选项。

13.3. 在 vi 中使用 tag

这标题并不直接关于 NetBSD,但它是有用的,例如,检查核心的原始码。

当你要在目录树中检查一群原始码集合时,可以使用 vi 的特征 tag 来简化你的工作。 方法如下:

  1. cd 至原始码的根目录。

    $ cd /path
    	
  2. 键入以下指令:

    $ find . -name "*.[ch]" > filelist
    $ ctags -L filelist
        
  3. .exrc 中加入此行

    set tags=/path/tags
        

    (将 "path" 置换成正确的目录。)