第 10 章 使用编辑器

本章内容

  • vim编辑器
  • nano编辑器
  • emacs编辑器
  • KWrite编辑器
  • Kate编辑器
  • GNOME编辑器

在开启shell脚本编程生涯之前,你必须知道Linux中至少一款文本编辑器的用法。对文本编辑器的功能(如查找、剪切和粘贴)了解越多,编写shell脚本的速度就越快。本章将讨论在Linux中能见到的主要文本编辑器。
可供选择的编辑器不止一种。很多人都找到了拥有他们所喜爱特性的编辑器,并成为了这款编辑器的死忠粉丝。本章仅对Linux世界中部分编辑器展开了讨论。

10.1 vim 编辑器

10
vi编辑器是Unix系统最初的编辑器。它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行、在文件中移动、插入、编辑和替换文本。
尽管它可能是世界上最复杂的编辑器(至少讨厌它的人是这么认为的),但其拥有的大量特性使其成为Unix管理员多年来的支柱性工具。
在GNU项目将vi编辑器移植到开源世界时,他们决定对其作一些改进。由于它不再是以前
Unix中的那个原始的vi编辑器了,开发人员也就将它重命名为vi improved,或vim。本节将会带你逐步了解使用vim编辑器编辑文本shell脚本文件的基础知识。

10.1.1 检查 vim 软件包

在开始研究vim编辑器之前,最好先搞明白你所用的Linux系统是哪种vim软件包。在有些发行版中安装的是完整的vim,另外还有一个vi命令的别名,就像下面所显示的CentOS发行版中的那样。

  1. $ alias vi
  2. alias vi='vim'
  3. $
  4. $ which vim
  5. /usr/bin/vim
  6. $
  7. $ ls -l /usr/bin/vim
  8. -rwxr-xr-x. 1 root root 1967072 Apr 5 2012 /usr/bin/vim
  9. $

注意,上面的程序文件长列表中并没有显示出任何的链接文件(有关链接文件的详细内容请参见第3章)。如果vim程序被设置了链接,它可能会被链接到一个功能较弱的编辑器。所以最好还是检查一下链接文件。
在其他发行版中,你会发现各种各式各样的vim编辑器。要注意的是,在Ubuntu发行版中不仅没有vi命令的别名,而且/usr/bin/vi程序属于一系列文件链接中的一环。

$ alias vi
-bash: alias: vi: not found
$
$ which vi
/usr/bin/vi
$
$ ls -l /usr/bin/vi
lrwxrwxrwx  1  root  root  20  Apr  22  12:39
/usr/bin/vi  ->  /etc/alternatives/vi
$
$ ls -l /etc/alternatives/vi
lrwxrwxrwx  1  root  root  17  Apr  22  12:33
/etc/alternatives/vi  ->  /usr/bin/vim.tiny
$
$ ls -l /usr/bin/vim.tiny
-rwxr-xr-x 1 root root 884360 Jan   2 14:40
/usr/bin/vim.tiny
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.tiny

因此,当输入vi命令时,执行的是程序/usr/bin/vim.tiny。vim.tiny只提供少量的vim 编辑器功能。如果特别需要vim编辑器,而且使用的又是Ubuntu,那至少应该安装一个基础版本的vim包。

说明 在上面的例子中,其实用不着非得连续使用ls –l命令来查找一系列链接文件的最终目标,只需要使用readlink –f命令就可以了。它能够立刻找出链接文件的最后一环。

第9章已经详细讲解了软件安装。在Ubuntu发行版中安装基础版的vim包非常简单。

$ sudo apt-get install vim
[...]
The following extra packages will be installed:

vim-runtime Suggested packages:
ctags vim-doc vim-scripts
The following NEW packages will be installed: vim vim-runtime
[...]
$
$ readlink -f /usr/bin/vi
/usr/bin/vim.basic
$

基础版的vim现在安装好了,/usr/bin/vi的文件链接会自动更改成指向/usr/bin/ vim.basic。以后再输入vi命令的时候,使用的就是基础版的vim编辑器了。

10.1.2 vim 基础

vim编辑器在内存缓冲区中处理数据。只要键入vim命令(或vi,如果这个别名或链接文件存在的话)和要编辑的文件的名字就可以启动vim编辑器:

$ vim  myprog.c

如在启动vim时未指定文件名,或者这个文件不存在,vim会开辟一段新的缓冲区域来编辑。如果你在命令行下指定了一个已有文件的名字,vim会将文件的整个内容都读到一块缓冲区域来准备编辑,如图10-1所示。
10
第 10 章 使用编辑器 - 图1
图10-1 vim的主窗口
vim编辑器会检测会话终端的类型(参见第2章),并用全屏模式将整个控制台窗口作为编辑器区域。
最初的vim编辑窗口显示了文件的内容(如果有内容的话),并在窗口的底部显示了一条消息行。如果文件内容并未占据整个屏幕,vim会在非文件内容行放置一个波浪线(如图10-1所示)。

底部的消息行根据文件的状态以及vim安装时的默认设置显示了所编辑文件的信息。如果文件是新建的,会出现消息[New File]。
vim编辑器有两种操作模式:

  • 普通模式
  • 插入模式

当你刚打开要编辑的文件时(或新建一个文件时),vim编辑器会进入普通模式。在普通模式中,vim编辑器会将按键解释成命令(本章后面会讨论更多)。
在插入模式下,vim会将你在当前光标位置输入的每个键都插入到缓冲区。按下i键就可以进入插入模式。要退出插入模式回到普通模式,按下键盘上的退出键(ESC键,也就是Escape键) 就可以了。
在普通模式中,可以用方向键在文本区域移动光标(只要vim能正确识别你的终端类型)。如果你恰巧在一个古怪的没有定义方向键的终端连接上,也不是完全没有希望。vim中有用来移动光标的命令。

  • h:左移一个字符。
  • j:下移一行(文本中的下一行)。
  • k:上移一行(文本中的上一行)。
  • l:右移一个字符。

在大的文本文件中一行一行地来回移动会特别麻烦,幸而vim提供了一些能够提高移动速度的命令。

  • PageDown(或Ctrl+F):下翻一屏。
  • PageUp(或Ctrl+B):上翻一屏。
  • G:移到缓冲区的最后一行。
  • num G:移动到缓冲区中的第num行。
  • gg:移到缓冲区的第一行。

vim编辑器在普通模式下有个特别的功能叫命令行模式。命令行模式提供了一个交互式命令行,可以输入额外的命令来控制vim的行为。要进入命令行模式,在普通模式下按下冒号键。光标会移动到消息行,然后出现冒号,等待输入命令。
在命令行模式下有几个命令可以将缓冲区的数据保存到文件中并退出vim。

  • :q 如果未修改缓冲区数据,退出。
  • :q! 取消所有对缓冲区数据的修改并退出。
  • :w filename 将文件保存到另一个文件中。
  • :wq 将缓冲区数据保存到文件中并退出。

了解了这些基本的vim命令后,你可能就理解为什么有人会痛恨vim编辑器了。要想发挥出vim 的全部威力,你必须知道大量晦涩的命令。不过只要了解了一些基本的vim命令,无论是什么环境,你都能快速在命令行下直接修改文件。一旦适应了敲入命令,在命令行下将数据和编辑命令一起输入就跟第二天性一样自然,再回过头使用鼠标反倒觉得奇怪了。

10.1.3 编辑数据

在插入模式下,你可以向缓冲区插入数据。然而有时将数据输入到缓冲区中后,你需要再对其进行添加或删除。在普通模式下,vim编辑器提供了一些命令来编辑缓冲区中的数据。表10-1 列出了一些常用的vim编辑命令。
表10-1 vim编辑命令

命 令 描 述
x 删除当前光标所在位置的字符
dd 删除当前光标所在行
dw 删除当前光标所在位置的单词
d$ 删除当前光标所在位置至行尾的内容
J 删除当前光标所在行行尾的换行符(拼接行)
u 撤销前一编辑命令
a 在当前光标后追加数据
A 在当前光标所在行行尾追加数据
r char 用char替换当前光标所在位置的单个字符
R text 用text覆盖当前光标所在位置的数据,直到按下ESC键

有些编辑命令允许使用数字修饰符来指定重复该命令多少次。比如,命令2x会删除从光标当前位置开始的两个字符,命令5dd会删除从光标当前所在行开始的5行。

说明 在vim编辑器的普通模式下使用退格键(Backspace键)和删除键(Delete键)时要留心。vim编辑器通常会将删除键识别成x命令的功能,删除当前光标所在位置的字符。vim编辑器在普通模式下通常不识别退格键。

10.1.4 复制和粘贴

10
现代编辑器的标准功能之一是剪切或复制数据,然后粘贴在文本的其他地方。vim编辑器也可以这么做。
剪切和粘贴相对容易一些。你已经看到表10-1中用来从缓冲区中删除数据的命令。但vim在删除数据时,实际上会将数据保存在单独的一个寄存器中。可以用p命令取回数据。
举例来说,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该行文本的位置,然后用p命令。该命令会将文本插入到当前光标所在行之后。可以将它和任何删除文本的命令一起搭配使用。
复制文本则要稍微复杂点。vim中复制命令是y(代表yank)。可以在y后面使用和d命令相同的第二字符(yw表示复制一个单词,y$表示复制到行尾)。在复制文本后,把光标移动到你想放置文本的地方,输入p命令。复制的文本就会出现在该位置。
复制的复杂之处在于,由于不会影响到你复制的文本,你没法知道到底发生了什么。你无法确定到底复制了什么东西,直到将它粘贴到其他地方才能明白。但vim还有另外一个功能来解决这个问题。
可视模式会在你移动光标时高亮显示文本。可以用可视模式选取要复制的文本。要进入可视模式,应移动光标到要开始复制的位置,并按下v键。你会注意到光标所在位置的文本已经被高亮显示了。下一步,移动光标来覆盖你想要复制的文本(甚至可以向下移动几行来复制更多行的文本)。在移动光标时,vim会高亮显示复制区域的文本。在覆盖了要复制的文本后,按y键来激活复制命令。现在寄存器中已经有了要复制的文本,移动光标到你要放置的位置,使用p命令来粘贴。

10.1.5 查找和替换

可以使用vim查找命令来轻松查找缓冲区中的数据。要输入一个查找字符串,就按下斜线(/) 键。光标会跑到消息行,然后vim会显示出斜线。在输入你要查找的文本后,按下回车键。vim 编辑器会采用以下三种回应中的一种。

  • 如果要查找的文本出现在光标当前位置之后,则光标会跳到该文本出现的第一个位置。
  • 如果要查找的文本未在光标当前位置之后出现,则光标会绕过文件末尾,出现在该文本所在的第一个位置(并用一条消息指明)。
  • 输出一条错误消息,说明在文件中没有找到要查找的文本。

要继续查找同一个单词,按下斜线键,然后按回车键。或者使用n键,表示下一个(next)。替换命令允许你快速用另一个单词来替换文本中的某个单词。必须进入命令行模式才能使用
替换命令。替换命令的格式是:
:s/old/new/
vim编辑器会跳到old第一次出现的地方,并用new来替换。可以对替换命令作一些修改来替换多处文本。

  • :s/old/new/g 一行命令替换所有old。
  • :n,ms/old/new/g 替换行号n和m之间所有old。
  • :%s/old/new/g 替换整个文件中的所有old。
  • :%s/old/new/gc 替换整个文件中的所有old,但在每次出现时提示。

如你所见,对一个命令行文本编辑器而言,vim包含了不少高级功能。由于每个Linux发行版都会包含它,所以应该至少了解一下vim编辑器的一些基本用法。这样一来,不管所处的环境如何,你总能编辑脚本。

10.2 nano 编辑器

vim是一款复杂的编辑器,功能强大,而nano就简单多了。作为一款简单易用的控制台模式文本编辑器,nano很适合对此类编辑器有需求的用户。对Linux命令行新手来说,它用起来也很不错。
nano文本编辑器是Unix系统的Pico编辑器的克隆版。尽管Pico也是一款简单轻便的文本编辑器,但是它并没有采用GPL许可协议。nano文本编辑器不仅采用了GPL许可协议,而且还加入了GNU项目。
大多数Linux发行版默认都安装了nano文本编辑器。和这款编辑器有关的一切都很简单。要在命令行下使用nano打开文件,可以这样:

$ nano myprog.c

如果启动nano的时候没有指定文件名,或者指定的文件不存在,nano会开辟一段新的缓冲区进行编辑。如果你在命令行中指定了一个已有的文件,nano会将该文件的全部内容读入缓冲区, 以备编辑,如图10-2所示。
第 10 章 使用编辑器 - 图2

图10-2 nano的主窗口
10
注意,在nano编辑器窗口的底部显示了各种命令以及简要的描述。这些命令是nano的控制命令。脱字符(^)表示Ctrl键。因此,^X表示的就是组合键Ctrl+X。

窍门 尽管nano控制命令在列出组合键的时候使用的是大写字母,但是在使用的时候,大小写字母都没有问题。

把所有的基本命令都放在眼前实在是太棒了。再也不用去记哪些控制命令能干哪些事情了。表10-2列出了多种nano的控制命令。
表10-2 nano控制命令

命 令 描 述
CTRL+C 显示光标在文本编辑缓冲区中的位置
CTRL+G 显示nano的主帮助窗口
CTRL+J 调整当前文本段落
CTRL+K 剪切文本行,并将其保存在剪切缓冲区
CTRL+O 将当前文本编辑缓冲区的内容写入文件
CTRL+R 将文件读入当前文本编辑缓冲区
CTRL+T 启动可用的拼写检查器
CTRL+U 将剪切缓冲区中的内容放入当前行
CTRL+V 翻动到文本编辑缓冲区中的下一页内容
CTRL+W 在文本编辑缓冲区中搜索单词或短语
CTRL+X 关闭当前文本编辑缓冲区,退出nano,返回shell
CTRL+Y 翻动到文本编辑缓冲区中的上一页内容

表10-2中列出的控制命令都是你必不可少的。如果除此之外还需要更强大的控制功能,nano 也能满足你。在nano文本编辑器中输入Ctrl+G会显示出主帮助窗口,其中包含了更多的控制命令。

说明 如果你输入Ctrl+T命令使用nano的拼写检查器的时候得到了错误消息Spell checking failed: Error invoking ‘Spell’,下面是一些解决方法。利用第9章中学到的知识, 在你使用的Linux发行版中安装拼写检查器软件包aspell。

如果aspell没能解决问题,以超级用户的身份编辑/etc/nanorc文件(使用你喜欢的文本编辑器)。找到文件的最后一行# set speller “aspell -x -c”,删除行首的字符#。保存并退出。

另外一些强大的功能可以通过命令行获得。可以使用命令行选项来控制nano编辑器的特性, 例如编辑之前创建备份文件。输入man nano来了解nano的这些命令行启动选项。
作为控制台模式文本编辑器,vim和nano为你在强大和简洁之间提供了一种选择。不过两者都无法提供图形化编辑功能。有一些文本编辑器可以存在于两种模式中(控制台模式和图形化模式),下节将一探究竟。

10.3 emacs 编辑器

emacs编辑器是一款极其流行的编辑器,甚至比Unix出现的都早。开发人员对它爱不释手, 于是就将其移植到了Unix环境中,现在也移植到了Linux环境中。跟vi很像,emacs编辑器一开始也是作为控制台编辑器,但如今已经迁移到了图形化世界。
emacs编辑器仍然提供最早的命令行模式编辑器,但现在也能使用图形化窗口在图形化环境中编辑文本。在从命令行启动emacs编辑器时,编辑器会判断是否有可用的图形化会话,以便启动图形模式。如果没有,它会以控制台模式启动。
本节将介绍控制台模式和图形模式的emacs编辑器,这样你就知道如何使用任意一种了。

10.3.1 检查 emacs 软件包

很多发行版默认并没有安装emacs。你可以像下面这样使用which和/或yum list命令检查一下自己所用的基于Red Hat的发行版。

$ which  emacs
/usr/bin/which:  no  emacs  in  (/usr/lib64/qt-3.3
/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:
/usr/sbin:/sbin:/home/Christine/bin)
$
$ yum list emacs
[...]
Available Packages
emacs.x86_64    1:23.1-25.el6    base

emacs编辑器软件包目前并没有安装在CentOS发行版中。不过,还是可以把它安装上的(关于如何显示已安装软件的更多讨论,请参见第9章)。
对于基于Debian的发行版,可以使用which和/或apt-cache show命令来检查emacs编辑器软件包的安装情况,在Ubuntu发行版中的演示如下。

$ which  emacs
$
$ sudo  apt-cache  show  emacs
Package: emacs Priority: optional Section: editors Installed-Size: 25 [...]
10
Description-en: GNU Emacs editor (metapackage)
GNU Emacs is the extensible self-documenting  text  editor. This is a metapackage that will always depend on the latest recommended Emacs release.
Description-md5: 21fb7da111336097a2378959f6d6e6a8 Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu
Supported: 5y
$

which命令的执行方式在这里有点不一样。当它没有找到已安装的命令时,直接返回的就是bash shell提示符。在演示所用的Ubuntu发行版中,emacs编辑器软件包是选装的,但也可以进行安装。下面显示了在Ubuntu上安装emacs编辑器。

$ sudo apt-get install emacs

Reading package lists... Done Building dependency tree
Reading state information... Done
The following extra packages will be installed:
[...]
Install emacsen-common for emacs24
emacsen-common: Handling install of emacsen flavor emacs24 Wrote /etc/emacs24/site-start.d/00debian-vars.elc
Wrote /usr/share/emacs24/site-lisp/debian-startup.elc Setting up emacs (45.0ubuntu1) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
$
$ which  emacs
/usr/bin/emacs
$

现在再使用which命令的话,它就会显示出emacs程序的位置。这说明该Ubuntu发行版已经可以使用emacs编辑器了。
就CentOS发行版而言,可以使用yum安装命令来安装emacs编辑器。

$ sudo  yum  install emacs
[sudo] password for Christine:
[...]
Setting up Install Process Resolving Dependencies [...]
Installed:
emacs.x86_64 1:23.1-25.el6

Dependency Installed:
emacs-common.x86_64 1:23.1-25.el6 libotf.x86_64 0:0.9.9-3.1.el6
m17n-db-datafiles.noarch 0:1.5.5-1.1.el6

Complete!
$
$ which  emacs
/usr/bin/emacs
$
$ yum list emacs
[...]
Installed Packages
emacs.x86_64    1:23.1-25.el6    @base
$

将emacs编辑器成功安装到你的Linux发行版之后,就可以开始学习它的各种功能了。我们先从控制台中的使用开始吧。

10.3.2 在控制台中使用 emacs

控制台模式版本的emacs要使用大量按键命令来执行编辑功能。emacs编辑器使用包括控制键

(PC键盘上的Ctrl键)和Meta键的按键组合。在大多数终端仿真器中,Meta键被映射到了Alt键。emacs官方文档将Ctrl键缩写为C-,而Meta键缩写为M-。所以,如果你要输入Ctrl+x组合键,文档会显示成C-x。为了避免冲突,本章将会沿用这种写法。

  1. emacs基础

要在命令行用emacs编辑文件,输入:

$ emacs myprog.c

随emacs控制台模式窗口一起出现的是一段简短的介绍以及帮助界面。不要紧张,只要按下任意键,emacs会将文件加载到工作缓冲区并显示文本,如图10-3所示。
第 10 章 使用编辑器 - 图3
图10-3 用控制台模式的emacs编辑器编辑文件
你会注意到,在控制台模式窗口的顶部出现的是一个典型的菜单栏。遗憾的是,这个菜单栏无法在控制台模式中使用,只能用于图形模式。
10

说明 如果你在图形化桌面环境下使用emacs,本节中介绍的一些命令的效果会和描述的不太一样。要想在图形化桌面环境中使用控制台模式的emacs,可以使用emacs –nw命令。如果你想使用emacs的图形化特性,请阅读10.3.3节。

和vim编辑器的不同之处在于:使用vim时,你必须不停地从插入模式中进出,从而在输入命令和插入文本之间切换;而emacs编辑器只有一个模式。如果你输入可打印字符,emacs就将它插入到光标当前位置;如果你输入一个命令,emacs就执行命令。
如果emacs正确地检测到了你的终端仿真器,可以使用方向键和PageUp以及PageDown键在缓冲区域移动光标。如果未能正确检测,有一些命令可用来移动光标。

  • C-p:上移一行(文本中的前一行)。
  • C-b:左移一字符。
  • C-f:右移一字符。
  • C-n:下移一行(文本中的下一行)。

还有一些命令能够让光标在文本中进行较长距离的跳跃。

  • M-f:右移到下个单词。
  • M-b:左移到上个单词。
  • C-a:移至行首。
  • C-e:移至行尾。
  • M-a:移至当前句首。
  • M-e:移至当前句尾。
  • M-v:上翻一屏。
  • C-v:下翻一屏。
  • M-<:移至文本的首行。
  • M->:移至文本的尾行。

还有几个命令可以将编辑器缓冲区保存至文件并退出emacs。

  • C-x C-s:保存当前缓冲区到文件。
  • C-z:退出emacs并保持在这个会话中继续运行,以便你切回。
  • C-x C-c:退出emacs并停止该程序。

你会注意到这些功能中有两个需要两次键命令。C-x命令叫作扩展命令(extend command)。这为我们提供了另外一组命令。

  1. 编辑数据

emacs编辑器在插入和删除缓冲区中的文本时非常强大。要插入文本,只需将光标移动到想插入文本的位置就可以开始输入了。要想删除文本,emacs使用退格键删除光标当前所在位置之前的字符,使用删除键来删除光标当前位置之后的字符。
emacs编辑器还有剪切①文本的命令。删除文本和剪切文本的差别在于:当你剪切文本时,emacs会将其放在一个临时区域,你可以取回(参见接下来的一小节);而删除的文本则会永远消失。有几个命令可用来剪切缓冲区中的文本。

  • M-Backspace:剪切光标当前所在位置之前的单词。
  • M-d:剪切光标当前所在位置之后的单词。
  • C-k:剪切光标当前所在位置至行尾的文本。
  • M-k:剪切光标当前所在位置至句尾的文本。

emacs编辑器还包括了一种独特的块剪切(mass-killing)的方法。移动光标到待剪切区域的起始位置并按下C-@或C-Spacebar键,然后移动光标到待剪切区域的结束位置并按下C-w命令 键。这两个位置之间的文本都将被剪切。
——————————
① 英文为kill,emacs专有的说法。

如果你在剪切文本时不巧弄错了,使用C-/命令就能撤销剪切命令,返回到剪切前的状态。

  1. 复制和粘贴

你已经看到了如何从emacs缓冲区域剪切数据,现在该看看如何将它粘贴到其他地方了。遗憾的是,如果你用过vim编辑器,那么emacs编辑器的用法可能会让你犯晕。
不巧的是,粘贴数据在emacs中也叫yanking。而在vim编辑器中, yanking指的是复制。如果你恰好要用两种编辑器,这可就难记了。
当你用剪切命令剪切了某个数据后,将光标移动到你要粘贴数据的位置,用C-y来粘贴。这会将文本从临时区域取出并将其粘贴在光标所在的位置。C-y命令会取出最后一个剪切命令存下的文本。如果你执行了多个剪切命令,可以用M-y命令来循环选择它们。
要复制文本,只需将它粘贴到剪切它的地方然后移动到新的位置并再使用一次C-y命令即 可。如果需要,你可以粘贴文本任意多次。

  1. 查找和替换

在emacs编辑器中查找文本可用C-s和C-r命令。C-s命令是在会从缓冲区域中从光标当前位置到缓冲区尾部执行前向查找,而C-r命令会是从在缓冲区域中从光标从当前所在位置到缓冲区头部执行后向查找。
当输入C-s和C-r两者中的任意一个时,底行会出现一个提示,询问要查找的文本。emacs 可以执行两种类型的查找。
在渐进式(incremental)查找中,emacs编辑器在你键入单词时以实时方式执行文本查找。当键入第一个字母时,它会高亮显示缓冲区中所有该字母出现的地方。当键入第二个字母时,它会高亮显示文本中所有出现这两个字母组合的地方。如此往复,直到输入完要查找的文本。
在非渐进式(non-incremental)查找中,在C-s或C-r命令后按下回车键。这会将查询锁定在底行区域,允许你在查找前输入完整的待查找文本。
要用新字符串来替换一个已有文本字符串,就必须用M-x命令。这个命令需要一个文本命令和参数。
10
该文本命令是replace-string。输入该命令并按下回车键,emacs会询问要替换的已有字 符串。输入之后,再按一次回车键,emacs会询问用来替换的新字符串。

  1. 在emacs中使用缓冲区

emacs编辑器可以使用多个缓冲区同时编辑多个文件。你可以把文件加载到一个缓冲区中, 编辑时在多个缓冲区中切换。
当你处于emacs中时,可以使用C-x C-f组合键将新的文件加载到缓冲区。这是emacs的查找文件模式。它会把你带到窗口的底行,允许你输入要开始编辑的文件名。如果不知道文件的名称或位置,可以按下回车键。它会在编辑窗口启动一个文件浏览器,如图10-4所示。
你可以在这里浏览到要编辑的文件。要进入上一级目录,移动到双点条目并按下回车键。要进入下一级目录,移动到该目录条目并按下回车键。如果找到了要编辑的文件,按下回车键,emacs会自动将它加载到新的缓冲区域。

第 10 章 使用编辑器 - 图4

图10-4 emacs查找文件模式浏览器
你可以按下C-x C-b扩展命令组合来列出工作缓冲区。emacs编辑器会拆分编辑器窗口,在底部窗口显示一个缓冲区列表。除了主要的编辑缓冲区,emacs还提供了另外两个缓冲区:

  • 草稿区域,称为scatch
  • 消息区域,称为Messages

草稿区域允许输入LISP编程命令以及个人笔记。消息区域则显示在操作期间由emacs生成的消息。如果在使用emacs时出现了任何错误,它们会显示在消息区域中。
有两种方式可在窗口中切换到不同的缓冲区域。

  • C-x o:切换到缓冲区列表窗口。用方向键移动到你想要的缓冲区域并按下回车键。
  • C-x b:输入你要切换到的缓冲区域的名字。

当选择切换到缓冲区列表窗口的选项时,emacs会在新的窗口区域打开缓冲区。emacs编辑器允许在单个会话中打开多个窗口。接下来的一节将讨论如何在emacs中管理多个窗口。

  1. 在控制台模式的emacs中使用窗口

控制台模式的emacs编辑器要比图形化窗口早出现了好多年。即便在当时,emacs也是出类拔萃的,因为它可以支持在主窗口中打开多个编辑窗口。
可以用下面两个命令将emacs编辑窗口拆分成多个窗口。

  • C-x 2:将窗口水平拆分成两个窗口。
  • C-x 3:将窗口竖向拆分成两个窗口。

要从一个窗口移动到另一个,可用C-x o命令。注意,在创建一个新窗口时,emacs会在新窗口中使用原始窗口的缓冲区域。一旦移动到了新窗口,你可以在新窗口中用C-x C-f命令来加载一个新文件,或者用其中一个命令切换到一个不同的缓冲区域。
要关闭窗口,移动到该窗口并用C-x 0(数字0)命令;如果你想关掉除了你所在窗口之外的所有窗口,用C-x 1(数字1)命令。

10.3.3 在 GUI 环境中使用 emacs

如果在GUI环境中使用emacs(比如Unity或GNOME桌面),它会以图形模式启动,如图10-5所示。
第 10 章 使用编辑器 - 图5

图10-5 emacs图形化窗口
如果你已经在控制台模式下用过emacs,应该非常熟悉图形模式。所有的键命令都以菜单项的形式存在。emacs菜单栏包括下列菜单项。
10

  • File:允许你在窗口中打开文件、创建新窗口、关闭窗口、保存缓冲区和打印缓冲区。
  • Edit:允许你将选择的文本剪切并复制到剪贴板,将剪贴板的内容粘贴到光标当前所在位置,以及查找文本和替换文本。
  • Options:提供许多emacs功能设定,如高亮显示、自动换行、光标类型和字体设置。
  • Buffers:列出当前可用的缓冲区,可以让你在缓冲区域间轻松切换。
  • Tools:提供对emacs高级功能的访问,比如命令行界面访问、拼写检查、文件内容比较(称为diff)、发送电子邮件消息、日历以及计算器。
  • Help:提供emacs的在线手册,以获取特定emacs功能的帮助。

除了普通的emacs图形化菜单项外,针对编辑器缓冲区中特定的文件类型,通常还会有一个独立的菜单项。图10-5中打开一个C程序,所以emacs提供了一个C菜单项,允许用户进行相关的高级设置,例如C语法高亮、编译、运行以及命令行代码调试。
图形化的emacs窗口是古老的控制台程序向图形化世界迁移的一个例子。现在许多Linux发行版都提供了图形化桌面(甚至在不需要它们的服务器上),图形化编辑器也越来越司空见惯。流行的Linux桌面环境(如KDE和GNOME)都提供了针对各自环境的图形化文本编辑器,本章接下来将介绍。

10.4 KDE 系编辑器

如果你所用的Linux发行版中采用的是KDE桌面(参见第1章),那么有几种文本编辑器可供选择。KDE项目官方支持两种流行的文本编辑器。

  • KWrite:单屏幕文本编辑程序。
  • Kate:功能全面的多窗口文本编辑程序。

这两个编辑器都是图形化文本编辑器,含有许多高级功能。Kate编辑器提供了更高级的功能, 以及标准文本编辑器中不常见的细致之处。本节将分别介绍这两种编辑器,并演示一些可用来帮你编写shell脚本的功能。

10.4.1 KWrite 编辑器

KDE环境的基本编辑器是KWrite。它提供了简单的文字处理类型的文本编辑功能,还支持代码语法高亮显示和编辑。默认的KWrite编辑窗口如图10-6所示。
第 10 章 使用编辑器 - 图6
图10-6 编辑shell脚本程序时的默认KWrite窗口
尽管可能没法在图10-6中看出来,但KWrite编辑器确实可以识别好几种类型的编程语言,并采用代码着色来标识常量、函数和注释。另外要注意,在for循环处有个图标连接起了开始和结束的花括号。这叫作折叠标记(folding marker)。点击这个图标就可以将函数折叠成一行。这是处理大型应用时非常好的一个功能。
KWrite编辑窗口用鼠标和方向键提供了完整的剪切和粘贴功能。跟在文字处理器中一样,你可以高亮显示并剪切文本区域中任意位置的文本,并将其粘贴到其他地方。
要用KWrite编辑文件,你可以从桌面上的KDE菜单系统中选择KWrite(一些Linux发行版甚至为其创建了一个面板按钮)或从命令行下启动:

$  kwrite  factorial.sh

kwrite命令有以下几个命令行参数可用来定制它如何启动。

  • —stdin:让KWrite从标准输入设备中而非文件中读取数据。
  • —encoding:为文件指字符编码类型。
  • —line:指定编辑器窗口中开始的文件行号。
  • —column:指定编辑器窗口中开始的文件列号。

KWrite编辑器在编辑器窗口的顶部提供了菜单栏和工具栏,允许你选择KWrite编辑器的功能以及修改其配置设置。
菜单栏含有下面的条目。

  • File:加载、保存、打印以及导出文件中的文本。
  • Edit:操作缓冲区中的文本。
  • View:管理如何在编辑器窗口中显示文本。
  • Bookmarks:处理返回文本中特定位置的指针(这个选项可能要在配置中启用)。
  • Tools:包含操作文本的特定功能。
  • Settings:配置编辑器处理文本的方式。
  • Help:获取编辑器和命令的有关信息。

Edit菜单提供了你需要的所有文本编辑命令。你不需要记住像密码一般的键命令(顺便提一下,KWrite也支持),只要在Edit菜单项中选取条目即可,如表10-3所示。
表10-3 KWrite Edit菜单条目

条 目 描 述
Undo 取消最后一个动作或操作
Redo 取消最后一个撤销动作
Cut 删除选择的文本并将其放入剪贴板
Copy 将选择的文本复制到剪贴板
Paste 在光标当前所在位置插入剪贴板的当前内容
Select All 选择编辑器中的所有文本
Deselect 取消选择当前选定的文本
Overwrite Mode 从插入模式切换到改写模式;在改写模式中,文本会被新输入的文本覆盖,而不是仅 插入新文本
Find 产生一个查找文本对话框,允许你定制文本查找
Find Next 在缓冲区中向前重复上一个查找操作
Find Previous 在缓冲区中向后重复上一个查找操作
Replace 产生一个替换文本对话框,允许你定制文本查找和替换
Find Selected 查找选定文本下一次出现的地方
Find Selected Backwards 查找选定文本上一次出现的地方
Go to Line 产生一个Go to(跳到)对话框,允许你输入一个行号。光标会移到指定行

10

Find功能有两种模式:普通模式执行简单的文本搜索和加强搜索。替换模式可以进行必要的高级查找和替换。可以用Find区域的绿色箭头切换这两种模式,如图10-7所示。
第 10 章 使用编辑器 - 图7
图10-7 KWrite Find部分
Find的加强模式不仅可以搜索单词,还可以使用正则表达式进行查找(参见第20章)。还有其他一些选项也可用于定制查找,比如是否在查找时忽略大小写,是全词匹配还是部分文本匹配。
Tools菜单提供了一些处理缓冲区文本时很有用的功能。表10-4列出了KWrite中可用的工具。
表10-4 KWrite工具

工 具 描 述
Read Only Mode 锁定文本,这样在编辑器中就无法作任何修改
Encoding 设定文本采用的字符集编码
Spelling 从文本的开始进行拼写检查
Spelling (from cursor) 从光标当前所在位置开始进行拼写检查
Spellcheck Selection 仅在选定的文本区域中进行拼写检查
Indent 增加一级段落缩进
Unindent 减少一级段落缩进
Clean Identation 将所有段落缩进重置
Align 强制当前行或选定行回到默认的缩进设置
Uppercase 将选定的文本或光标当前所在位置的字符设为大写
Lowercase 将选定的文本或光标当前所在位置的字符设为小写
Capitalize 大写选定文本的首字母或当前光标所在位置的单词的首字母
Join Lines 合并选定的行,或合并光标当前所在行及下一行
Word Wrap Document 启用文本自动换行。若文本行长度超过了编辑器窗口边界,该行在下一行继续

这么一个简单的文本编辑器拥有的工具可不少!
Settings菜单包括了配置编辑器对话框,如图10-8所示。
第 10 章 使用编辑器 - 图8
图10-8 KWrite配置编辑器对话框
配置对话框在左侧用图标来让你选择要配置的KWrite功能。当你选择一个图标时,对话框右侧就显示该功能的配置设置。
10

Appearance功能允许你设定多种特性来控制文本如何在文本编辑器窗口中显示。可以在此启用自动换行、行号(对程序员非常有用)以及折叠标记。在Font & Colors功能中,你可以为编辑器定制完整的色彩方案,决定在程序代码中不同的内容使用什么颜色。

10.4.2 Kate 编辑器

Kate编辑器是KDE项目的旗舰编辑器。它采用和KWrite同样的文本编辑器(所以两者大部分功能相同),但却又融合了大量其他的特性。

窍门 如果你发现Kate编辑器并没有安装在所用的KDE桌面环境中,那你可以毫不费力地把它安装上(参见第9章)。包含Kate的软件包的名字是kdesdk。

当从KDE菜单系统中启动Kate编辑器时,你首先会发现编辑器并未启动!相反,你会看到一个对话框,如图10-9所示。
第 10 章 使用编辑器 - 图9
图10-9 Kate会话对话框
Kate编辑器按会话来处理文件。可以在同一个会话中打开多个文件,也可以将多个会话保存。在启动Kate时,它会让你选择恢复到哪个会话。当关闭Kate会话时,它会记住你打开的文档,并在下次启动Kate时显示它们。这允许你通过为每个项目使用独立的工作区来轻松管理多个项目的文件。
在选择一个会话后,你会看到Kate主编辑器窗口,如图10-10所示。
左侧的框中显示了当前会话中打开的文档。你可以通过点击文档名来在文档间切换。要编辑一个新文件,单击左侧的Filesystem Browser选项卡。左侧的框就会变成一个完整的图形化文件系统浏览器,允许你在图形界面中浏览定位文件。

第 10 章 使用编辑器 - 图10

图10-10 Kate主编辑器窗口
Kate编辑器的一个很好的功能是内建终端窗口,如图10-11所示。
10
第 10 章 使用编辑器 - 图11
图10-11 Kate内建的终端窗口
文本编辑器窗口底部的Terminal选项卡可以启动Kate内建的终端仿真器(采用KDE Konsole终端仿真器)。这个功能可以将当前编辑窗口水平划分,创建了一个新窗口供Konsole运行。现在无需离开编辑器就能输入命令行命令、启动程序或是检查系统设置。要想关掉终端窗口,在命令行提示下输入exit即可。
就像从终端功能中看到的那样,Kate也支持多窗口。Window菜单项(View菜单)提供相关选项:

  • 用当前会话创建新的Kate窗口;
  • 垂直划分当前窗口来创建新窗口;
  • 水平划分当前窗口来创建新窗口;
  • 关闭当前窗口。

要设置Kate中的配置选项,在Settings菜单下选择Configure Kate就会出现配置对话框,如图10-12所示。
第 10 章 使用编辑器 - 图12
图10-12 Kate配置设置对话框
你会注意到,Editor设置区域和KWrite的完全一样。这是因为这两个编辑器使用的是相同的文本编辑器引擎。Application设置区域允许你配置Kate功能,比如控制会话(如图10-12所示)、文档列表以及文件系统浏览器。Kate还支持外部插件应用,可以在这里激活。

10.5 GNOME 编辑器

如果你使用的Linux系统采用的是GNOME或Unity桌面环境,也会有一个可用的图形化文本编辑器。gedit文本编辑器是一个基本的文本编辑器,有一些出于兴趣加进去的高级功能。本节将带你逐步了解gedit的功能并演示如何使用它来进行shell脚本编程。

10.5.1 启动 gedit

大多数GNOME桌面环境都将gedit放在Accessories面板菜单条目中。对于Unity桌面环境,进入Dash ➪ Search,然后输入gedit。如果在菜单系统中找不到gedit,可以从命令行下启动:

$ gedit factorial.sh myprog.c

当启动gedit打开多个文件时,它会将所有的文件都加载到不同的缓冲区,并在主编辑器窗口中使用标签化窗口来显示每个文件,如图10-13所示。
第 10 章 使用编辑器 - 图13
图10-13 gedit主编辑器窗口
gedit主编辑器窗口中左侧框显示了当前在编辑的文档。如果gedit启动时没有显示左侧框,可以按F9键或从View菜单中启用Side Pane。
10

说明 gedit选项在不同桌面环境中的菜单位置可能和上图中略有不同。也许还会有额外的选项。可以查询所用发行版中gedit的Help菜单以获得更多帮助。

右侧显示了含有缓冲区文本的标签化窗口。如果将鼠标在每个标签上晃动几下,就会出现一个对话框,显示文件的全路径名、MIME类型以及它所采用的字符集编码。

10.5.2 基本的 gedit 功能

除了编辑器窗口,gedit采用菜单栏和工具栏来设置功能和配置设置。工具栏提供了到菜单栏条目的快捷方式。以下是可用的菜单栏条目。

  • File:处理新文件、保存已有文件以及打印文件。
  • Edit:在工作缓冲区域操作文本并设定编辑器偏好设置。
  • View:设定显示在窗口中的编辑器功能以及文本的高亮显示模式。
  • Search:在工作缓冲区域查找和替换文本。
  • Tools:访问安装在gedit上的插件工具。
  • Documents:管理缓冲区中打开的文件。
  • Help:访问完整的gedit手册。

这里没什么特别的地方。Edit菜单含有标准的剪切、复制和粘贴功能,而且还有一个非常贴心的功能,即允许你轻而易举地在文本中使用几种不同格式输入时间日期。Search菜单提供了标准的查找功能,它会生成一个供你输入要查找文本的对话框,还能选择使用哪一种查找功能(区分大小写、全字匹配和查找方向)。它还提供了实时模式的渐进式查找,可以在你输入单词字母的同时进行查找。

10.5.3 设定偏好设置

Edit菜单包含了一个Preferences菜单项,它会产生gedit Preferences对话框,如图10-14所示。
第 10 章 使用编辑器 - 图14
图10-14 gedit Preferences对话框
这里是你定制gedit编辑器操作的地方。Preferences对话框包含5个标签化区域,用于设定编辑器的功能和行为。

  1. 设置View偏好

View选项卡提供了gedit如何在编辑器窗口中显示文本的选项。

  • Text Wrapping:决定如何处理编辑器中的长行。Enable text wrapping选项会将长行自动换到编辑器中的下行。Do Not Split Words Over Two Lines选项禁止在长单词中自动插入连字符,以防它们被分隔在两行中。
  • Line Numbers:在编辑器窗口的左边界显示行号。
  • Current Line:高亮显示光标当前所在行,使得你能轻松找到光标位置。
  • Right Margin:启用右边界,可以让你在编辑器窗口中设置多少列。默认值是80列。
  • Bracket Matching:开启了的话,高亮显示代码中的括号对,可以方便地匹配在if-then

语句中、for和while循环中以及其他涉及括号的代码中的括号。
行号和括号匹配功能为程序员提供了文本编辑器中不常见的排错环境。

  1. 设置Editor偏好

Editor选项卡可以用来设置gedit编辑器如何处理标签和缩进以及如何保存文件。

  • Tab Stops:设定按下制表符时跳过的空白数,默认值是8。这个功能还包括一个复选框,允许在选定时插入空格来填充制表符跳过的空白。
  • Automatic Indentation:开启了的话,让gedit在文本中自动为段落和代码元素(比如

if-then语句和循环)缩进。

  • File Saving:提供保存文件的两个功能——在编辑窗口中打开文件时是否创建备份,以及是否按照预设的时间间隔自动保存文件。

自动保存功能可保证你对文件做出的更改能够被定时保存,从而避免系统崩溃或断电造成的灾难性后果。

  1. 设置Font & Colors偏好

Font & Colors选项卡允许你配置(意料之中)两个条目。

  • Font:允许你选用默认字体,或从对话框中选用定制的字体和字体大小。

10

  • Color Scheme:允许你选择用于文本、背景、选定文本以及选定内容的默认色彩方案, 或为每个类型选用一种自定义色彩。

gedit默认的色彩通常与选定的标准GNOME桌面主题一致。可更改这些色彩来匹配桌面主题。

  1. 管理插件

Plugins选项卡可以控制gedit中使用的插件。插件是一种独立的程序,可以和gedit结合以提供额外的功能。
gedit有一些可用的插件,但默认并没有全部安装。表10-5介绍了当前安装在gedit上的插件。已启用的插件会在它们名字边上的复选框里显示一个对号。一些插件(比如External Tool)
也在你选用它们后提供了额外的配置功能。它允许你设定快捷键来启动终端、指定gedit的输出显示在哪里以及启动shell会话的命令。

表10-5 gedit插件

插 件 名 描 述
Change Case 改变选定文本的大小写
Document Statistics 报告单词、行、字符和非空字符的数量
External Tools 在编辑器中提供一个shell环境来执行命令和脚本
File Browser Pane 提供了一个简易的文件浏览器,让选择要编辑的文件简单些
Indent Lines 为选中的行设置缩进或取消缩进
Insert Date/Time 在光标当前位置插入当前日期和时间(可以选择多种格式)
Modelines 在编辑器窗口底部显示类emacs的消息行
Python Console 在编辑器窗口底部提供一个用来输入Python语言命令的交互式控制台
Quick Open 直接在gedit编辑窗口中打开文件
Snippets 允许你存储常用的文本段以方便在文本中取回使用
Sort 快速排序整个文件或选定文本
Spell Checker 为文本文件提供词典式拼写检查
Tag List 提供一个可轻松输入到文本中的常用字符串列表

遗憾的是,并非所有插件都安装在gedit菜单栏的同一个地方。一些插件会出现在Tools菜单栏(比如Spell Checker和External Tools插件),而另一些则出现在Edit菜单栏(比如Change Case和 Insert Date/Time插件)。
本章讲述了一些Linux中可用的文本编辑器。如果觉得这些文本编辑器都不合意,也可以选择别的。Linux中的文本编辑器多得很,如geany、Eclipse、jed、Bluefish及leafpad,这些只是其中的一小部分。当踏上bash shell脚本编写旅程之时,这些文本编辑器都能够助你一臂之力。

10.6 小结

在创建shell脚本时,你需要某种类型的文本编辑器。在Linux环境下,有一些流行的文本编辑器。Unix世界中最流行的编辑器vi已作为vim编辑器移植到了Linux中。vim编辑器采用基本的全屏图形模式,提供了简单的控制台文本编辑功能。vim编辑器还具备很多高级编辑器功能,比如文本查找和替换。
另一个从Unix世界移植到Linux中的编辑器是nano文本编辑器。vim编辑器非常复杂,而nano 编辑器却十分简单,它能够在控制台模式下快速地编辑文本。
另一个流行的Unix编辑器emacs也已步入了Linux的世界。Linux版本的emacs包括控制台模式和图形模式,这使其成为连接新旧世界的一座桥梁。emacs编辑器提供了多个缓冲区,允许你同时编辑多个文件。
KDE项目创建了两款可用于KDE桌面的编辑器。KWrite编辑器是一个简单的编辑器,除了基本的文本编辑功能之外,还提供了一些高级功能,比如程序代码的高亮显示、行编号和代码折叠。Kate编辑器为程序员提供了更多的高级功能。Kate中一个很棒的功能就是内建的终端窗口。你可以在Kate编辑器中直接打开一个命令行界面会话,再也不用专门打开单独的终端仿真器窗口了。
Kate编辑器还允许你打开多个文件,为每个打开的文件提供了不同的窗口。
GNOME项目也为程序员提供了一个简单的文本编辑器。gedit编辑器是一个基本的文本编辑器,同时还提供了一些高级功能,例如代码语法高亮显示和行编号,但它的设计初衷是作为一款精简的编辑器使用。为了丰富gedit编辑器的功能,开发人员开发了插件,扩展了gedit的已有功能。目前的插件包括一个拼写检查器、一个终端仿真器和一个文件浏览器。
使用Linux命令行所需的背景知识到此就算介绍完毕了。本书的下一部分将会深入shell编程的世界。下章将从演示如何创建shell脚本文件和如何在Linux系统上运行脚本开始。另外还会介绍shell脚本的基础知识,使你可以通过将多条命令放入可执行的脚本中来创建简单的程序。