第 18 章 Emacs 编 辑 器

你 可 以 象 使 用 其 它 标 准 的 文 字 处 理 器 那 样 使 用 、 操 作 Emacs 编 辑 器 。 键 盘上 普 通 的 按 键 用 来 输 入 字 符 , 而 编 辑 器 的 操 作 命 令 是 通 过 键 盘 上 的 一 些 特 殊 的按 键 来 实 现 的 ,例 如 :控 制 键 CTRL 、ALT 键 等 。与 Vi 及 Ed 编 辑 器 不 同 ,Emacs 编 辑 器 没 有 特 定 的 输 入 模 式 与 命 令 模 式 之 分 。 如 果 正 在 输 入 文 本 , 必 要 时 , 你也 可 以 执 行 编 辑 命 令 , 例 如 用 CTRL 键 来 移 动 光 标 、 保 存 文 件 等 。

这 样 组 织 Emacs 编 辑 器 的 目 的 在 于 使 该 编 辑 器 易 于 使 用 。 但 Emacs 编 辑器 绝 非 一 个 简 单 的 编 辑 器 , 因 为 该 编 辑 器 是 一 个 复 杂 且 非 常 灵 活 的 编 辑 器 , 它有 好 几 百 个 编 辑 命 令 。 Emacs 编 辑 器 也 有 一 些 特 殊 的 特 性 , 例 如 : 多 窗 口 特 性 。你 可 以 在 编 辑 文 本 时 同 时 显 示 两 个 窗 口 。 你 也 可 以 同 时 打 开 并 对 多 个 文 件 进 行编 辑 与 操 作 , 并 在 屏 幕 上 与 之 对 应 的 编 辑 窗 口 内 显 示 每 个 文 本 。

Linux 的 GNU 版 本 是 由 R ichard Stallman 开 发 的 , 你 可 以 在 你 的 Caldera 光 盘 上 找 到 Emacs 编 辑 器 。 在 大 多 数 Linux 系 统 上 , 该 编 辑 器 是 一 个 标 准 的 实用 程 序 。 但 是 , 在 安 装 Linux 系 统 时 , 如 果 你 选 择 快 速 安 装 , 那 么 Emacs 编 辑器 是 不 会 安 装 到 你 的 系 统 中 去 的 。 此 时 , 如 果 你 要 使 用 Emacs 编 辑 器 , 首 先 必须 使 用 glint 来 安 装 Emacs 编 辑 器 软 件 包 。 必 须 注 意 : 你 必 须 以 超 级 用 户 登 陆 ,

并 在 光 盘 驱 动 器 上 放 置 了 你 的 Caldera 光 盘 。

Emacs 编 辑 器 通 过 巧 妙 地 控 制 、 操 作 工 作 缓 冲 区 来 实 现 其 强 大 、 灵 活 的 功能 。 Emacs 编 辑 器 可 以 被 认 为 是 面 向 缓 冲 区 (buffer_oriented )的 编 辑 器 。 在 任何 编 辑 器 中 编 辑 文 本 时 , 该 文 件 将 首 先 被 拷 贝 到 工 作 缓 冲 区 中 , 而 所 有 的 编 辑操 作 都 在 工 作 缓 冲 区 进 行 。 许 多 编 辑 器 在 编 辑 文 件 时 仅 开 辟 一 个 工 作 缓 冲 区 , 因 此 , 仅 能 打 开 一 个 文 件 , 而 Emacs 编 辑 器 同 时 可 以 开 辟 并 管 理 多 个 工 作 缓 冲区 , 因 此 允 许 你 同 时 对 多 个 文 件 进 行 编 辑 操 作 。 你 还 可 以 用 编 辑 缓 冲 区 来 保 存 、删 除 或 拷 贝 文 本 , 你 甚 至 可 以 开 辟 你 自 己 的 缓 冲 区 , 并 在 这 些 缓 冲 区 中 保 存 文本 , 必 要 时 可 以 把 这 些 缓 冲 区 内 的 文 本 保 存 到 文 件 中 去 。

用 Emacs 编 辑 器 创 建 文 件

你 在 Shell 命 令 下 的 emacs 来 启 动 Emacs 编 辑 器 。 你 可 以 在 emacs 命 令后 输 入 你 想 编 辑 的 文 件 名 , 如 果 该 文 件 名 不 存 在 , 该 文 件 将 被 创 建 。 在 下 面 的例 子 中 , 用 户 准 备 用 Emacs 编 辑 器 来 编 辑 名 为 mydata 的 文 件 。

$ emacs mydata

与 Vi 编 辑 器 一 样 , Emacs 编 辑 器 是 一 个 全 屏 幕 编 辑 器 。 当 编 辑 的 文 件 是 新创 建 的 文 件 时 , 除 屏 幕 的 底 部 两 行 外 , 屏 幕 是 空 白 的 , 光 标 将 位 于 屏 幕 的 左 上角 。 屏 幕 底 行 被 称 为 显 示 域 ( echo area ) , 它 在 Emacs 编 辑 器 中 起 着 命 令 行的 作 用 , 它 通 常 用 来 显 示 Emacs 编 辑 器 提 示 信 息 。 该 行 之 上 是 模 式 行 ( mode

line ) , 它 用 来 显 示 正 在 编 辑 的 文 本 的 状 态 信 息 , 该 行 在 屏 幕 上 通 常 是 反 色 ( 与屏 幕 ) 并 高 亮 显 示 的 。 图 18-1 是 Emacs 编 辑 器 在 进 行 文 本 编 辑 时 的 不 同 显 示域 。

第 18 章 Emacs 编 辑 器 - 图1你 可 以 在 任 何 时 候 输 入 文 本 , 因 为 你 永 远 处 于 输 入 模 式 下 一 样 。 一 些 编 辑命 令 , 例 如 移 动 命 令 , 通 过 CTRL 键 来 实 现 。 例 如 , 你 想 右 移 光 标 , 你 可 以 键入 CTRL-f 命 令 ;左 移 光 标 ,可 以 键 入 CTRL-b 命 令 ;上 移 一 行 ,可 以 使 用 CTRL-p 命 令 ; 下 移 一 行 , 可 以 使 用 CTRL-n 命 令 。

图 18-1Emacs 编辑器的编辑屏幕:编辑域、模式行及显示域

你 可 以 在 任 何 时 候 键 入 CTRL-x CTRL-s 命 令 来 保 存 你 编 辑 的 文 件 。 许 多Emacs 编 辑 命 令 是 由 多 个 CTRL 键 与 其 它 键 的 组 合 组 成 的 命 令 。 例 如 命 令 系 列CTRL-x CTRL-c 用 来 退 出 Emacs 编 辑 器 。 如 果 你 已 经 完 成 了 一 个 文 件 的 编 辑 , 在 用 CTRL-x CTRL-c 系 列 命 令 退 出 Emacs 编 辑 器 之 前 , 你 必 须 首 先 用 命 令 系列 CTRL-x CTRL-s 来 保 存 编 辑 的 文 件 。

Meta-keys 、 行 命 令 及 编 辑 模 式

Emacs 编 辑 器 的 编 辑 操 作 与 许 多 普 通 的 文 字 处 理 器 类 似 。 Emacs 编 辑 器 仅有 一 种 编 辑 模 式 : 输 入 模 式 。 如 果 你 键 入 任 何 字 符 键 , 键 入 的 字 符 将 被 输 入 至编 辑 的 文 件 中 去 , 所 有 的 字 符 键 都 被 用 来 输 入 字 符 , 而 不 是 用 来 输 入 命 令 。 与CTRL 键及 ALT 等 键 相 反 , 一 个 字 符 键 可 以 被 认 为 是 任 何 你 可 以 直 接 键 入 到 文件 中 的 字 符 。 我 们 可 以 这 么 认 为 : 字 符 键 是 可 以 在 打 字 机 上 打 印 出 的 字 符 。

Emacs 编 辑 器 编 辑 命 令 是 CTRL 键 及 meta-key 键 的 组 合 。 在 本 书 介 绍 的Emacs 编 辑 器 版 本 中 , 一 个 meta-key 可 以 是 一 个 ALT 键 , 或 者 是 一 个 ESC 键 , 在 其 它 的 系 统 中 , 可 能 是 其 它 键 。 ALT 键 命 令 系 列 与 CTRL 键 命 令 系 列 的操 作 基 本 相 同 , 即 首 先 一 直 按 住 ALT 键 , 再 键 入 相 应 的 按 键 , 最 后 同 时 放 开 这两个键。但 ESC 键 命 令 系 列 稍 微 有 点 不 同 : 首 先 键 入 ESC 键 , 然 后 放 开 该 键 , 再 键 入 相 应 的 按 键 。 ESC 键 的 使 用 频 率 要 远 比 ALT 键 的 使 用 频 率 要 高 , 因 为很 多 早 期 的 键 盘 根 本 没 有 ALT 键 。因 此 ,本 章 主 要 介 绍 ESC 键 等 这 些 meta-key 键 , 同 时 必 须 记 住 , 这 些 meta-key 键 也 可 以 用 你 的 终 端 上 的 ALT 键 来 代 替 。

CTRL 键 及 meta-key 键 只 是 Emacs 编 辑 器 中 众 多 编 辑 命 令 的 一 部 分 。 所有 的 命 令 都 可 以 显 示 在 编 辑 显 示 域 ( 可 以 把 Emacs 编 辑 器 中 的 显 示 域 看 作 Vi 编 辑 器 中 的 底 行 命 令 行 ) 。 meta-key 命 令 ALT-x 及 ESC-x 等 将 被 放 置 在 编 辑器 的 显 示 域 中 。 一 旦 进 入 编 辑 器 显 示 域 中 , 你 可 以 在 该 行 上 键 入 任 何 命 令 及 其参 数 , 并 键 入 ENTER 键 来 执 行 该 命 令 。 表 18-1 列 出 了 Emacs 编 辑 器 的 一 些

编 辑 命 令 。 在 模 式 行 上 将 显 示 正 在 编 辑 的 文 本 的 状 态 信 息 。 模 式 行 由 几 个 部 分组 成 , 其 形 式 如 下 :

- ST - Emacs: BufferName ( ma jor minor) Place-

第 一 个 域 是 ST ( status) , 它 表 示 最 近 对 文 件 进 行 修 改 以 来 , 该 修 改 的 文件 是 否 已 经 被 保 存 过 。 如 果 该 域 是 两 个 星 号 ( ** ) , 表 示 该 文 本 已 经 被 修 改 过 , 且 并 没 有 保 存 ; 如 果 该 域 是 两 个 连 字 符 ( --) , 表 示 该 文 本 从 最 后 一 次 保 存 到现 在 还 没 有 被 修 改 过 ; 如 果 该 域 是 两 个 百 分 号 字 符 ( %% ) , 表 示 该 文 本 是 一只 读 文 件 , 不 能 被 修 改 。

BufferName 域 表 示 该 工 作 缓 冲 区 的 名 字 , 这 个 工 作 缓 冲 区 名 将 是 目 前 编 辑的 文 件 名 。而 Place 域 表 示 你 目 前 处 于 被 编 辑 的 文 件 名 的 何 处 。例 如 ,如 果 Place 域 是 40% , 那 么 , 表 示 你 目 前 ( 即 光 标 ) 约 处 于 文 件 的 40% 处 。 在 下 面 的 例 子中 , 模 式 行 表 示 自 最 近 一 次 修 改 以 来 , 该 文 件 还 没 有 被 保 存 过 , 工 作 缓 冲 区 的名 是 mytext, 光 标 处 于 文 件 的 顶 行 。

18.3-* *-Emacs:mytext (text fill)---- --Top--

major/minor 域 表 示 在 编 辑 文 本 的 过 程 中 的 主 要 及 辅 助 模 式 。 Emacs 编 辑 器能 自 动 识 别 几 个 常 见 的 标 准 模 式 。 最 常 见 的 模 式 是 文 本 模 式 。 不 同 类 型 的 文 件需 要 不 同 的 编 辑 配 置 与 选 项 。 例 如 , 对 C 程 序 来 说 , 需 具 有 自 动 缩 进 特 性 , 因此 , 编 辑 C 程 序 时 有 其 特 定 的 编 辑 模 式 。 Emacs 编 辑 器 还 能 自 动 识 别 其 它 的 几种 标 准 编 辑 模 式 , 例 如 nroff 及 Lisp 等。 Emacs 编 辑 器 通 过 编 辑 的 文 件 名 的 控

制 名 来 决 定 将 使 用 的 编 辑 模 式 。 如 果 由 于 某 些 原 因 , Emacs 编 辑 器 不 能 决 定 使用 的 编 辑 模 式 , 该 编 辑 器 将 使 用 基 本 的 编 辑 模 式 , 该 编 辑 模 式 不 具 有 某 些 特 殊的 特 性 。

Emacs 编 辑 器 还 有 几 种 辅 助 模 式 : fill、 overwrite 及 abbrev 。 fill 模 式 通 常是 缺 省 的 模 式 。 该 模 式 将 在 编 辑 文 本 时 自 动 换 行 ; overwrite 模 式 允 许 你 覆 盖 文本 ; 而 abbrev 模 式 允 许 你 在 输 入 文 本 的 时 候 使 用 缩 写 。

Emacs 编 辑 器 的 编 辑 命 令

Emacs 编 辑 器 的 编 辑 命 令 能 执 行 许 多 操 作 , 其 它 编 辑 器 基 本 上 也 有 类 似 的编 辑 操 作 。 Emacs 编 辑 器 中 所 有 的 编 辑 命 令 基 本 上 都 通 过 CTRL 键 、 ALT 键 或ESC 键 组 成 的 命 令 系 列 来 完 成 与 实 现 。 所 有 这 些 编 辑 命 令 也 都 有 对 应 的 命 令名 , 你 可 以 在 显 示 域 中 输 入 这 些 命 令 。 本 节 将 介 绍 许 多 常 见 的 实 用 命 令 。

移 动 命 令

与 Vi 编 辑 器 一 样 , Emacs 编 辑 器 有 一 组 基 本 的 光 标 移 动 命 令 。 CTRL-f 命令 用 来 将 光 标 前 移( forward )一个字符,而 CTRL-b 命 令 用 来 后 移( backward ) 一 个 字 符 。 CTRL-f 命 令 及 CTRL-b 命 令 分 别 也 可 以 看 作 将 光 标 右 移 及 左 移 一 个字 符 。 但 是 , Vi 编 辑 器 的 光 标 右 移 与 左 移 命 令 仅 局 限 于 一 行 上 , 而 Emacs 编

辑 器 的 前 移 命 令 与 后 移 命 令 却 不 是 如 此 。 Emacs 编 辑 器 把 一 个 文 件 看 作 一 种 流式 字 符 串 , 而 不 是 一 系 列 的 文 本 行 。 向 后 ( backward ) 移 动 光 标 命 令 将 使 光 标沿 流 式 文 本 左 移 一 个 字 符 ( 例 如 在 当 前 行 的 行 首 上 将 光 标 左 移 一 个 字 符 时 , 光标 将 回 到 上 一 行 的 行 尾 上 ) 。 向 前 ( forward ) 移 动 光 标 命 令 也 是 如 此 。

也 有 一 组 编 辑 命 令 能 使 用 户 在 文 件 本 中 以 行 为 单 位 移 动 光 标 或 整 屏 移 动 光标 。 CTRL-n 命 令 及 CTRL-p 命 令 分 别 用 来 下 移 ( down ) 及 上 移 ( up ) 光 标 一行 。 CTRL-n 命 令 将 把 光 标 移 动 到 下 一 行 上 , 如 果 此 时 光 标 位 于 屏 幕 最 后 一 行 , 屏 幕 将 下 滚 一 行 , 并 使 当 前 行 的 下 一 行 显 示 在 屏 幕 上 。 CTRL-p 命 令 将 把 光 标移 动 到 上 一 行 , 如 果 此 时 光 标 位 于 屏 幕 最 顶 行 , 屏 幕 将 上 滚 一 行 , 并 使 当 前 行的 前 一 行 显 示 在 屏 幕 上 。 CTRL-v 命 令 及 CTRL-z 命 令 将 整 屏 滚 动 文 本 。 CTRL- v 命 令 将 使 文 本 向 前 ( forward ) 滚 屏 并 显 示 下 一 屏 文 本 , 而 CTRL-z 命 令 将 使文 本 向 后 ( backward ) 滚 屏 并 显 示 上 一 屏 文 本 。

你 也 可 以 以 单 词 、 段 落 等 为 计 量 单 位 来 移 动 光 标 。 meta-key 键 命 令 ESC f 及 ESC b 用 来 以 单 词 为 单 位 前 、 后 移 动 光 标 。 ESC ] 命 令 可 以 把 光 标 移 动 至下 一 段 落 的 段 首 , 而 ESC [ 命 令 将 把 光 标 移 动 至 前 一 段 落 段 首 。 这 些 命 令 可以 使 你 在 编 辑 文 本 时 向 任 意 方 向 快 速 移 动 光 标 。 还 有 一 些 移 动 命 令 可 以 使 光 标移 动 至 特 定 的 行 上 。 例 如 , CTRL-a 命 令 将 把 光 标 移 动 至 行 首 , 而 CTRL-e 命令 将 把 光 标 移 动 至 行 尾 ; CRTL-l 命 令 将 把 光 标 移 动 至 屏 幕 的 中 央 ; ESC <命 令将 把 光 标 移 动 至 文 件 的 第 一 行 , 而 ESC > 命 令 将 把 光 标 移 动 至 文 件 的 结 尾 。

你 可 以 在 编 辑 命 令 前 输 入 Emacs 编 辑 器 的 重 复 命 令 来 重 复 执 行 一 个 命 令 , 此 重 复 命 令 是 ESC num , 这 里 num 是 你 将 要 重 复 执 行 的 命 令 的 运 行 次 数 。 例

如 , 要 右 移 光 标 5 次 , 首 先 输 入 重 复 命 令 及 重 复 的 次 数 , 然 后 键 入 CTRL-f 命令 :

ESC 5 Ctrl-f

你 也 可 以 用 相 同 的 方 式 来 使 用 重 复 命 令 完 成 重 复 输 入 :首 先 键 入 ESC 命 令 , 再 键 入 命 令 重 复 执 行 的 次 数 , 最 后 键 入 输 入 的 内 容 。 例 如 , ESC 3 T 命 令 将 往文 本 中 输 入 三 个 T 字 符 。

删 除 命 令

删 除 文 本 意 味 着 永 久 地 删 除 文 件 中 的 字 符 。 有 两 类 基 本 的 删 除 操 作 : 一 类是 删 除 光 标 之 后 的 字 符 , 另 一 类 是 删 除 光 标 之 后 的 字 符 。 CTRL-d 命 令 将 删 除光 标 之 后 的 字 符 , 而 DEL 键 将 删 除 光 标 之 前 的 字 符 , 它 与 BACKSPACE 键 的功 能 相 同 。

删 除 缓 冲 区 及 移 动 文 本

在 Emacs 编 辑 器 中 , delete 文 本 与 kill 文 本 是 有 区 别 的 。 delete 文 本 将 永久 地 将 文 本 从 文 件 中 删 除 掉 , 而 kill 文 本 只 是 将 文 本 从 文 件 缓 冲 区 中 删 除 , 但编 辑 器 会 将 其 拷 贝 到 kill 缓 冲 区 中 保 存 , 必 要 时 可 以 将 其 恢 复 。 Emacs 编 辑 器中 kill 文 本 与 Vi 编 辑 器 中 的 删 除 操 作 非 常 类 似 。 被 kill 掉 的 文 本 被 保 存 在 一 组有 编 辑 器 创 建 的 kill 缓 冲 区 中 。 当 你 kill 文 本 的 时 候 , 每 一 个 kill 缓 冲 区 将 依 次

保 存 被 kill 掉 的 文 本 。 kill 缓 冲 区 是 一 个 循 环 链 表 , 当 所 有 的 kill 缓 冲 区 都 保 存了 文 本 时 , 最 先 保 存 了 文 本 的 kill 缓 冲 区 将 被 下 一 个 要 删 除 的 文 本 覆 盖 掉 。

在 任 何 时 候 , 你 都 可 以 把 kill 缓 冲 区 中 的 文 本 插 入 到 文 本 中 去 。 从 这 种 意 义上 说 , kill 命 令 意 味 着 对 文 件 中 的 文 本 进 行 移 动 操 作 。 你 首 先 kill 它 们 , 于 是 该文 本 会 在 文 件 中 删 除 , 但 是 , 你 可 以 把 光 标 移 动 至 任 意 地 方 , 并 插 入 已 经 kill 掉 的 文 本 。

你 也 可 以 以 不 同 的 计 量 单 位 来 kill 文 本 , 例 如 , 以 单 词 及 行 为 单 位 来 kill 文本 。 ESC DEL 命 令 将 删 除 光 标 所 在 单 词 的 前 一 个 单 词 , 而 ESC d 命 令 将 删 除光 标 所 在 单 词 的 后 一 个 单 词 。 你 也 可 以 在 删 除 命 令 之 前 键 入 ESC num 命 令 来重 复 执 行 删 除 操 作 , 以 连 续 删 除 几 个 单 词 。 例 如 ESC 3 ESC d 将 连 续 删 除 三 个单 词 。

CTRL-k 命 令 将 删 除 从 光 标 所 在 位 置 至 行 尾 的 所 有 字 符 。 要 删 除 整 行 字 符 , 必 须 首 先 用 CTRL-a 命 令 将 光 标 放 置 在 行 首 , 然 后 键 入 CTRL-d 命 令 。 然 而 , 此 时 CTRL-d 命 令 并 不 删 除 该 行 , 该 行 依 然 存 在 , 只 是 该 行 将 成 为 没 有 任 何 字符 的 空 行 。要 删 除 字 符 的 同 时 删 除 该 空 行 , 需 要 键 入 删 除 命 令 : CTRL-k CTRL-k 命 令 , 其 中 , 第 二 个 CTRL-k 命 令 将 删 除 空 行 。 实 际 上 , 要 删 除 空 行 就 是 要 删除 新 行 标 识 字 符 ( 键 入 ENTER 键 时 ) 。 与 删 除 单 词 一 样 , 如 果 你 想 同 时 删 除多 行 ,你 可 以 在 CTRL-k 命 令 之 前 输 入 重 复 命 令 。例 如 ,ESC 10 CTRL-k CTRL-k 命 令 将 删 除 10 行 文 本 。

一 旦 你 kill 了 文 本 ( 同 时 将 被 保 存 至 kill 缓 冲 区 ) , 你 可 以 使 用 CTRL-y 命令 把 它 们 插 入 到 文 本 中 去 。 CTRL-y 命 令 也 通 常 被 称 之 为 yand 命 令 。 在 kill 缓

冲 区 中 的 任 何 文 本 都 将 被 插 入 带 编 辑 的 文 本 中 去 。 如 果 kill 缓 冲 区 保 存 了 单 词 , CTRL-y 命 令 将 插 入 单 词 , 如 果 kill 缓 冲 区 保 存 了 一 行 或 多 行 文 本 , CTRL-y 命令 将 插 入 一 行 或 多 行 文 本 。

移 动 文 本 涉 及 到 两 个 过 程 : 首 先 用 删 除 命 令 将 文 本 删 除 至 kill 缓 冲 区 , 然 后使 用 yank 命 令 CTRL-y 来 插 入 文 本 。 在 下 面 的 例 子 中 , 一 系 列 的 命 令 将 当 前 行上 移 五 行 。

C trl-k Ctrl-k Esc 5 Ctrl-p

C trl-y

如 果 你 意 外 地 删 除 了 多 行 或 将 文 本 插 入 到 了 不 想 插 入 的 地 方 , 你 可 以 用CTRL-x u 命 令 取 消 这 一 意 外 操 作 。 Emacs 编 辑 器 甚 至 可 以 让 你 使 用 ESC x 命令 取 消 自 开 始 这 一 次 编 辑 以 来 所 有 的 修 改 。

字 符 块 : 点 (point) 与 标 识 ( ma rk)

你 可 以 创 建 一 个 与 光 标 位 置 相 关 的 字 符 块 , 并 选 择 该 字 符 块 。 一 个 字 符 块可 以 是 光 标 所 在 的 位 置 与 任 意 先 前 标 识 的 字 符 之 间 的 所 有 文 本 。 你 可 以 使 用CTRL-@ 命 令 来 标 识 一 个 字 符 ( 该 标 识 的 字 符 就 是 你 要 选 择 的 字 符 块 结 束 字符 ) , 然 后 把 光 标 移 动 至 文 件 的 任 何 地 方 , 于 是 被 标 识 的 字 符 与 光 标 所 在 的 位置 之 间 的 字 符 可 以 称 之 为 字 符 块 。 在 Emacs 编 辑 器 中 , 此 光 标 的 位 置 常 称 之 为点 (point) , 而 被 标 识 的 字 符 称 为 一 个 标 识 (mark) 。

在 Emacs 编 辑 器 中 , 有 一 部 分 命 令 用 来 对 字 符 块 进 行 操 作 。 例 如 , 你 可 以拷 贝 或 删 除 字 符 块 : CTRL-w 命 令 将 删 除 选 择 的 字 符 块 , 并 把 它 保 存 在 删 除 缓冲 区 中 ; ESC w 命 令 将 把 字 符 块 拷 贝 至 kill 缓 冲 区 中 去 ; 你 可 以 使 用 CTRL-w 命 令 删 除 一 个 字 符 块 , 而 用 CTRL-y 命 令 把 删 除 的 字 符 块 插 入 到 编 辑 的 文 件 中 , 即 用 这 两 个 命 令 来 实 现 字 符 块 的 移 动 。

Emacs 编 辑 器 在 编 辑 的 文 件 中 并 不 显 示 标 识 。 如 果 你 忘 记 了 标 识 的 位 置 , 你 可 以 使 用 CTRL-xCTRL-x 命 令 来 定 位 一 个 标 识 。 键 入 CTRL-x CTRL-x 命 令 , 编 辑 器 将 把 光 标 定 位 在 先 前 的 标 识 字 符 上 , 继 续 键 入 CTRL-x CTRL-x 命 令 , 光 标 将 移 动 到 光 标 先 前 所 在 的 位 置 上 。

你 也 可 以 用 计 量 单 位 来 定 义 字 符 块 。 你 可 以 用 段 标 识 命 令 ESC h 来 选 择光 标 所 在 的 段 为 字 符 块 。 此 时 , point 是 光 标 所 在 段 的 段 首 , 而 标 识 是 光 标 所 在段 的 段 尾 。 CTRL-x CTRL-p 命 令 将 选 择 光 标 所 在 的 页 为 字 符 块 。 可 以 用 整 个 编辑 缓 冲 区 标 识 命 令 CTRL-x h 来 选 择 编 辑 缓 冲 区 , 并 把 该 缓 冲 区 作 为 一 个 字 符块 。 下 面 是 一 些 有 关 字 符 块 操 作 的 一 些 命 令 :

Esc h Ctrl-w 删 除 光 标 所 在 的 段 落

Esc h Esc w 拷 贝 光 标 所 在 的 段 落

C trl-x Ctrl-p Esc w 删 除 光 标 所 在 的 页

C trl-x h Esc g 调 整 整 个 文 本

模 式 搜 索 命 令

你 可 以 键 入 CTRL-s 命 令 来 完 成 模 式 搜 索 。 CTRL-s 命 令 将 把 光 标 放 置 在 编辑 器 的 显 示 域 上 , 此 时 , 你 可 以 在 显 示 域 上 输 入 搜 索 的 模 式 ( pattern ) 。 一 旦你 键 入 字 符 , Emacs 编 辑 器 就 开 始 搜 索 , 当 你 继 续 输 入 字 符 时 , Emacs 编 辑 器将 继 续 搜 索 与 正 在 输 入 的 模 式 匹 配 的 字 符 串 。 例 如 , 如 果 你 想 键 入 搜 索 模 式preface , 一 旦 你 键 入 字 符 p , 光 标 将 移 动 至 文 件 中 与 模 式 p 匹 配 的 字 符 处 。 继续 键 入 字 符 r, 光 标 将 移 动 到 与 模 式 pr 匹 配 的 字 符 串 处 。 要 结 束 模 式 的 输 入 , 你 可 以 键 入 ESC 键 。 下 面 是 在 文 件 中 向 前 ( forward ) 进 行 模 式 搜 索 的 基 本 格式 :

C trl-s pattern

C rtl-r 命 令 将 在 文 件 中 向 后 ( backward ) 进 行 模 式 搜 索 。 这 两 个 命 令 都 不 会自 动 绕 自 行 首 成 行 尾 。 多 次 执 行 CTRL-s 命 令 后 , 光 标 将 停 留 在 文 件 的 结 尾 , 而 CTRL-r 命 令 将 停 留 在 文 件 的 首 行 。 Emacs 将 保 存 最 后 一 次 的 搜 索 模 式 。 直接 键 入 CTRL-s 或 CTRL-r 命 令 而 不 键 入 搜 索 的 模 式 , 编 辑 器 将 用 前 一 次 的 搜索 模 式 进 行 搜 索 。

正 则 表 达 式 搜 索

Emacs 编 辑 器 允 许 你 使 用 在 V i、 Ex 及 Ed 等 编 辑 器 中 使 用 任 何 正 则 表 达 式及 特 殊 字 符 。 要 在 搜 索 时 使 用 正 则 表 达 式 , 你 可 以 在 CTRL-s 或 CTRL-r 搜 索

命 令 之 前 键 入 ESC 键 , 即 ESC CTRL-s 或 ESC CTRL-r 命 令 允 许 你 在 搜 索 字符 串 中 使 用 正 则 表 达 式 。

替 换 操 作 : 全 局 替 换 命 令 与 查 询 替 换 命 令

在 Emacs 编 辑 器 中 , 你 可 以 使 用 全 局 替 换 命 令 或 查 询 替 换 命 令 操 作 来 实 现文 本 的 替 换 。 由 于 全 局 替 换 操 作 主 要 执 行 全 局 代 替 , 因 此 我 们 很 少 使 用 该 操 作 。而 查 询 替 换 操 作 允 许 你 执 行 单 个 的 替 换 。 事 实 上 , 当 执 行 查 询 替 换 操 作 时 , 如果 编 辑 器 搜 索 到 与 模 式 匹 配 的 字 符 串 , 编 辑 器 将 询 问 你 是 替 换 该 字 符 串 还 是 不执 行 替 换 操 作 而 直 接 进 行 下 一 次 搜 索 与 模 式 匹 配 , 或 者 退 出 当 前 的 查 询 替 换 操作 。 这 样 , 在 你 执 行 替 换 的 时 候 , 查 询 替 换 比 全 局 替 换 具 有 更 多 的 控 制 权 。 在进 行 正 则 表 达 式 搜 索 时 , 这 两 个 操 作 都 有 与 之 对 应 的 特 殊 命 令 。

全 局 替 换 : Replace-string 命 令

你 可 以 直 接 在 编 辑 器 的 显 示 域 中 使 用 replace-string 命 令 来 执 行 全 局 替 换 操作 , 且 在 键 入 replace-string 命 令 后 , 你 不 必 键 入 任 何 键 。 其 操 作 过 程 如 下 : 首先 键 入 ESC x 命 令 进 入 编 辑 器 的 显 示 域 , 然 后 键 入 replace-string 命 令 , 编 辑器 立 即 提 示 你 输 入 搜 索 的 模 式 及 将 要 替 换 的 字 符 串 。 该 命 令 与 Ex 编 辑 器 中 的全 局 替 换 命 令 功 能 相 同 。 Repalce-string 命 令 不 能 实 现 正 则 表 达 式 的 替 换 , 如果 你 要 在 替 换 字 符 串 中 使 用 正 则 表 达 式 , 你 必 须 使 用 replace-regexp 命 令 。

查 询 替 换 命 令

ESC % 命 令 是 用 来 执 行 查 询 替 换 操 作 的 。 它 首 先 搜 索 到 与 模 式 匹 配 的 字 符串 , 然 后 在 必 要 时 替 换 该 字 符 串 。 该 命 令 与 Ex 编 辑 器 中 的 替 换 命 令 的 功 能 相同 。 要 执 行 查 询 替 换 命 令 , 首 先 必 须 键 入 ESC % 命 令 , 然 后 键 入 将 要 被 替 换 到的 模 式 , 并 键 入 ENTER 键 , 此 时 , 再 键 入 将 要 替 换 的 字 符 串 并 按 ENTER 键 。完 成 上 述 操 作 之 后 , 与 被 替 换 的 模 式 匹 配 的 第 一 个 字 符 串 被 搜 索 到 , 同 时 出 现几 个 选 项 , 每 个 选 项 都 有 与 之 对 应 的 按 键 。 例 如 , 如 果 你 键 入 y 键 , 搜 索 到 的字 符 串 将 被 替 换 字 符 串 所 替 换 , 同 时 , 光 标 将 位 于 已 被 替 换 掉 的 字 符 串 上 ; 如果 你 键 入 n 键 , 将 取 消 搜 索 到 的 字 符 串 的 替 换 操 作 , 同 时 , 光 标 将 位 于 搜 索 到的 字 符 窜 上 。 其 格 式 如 下 :

ESC % pattern ENTER replacement-text ENTER Query-replace options

查 询 替 换 命 令 的 选 项 见 下 表 :

y

或 者

Spacebar 键

替 换 搜 索 到 的 字 符 串

n

^

!

.

或 者

Del 键

取 消 搜 索 到 的 字 符 串 的 替 换回 到 前 一 个 搜 索 到 的 字 符 串

替 换 所 有 没 有 替 换 的 与 模 式 匹 配 的 字 符 串

替 换 后 退 出

ESC 键 退 出 本 次 查 询 搜 索

下 面 的 命 令 系 列 将 用 yogurt 字 符 串 替 换 文 本 中 的 模 式 m ilk , 然 后 继 续 下 一次 搜 索 。 用 户 可 以 键 入 ESC 键 来 退 出 查 询 搜 索 操 作 。

ESC % mi lk ENTER yogurt ENTER

y

与 其 它 搜 索 命 令 一 样 , 查 询 搜 索 命 令 不 允 许 在 搜 索 模 式 中 使 用 特 殊 字 符 。但 如 果 你 想 使 用 特 殊 字 符 , 你 可 以 使 用 query-replace-regexp 命 令 , 要 运 行 该命 令 , 你 必 须 首 先 键 入 ESC x 命 令 进 入 编 辑 器 的 显 示 域 中 。

在 Emacs 编 辑 器 中 使 用 多 窗 口

Emacs 编 辑 器 中 的 多 窗 口 允 许 你 在 窗 口 内 浏 览 同 一 文 件 的 不 同 部 分 或 同 时浏 览 多 个 文 件 。 一 个 窗 口 命 令 通 常 是 在 CTRL-x 命 令 之 后 指 定 一 个 数 字 , 例 如CTRL-x 2 将 在 编 辑 器 中 重 开 一 个 窗 口 , CTRL-x 0 将 关 闭 当 前 窗 口 。 Emacs 编辑 器 中 的 窗 口 命 令 见 表 18-2 。

如 果 你 同 时 打 开 了 多 个 窗 口 , 那 么 , 光 标 所 在 的 窗 口 称 为 当 前 窗 口 , 也 称为 活 动 窗 口 。 任 何 编 辑 命 令 与 编 辑 操 作 都 是 针 对 于 当 前 活 动 窗 口 的 。 你 可 以 用CTRL-x o 及 CTRL-x p 命 令 切 换 到 另 一 个 窗 口 。 CTRL-x o 将 按 窗 口 打 开 的 次序 在 个 窗 口 之 间 继 续 切 换 , 而 CTRL-x p 命 令 将 切 换 到 前 一 窗 口 。 你 可 以 用CTRL-x 0 命 令 来 关 闭 一 个 窗 口 , 用 CTRL-x 1 命 令 来 关 闭 除 当 前 窗 口 之 外 的 所

有 窗 口 。

当 你 打 开 一 个 新 的 窗 口 的 时 候 , 你 可 以 把 该 窗 口 放 置 在 当 前 窗 口 旁 或 当 前窗 口 下 。 你 可 以 用 CTRL-x 5 命 令 把 当 前 窗 口 沿 水 平 方 向 分 割 成 左 右 两 个 并 排的 窗 口 , 而 用 CTRL-x 2 命 令 把 当 前 窗 口 沿 垂 直 方 向 分 割 成 上 下 两 个 窗 口 。

一 旦 你 打 开 一 个 窗 口 , 你 可 以 使 用 CTRL-x ^ 及 CTRL-x } 命 令 调 整 窗 口 的大 小 , 其 中 , CTRL-x ^ 命 令 将 使 窗 口 沿 垂 直 方 向 增 加 窗 口 的 高 度 , CTRL-x }命令 将 使 窗 口 沿 水 平 方 向 增 加 窗 口 的 宽 度 。

在 文 件 中 移 动 文 本 或 字 符 块 的 时 候 , 窗 口 是 非 常 有 用 的 。 例 如 , 首 先 给 正在 编 辑 的 文 件 重 新 打 开 一 个 窗 口 , 此 时 , 新 的 窗 口 将 显 示 与 原 窗 口 一 样 的 文 本 , 在 新 窗 口 中 , 把 光 标 移 动 到 文 件 的 其 它 地 方 , 并 删 除 文 件 中 要 删 除 的 字 符 块 至kill 缓 冲 区 , 再 切 换 到 另 一 个 窗 口 , 就 把 刚 才 删 除 的 文 本 插 入 到 当 前 窗 口 中 光 标所 在 的 位 置 上 。

缓 冲 区 与 文 件

正 如 前 面 所 提 到 的 那 样 , 当 你 用 任 何 编 辑 器 进 行 文 本 编 辑 的 时 候 , 编 辑 器首 先 读 入 文 件 的 内 容 至 内 存 缓 冲 区 中 。 一 个 内 存 缓 冲 区 实 际 上 是 一 段 用 来 保 存编 辑 文 件 的 内 存 , 你 也 可 以 把 它 理 解 为 一 个 字 符 串 数 组 。 然 后 你 的 任 何 编 辑 与修 改 操 作 都 是 在 这 一 缓 冲 区 中 进 行 的 , 必 要 时 , 你 可 以 把 缓 冲 区 中 的 内 容 保 存到 磁 盘 上 。

Emacs 编 辑 器 的 编 辑 操 作 也 是 如 此 , 即 Emacs 编 辑 器 的 编 辑 与 修 改 操 作都 是 在 缓 冲 区 中 进 行 的 。 你 可 以 使 用 编 辑 缓 冲 区 来 保 存 文 件 或 用 作 其 它 用 途 。你 甚 至 可 以 创 建 增 加 的 缓 冲 区 , 并 在 缓 冲 区 中 保 存 字 符 串 , 如 果 需 要 , 你 也 可以 把 你 创 建 的 缓 冲 区 的 内 容 保 存 到 文 件 中 去 。 而 在 Vi 编 辑 器 中 , 你 只 能 创 建 一个 文 件 编 辑 缓 冲 区 。

文 件 缓 冲 区

当 你 打 开 一 个 文 件 时 , 用 来 保 存 文 件 内 容 的 缓 冲 区 将 被 创 建 。 你 可 以 仅 仅只 创 建 一 个 文 件 缓 冲 区 , 进 行 必 要 的 编 辑 之 后 再 把 编 辑 的 内 容 保 存 到 文 件 中 去 。在 任 何 时 候 , 该 缓 冲 区 将 与 其 编 辑 的 文 本 之 间 建 立 联 系 , 因 此 该 缓 冲 区 称 为 文件 缓 冲 区 。 命 令 系 列 CTRL-x CTRL-f filename 将 打 开 一 个 文 件 并 为 其 创 建 一 个文 件 缓 冲 区 ; 命 令 系 列 CTRL-x CTRL-s 将 保 存 文 件 缓 冲 区 的 内 容 至 文 件 ; 而命 令 系 列 CTRL-x CTRL-c 将 退 出 编 辑 的 文 件 。 文 件 缓 冲 区 的 有 关 命 令 在 表 18-

3 中 列 出 。

你 可 以 同 时 打 开 多 个 文 件 , 每 个 文 件 都 有 其 自 己 的 缓 冲 区 。 要 在 屏 幕 上 同时 显 示 多 个 文 件 ( 即 文 件 缓 冲 区 ) , 你 可 以 用 前 一 节 介 绍 的 窗 口 命 令 来 实 现 。CTRL-x 2 命 令 首 先 创 建 一 个 新 的 窗 口 , 然 后 键 入 命 令 系 列 CTRL-x CTRL-f filename , 以 便 在 新 创 建 的 窗 口 上 显 示 文 件 缓 冲 区 内 容 。 命 令 CTRL-x 4 f filename 也 将 执 行 相 同 的 操 作 : 创 建 一 个 新 的 窗 口 , 并 把 文 件 缓 冲 区 的 内 容 显示 在 窗 口 内 。 Emacs 编 辑 器 有 一 个 特 殊 的 实 用 命 令 称 为 列 目 录 命 令 ( dired

utility ) 。 该 命 令 将 交 互 式 地 列 出 你 当 前 目 录 下 所 有 文 件 的 文 件 名 , 并 允 许 你 选择 相 应 的 文 件 , 以 便 对 该 文 件 进 行 编 辑 、 保 存 甚 至 删 除 等 操 作 。 要 进 入 列 目 录实 用 命 令 , 你 可 以 键 入 CTRL-x d 命 令 。 键 入 该 命 令 后 , 你 当 前 目 录 下 的 一 系列 文 件 将 被 显 示 在 屏 幕 上 。 这 一 系 列 文 件 将 组 成 一 个 文 件 名 列 表 , 该 列 表 如 同一 个 菜 单 , 而 当 前 目 录 中 的 每 一 个 文 件 名 就 是 该 菜 单 的 一 个 菜 单 项 , 你 可 以 在各 个 菜 单 项 之 间 来 回 移 动 , 并 可 以 执 行 各 种 操 作 。

列 目 录 实 用 命 令 ( dired utility) 有 它 自 己 的 一 组 命 令 , 这 一 组 命 令 用 来 在 不同 的 文 件 名 列 表 项 之 间 移 动 或 选 择 文 件 名 列 表 项 。 n 命 令 用 来 下 移 一 个 文 件 列表 项 , 而 p 命 令 用 来 上 移 一 个 文 件 名 列 表 项 , e 命 令 用 来 打 开 当 前 文 件 , 以 便对 该 文 件 进 行 编 辑 与 修 改 。 如 果 被 选 中 的 文 件 名 是 一 个 目 录 , 则 列 目 录 实 用 命令 将 使 用 户 进 入 该 目 录 , 并 显 示 该 目 录 中 的 所 有 文 件 。 字 符 串 ..表 示 当 前 目 录 的父 目 录 , 选 择 该 项 将 回 到 当 前 目 录 的 父 目 录 下 , 并 同 时 显 示 其 父 目 录 中 的 文 件 。

你 也 可 以 保 存 或 删 除 文 件 名 列 表 中 的 文 件 。 移 动 至 一 个 文 件 名 列 表 项 上 , 键 入 s 命 令 标 识 该 文 件 将 被 保 存 ; 移 动 至 一 个 文 件 名 列 表 项 上 , 键 入 d 命 令 标识 该 文 件 将 被 删 除 ( 实 际 上 该 文 件 并 不 会 立 即 被 删 除 , 直 到 你 退 出 列 目 录 实 用命 令 后 才 会 删 除 标 识 了 的 文 件 ) 。 请 记 住 : 你 可 以 用 u 命 令 来 取 消 文 件 的 删 除或 保 存 标 识 。 你 可 以 用 CTRL-x b 命 令 可 以 退 出 列 目 录 实 用 命 令 , 并 回 到 你 先前 编 辑 的 窗 口 ( 即 先 前 编 辑 的 文 件 缓 冲 区 ) 。

独 立 缓 冲 区 ( Unattached Buffers )

使 用 命 令 CTRL-x b , 你 可 以 创 建 一 个 与 任 何 文 件 都 不 相 关 联 的 缓 冲 区 , 也称 为 独 立 缓 冲 区 。 当 你 键 入 CTRL-x b 命 令 , Emacs 编 辑 器 将 立 即 提 示 你 输 入所 创 建 的 缓 冲 区 的 名 字 , 如 果 该 缓 冲 区 并 没 被 创 建 过 , 则 Emacs 编 辑 器 将 创 建这 个 新 的 缓 冲 区 。 你 也 可 以 使 用 CTRL-x b 命 令 转 换 到 指 定 的 缓 冲 区 。 键 入CTRL-x b 命 令 , 并 在 提 示 符 后 键 入 缓 冲 区 名 , 则 你 输 入 的 缓 冲 区 名 中 的 内 容 将被 显 示 在 当 前 窗 口 中 。 因 此 , 通 过 命 令 CTRL-x b, 你 可 以 在 不 同 的 缓 冲 区 之 间来 回 切 换 。 命 令 CTRL-x CTRL-b 将 列 出 所 有 缓 冲 区 的 名 字 。

如 果 你 想 在 新 的 窗 口 上 创 建 一 个 新 的 缓 冲 区 , 你 首 先 必 须 创 建 一 个 新 的 窗口 , 并 切 换 至 该 窗 口 , 再 使 用 CTRL-x b 命 令 来 创 建 一 个 新 的 缓 冲 区 。 你 也 可以 使 用 CTRL-x 4b 命 令 来 同 时 创 建 一 个 新 的 窗 口 与 新 的 缓 冲 区 。 如 果 你 键 入 该命 令 , 一 个 新 的 窗 口 将 被 创 建 , 同 时 , 编 辑 器 将 提 示 你 输 入 创 建 的 缓 冲 区 的 名字 。

图 18-2 显 示 了 三 个 窗 口 , 每 个 窗 口 用 来 编 辑 一 个 缓 冲 区 。 在 这 三 个 缓 冲 区中 , 只 有 一 个 文 件 缓 冲 区 mytex t, 其 它 两 个 缓 冲 区 topics 及 preface 都 是 独 立缓 冲 区 。当 在 mytext 缓 冲 区 进 行 编 辑 的 时 候 ,你 可 以 切 换 到 其 它 窗 口 ,例 如 topics 缓 冲 区 窗 口 或 preface 缓 冲 区 窗 口 , 并 在 这 些 窗 口 中 增 加 新 的 文 本 。 当 你 退 出Emacs 编 辑 器 之 后 , 在 独 立 缓 冲 区 中 保 存 的 内 容 将 丢 失 , 但 是 , 用 户 可 以 把 独立 缓 冲 区 中 的 内 容 拷 贝 到 文 件 缓 冲 区 中 , 或 者 把 独 立 缓 冲 区 中 的 内 容 直 接 保 存到 新 的 文 件 中 去 。

每 个 缓 冲 区 不 必 有 其 独 立 的 窗 口 , 你 同 样 可 以 用 CTRL-x b 命 令 来 在 不 同 的编 辑 缓 冲 区 之 间 进 行 切 换 。 例 如 : CTRL-x b topics 将 使 用 户 切 换 到 topics 编 辑缓 冲 区 。此 外 ,编 辑 器 根 据 缓 冲 区 创 建 的 顺 序 给 予 编 号 ,不 带 任 何 参 数 的 CTRL-x b 命 令 将 按 顺 序 在 缓 冲 区 之 间 进 行 切 换 。

与 前 面 介 绍 的 列 目 录 命 令 一 样 , 用 一 个 特 殊 的 实 用 命 令 可 以 管 理 缓 冲 区 。命 令 buffer-menu 是 一 个 交 互 式 实 用 命 令 , 该 实 用 命 令 将 显 示 所 有 的 缓 冲 区 的名 字 。与 列 目 录 命 令 一 样 ,你 可 以 修 改 、删 除 及 保 存 缓 冲 区 。你 可 以 首 先 用 ESC-x 命 令 进 入 编 辑 器 的 显 示 域 , 然 后 键 入 buffer-menu 命 令 。

第 18 章 Emacs 编 辑 器 - 图2

图 18-2

编 辑 器 帮 助

Emacs 编 辑 器 提 供 几 个 实 用 帮 助 程 序 , 例 如 在 线 帮 助 ( online help ) 与 帮助 指 南 ( tutoria l) 。 你 可 以 键 入 CTRL-h 系 列 命 令 来 访 问 实 用 帮 助 文 件 。 例 如 , 键 入 CTRL-h 命 令 之 后 再 键 入 一 次 CTRL-h 命 令 将 列 出 所 有 可 能 的 帮 助 选 项 , 其 中 有 一 个 特 殊 的 帮 助 就 是 tutoria l。 键 入 CTRL-h t 命 令 将 进 入 在 线 帮 助 指 南

( online tutoria l) , 该 帮 助 可 以 提 供 一 些 特 殊 的 Emacs 编 辑 器 教 程 。 表 18-4

列 出 了 Emacs 编 辑 器 的 部 分 帮 助 命 令 。

XEmacs 编 辑 器

XEmacs 编 辑 器 是 图 形 用 户 界 面 ( GU I) 下 一 个 功 能 更 完 整 、 齐 全 的 Emacs 编 辑 器 , 也 是 一 个 Internet 应 用 程 序 。 你 可 以 通 过 XEmacs 编 辑 器 的 主 快 捷 按钮 来 访 问 Interne t, 包 括 : W eb 浏 览 实 用 程 序 、 mail 实 用 程 序 及 读 取 news 实用 程 序 。 你 可 以 用 以 下 三 种 方 式 启 动 XEmacs 编 辑 器 : 1 ) 在 Goodstuff 工 具 条上 双 击 XEmacs 编 辑 器 的 图 标 来 启 动 XEmacs 编 辑 器 ;2 ) 从 fvwm worksho p( 为一 个 应 用 软 件 与 开 发 环 境 ) 的 菜 单 上 启 动 XEmacs 编 辑 器 ; 3) 直 接 在 Xterm 窗口 的 命 令 提 示 符 上 键 入 xemacs 命 令 来 启 动 XEmacs 编 辑 器 。 在 XEmacs 编 辑器 的 主 窗 口 的 上 部 有 一 组 基 本 的 快 捷 键 图 标 , 这 些 图 标 用 来 执 行 基 本 的 编 辑 操

作 及 运 行 Internet 应 用 程 序 。 XEmacs 编 辑 器 基 本 的 GUI 编 辑 操 作 : 用 可 以 用双 击 鼠 标 来 选 择 文 本 ; 通 过 鼠 标 拖 动 等 操 作 来 完 成 字 符 块 的 删 除 、 拷 贝 与 粘 贴 ; 通 过 滚 动 条 的 移 动 来 滚 动 文 本 。 XEmacs 编 辑 器 的 底 部 是 模 式 行 及 显 示 域 , 这部 分 与 标 准 的 Emacs 编 辑 器 完 全 相 同 。 你 也 可 以 象 在 标 准 的 Emacs 编 辑 器 的显 示 域 一 样 在 XEmacs 编 辑 器 的 显 示 域 上 输 入 键 盘 命 令 。 从 XEmacs 编 辑 器 窗口 顶 部 的 菜 单 上 你 可 以 执 行 大 多 数 的 文 件 、 编 辑 与 缓 冲 区 操 作 。 File ( 文 件 ) 菜单 用 来 管 理 缓 冲 区 、 窗 口 及 Frames , Edit ( 编 辑 ) 菜 单 用 来 处 理 编 辑 操 作 , 如删 除 、 拷 贝 与 粘 贴 , 此 外 还 执 行 字 符 串 搜 索 与 替 换 等 操 作 。 Option 菜 单 允 许 你设 置 编 辑 选 项 与 打 印 选 项 。 在 Apps ( 应 用 程 序 ) 菜 单 上 , 你 可 以 访 问 其 它 应 用程 序 , 例 如 mail , newsread 及 W eb 浏 览 器 等 。 Buffe r( 缓 冲 区 ) 菜 单 将 列 出你 的 缓 冲 区 。 Help ( 帮 助 ) 菜 单 将 列 出 几 个 帮 助 文 件 , 包 括 用 户 常 问 的 问 题

( FAQ s ) 及 相 关 网 页 等 。 Xemacs 编 辑 器 的 菜 单 对 于 一 些 更 复 杂 的 Emacs 操作 是 非 常 有 用 的 , 例 如 为 一 个 文 本 开 辟 多 个 窗 口 、 管 理 文 件 缓 冲 区 及 其 它 类 型的 缓 冲 区 。 当 你 通 过 一 个 菜 单 项 来 执 行 一 个 操 作 的 时 候 , 相 应 的 键 盘 操 作 命 令会 显 示 在 XEmacs 编 辑 器 的 显 示 域 上 。 图 18-3 显 示 的 是 一 个 XEmacs 窗 口 。

第 18 章 Emacs 编 辑 器 - 图3

图 18-3Emacs 编 辑 器

单 击 Mail 图 标 将 开 辟 另 一 个 窗 口 , 在 该 窗 口 中 将 显 示 收 到 的 E-mail , 当 然你 也 可 以 用 它 来 编 辑 文 件 并 把 编 辑 的 文 本 发 给 其 它 用 户 。 你 可 以 单 击 窗 口 上 的compose 、 reply 及 print 等 图 标 来 编 辑 、 回 复 及 打 印 邮 件 。 要 显 示 一 个 mail 的内 容 , 你 可 以 单 击 其 Header , 然 后 键 入 SPACEBAR 键 ( 空 格 键 ) 。 你 可 以 在Folder 菜 单 下 选 择 D isplay Summary 项 来 显 示 每 个 邮 件 的 Heade r。 但 你 在 编辑 一 个 E-mail 的 时 候 ,你 可 以 使 用 XEmacs 编 辑 器 的 所 有 编 辑 命 令 及 所 有 特 性 , 包 括 拼 写 检 查 及 字 符 串 搜 索 与 替 换 。 当 开 辟 一 个 新 的 窗 口 时 , 编 辑 器 将 提 示 你

输 入 收 件 人 的 E-mail 地 址 及 E-mail 的 主 题 ( subject ) 。 该 窗 口 也 具 有 XEmacs 编 辑 器 的 所 有 编 辑 图 标 按 钮 与 菜 单 。 当 你 完 成 了 编 辑 的 E-mail 之 后 , 你 可 以 选择 Ma il 菜 单 的 Send and Exit 菜 单 项 来 发 出 刚 才 编 辑 的 E-mail 。

单 击 News 图 标 按 钮 也 将 开 辟 一 个 新 的 窗 口 , 该 窗 口 将 显 示 XEmacs 的newsreade r( 列 出 你 从 新 闻 组 中 的 收 到 的 新 闻 ) 。 如 果 你 使 用 ISP , 那 么 , 你需 把 NNTPSERVER 变 量 设 置 成 你 的 新 闻 组 服 务 器 。 一 个 简 单 的 启 动 XEmacs 编 辑 器 中 Web 浏 览 器 的 方 法 是 在 Help 菜 单 上 选 择 XEmacs WWW Page 项 。该 W eb 浏 览 器 支 持 标 准 的 Web 浏 览 器 b 浏 览 器 特 性 ,如 bookmarks 等 。但 是 , 你 也 可 以 根 据 你 的 喜 好 选 择 合 适 的 浏 览 器 。 在 Option 菜 单 的 O p e n U æ ith 菜 单项 上 , 你 可 以 选 择 你 的 系 统 中 已 经 安 装 了 的 浏 览 器 , 如 Netscape 及 Lynx 等 。

Emcas 编 辑 器 小 结

Emacs 编 辑 器 是 一 个 面 向 缓 冲 区 (buffer-oriented )的 文 本 编 辑 器 , 你 可 以 象使 用 其 它 常 见 的 文 字 处 理 软 件 一 样 使 用 这 个 编 辑 器 。 键 盘 上 的 所 有 的 键 都 是 输入 键 。 所 有 的 命 令 都 要 使 用 CTRL 键或 meta-keys 键 。 一 个 meta-key 键 可 以是 ALT 键 或 ESC 键 。 Emacs 编 辑 器 编 辑 的 文 本 文 件 是 面 向 字 符 的 , 而 不 是 面向 文 本 行 的 。 你 可 以 以 字 符 、 单 词 、 行 或 段 落 为 单 位 在 文 本 中 移 动 光 标 。

Emacs 编 辑 器 在 delete 与 remove 文 本 之 间 有 较 大 的 区 别 。 delete 是 永 久地 从 文 件 中 删 除 文 本 , 而 remove 则 首 先 将 文 本 删 除 到 缓 冲 区 中 去 , 必 要 时 你

可 以 访 问 这 些 缓 冲 区 。 这 些 缓 冲 区 通 常 称 为 kill 缓 冲 区 , 而 这 些 remove 文 本 的命 令 也 称 为 kill 命 令 。 在 Emacs 编 辑 器 中 , 常 有 一 些 术 语 如 kill 一 个 单 词 或 kill 一 行 , 它 们 指 的 是 将 一 个 单 词 或 文 本 行 删 除 至 kill 缓 冲 区 。必 要 时 , 你 可 以 把 kill 缓 冲 区 的 内 容 插 入 到 文 件 中 去 。 你 可 以 通 过 以 下 方 式 来 移 动 文 本 : 首 先 把 文 本删 除 至 kill 缓 冲 区 , 然 后 把 它 输 入 到 文 件 中 适 当 的 地 方 。

Emacs 编 辑 器 允 许 你 在 屏 幕 上 同 时 打 开 多 个 窗 口 , 在 这 些 窗 口 中 , 你 可 以显 示 多 个 不 同 的 文 件 , 也 可 以 显 示 同 一 文 件 。 你 也 可 以 沿 水 平 或 垂 直 方 向 把 一个 窗 口 分 割 成 多 个 窗 口 , 这 些 窗 口 可 以 用 来 显 示 文 件 的 不 同 部 分 , 并 可 以 把 一个 窗 口 内 的 文 本 删 除 至 kill 缓 冲 区 , 然 后 切 换 并 插 入 到 另 一 个 窗 口 的 文 本 中 完成 字 符 块 的 移 动 。

你 可 以 同 时 打 开 多 个 文 件 , 每 个 文 件 都 有 其 自 己 的 缓 冲 区 。 你 也 可 以 创 建自 己 的 缓 冲 区 , 这 些 缓 冲 区 不 依 赖 于 任 何 的 文 件 。 你 可 以 在 各 个 缓 冲 区 之 间 方便 地 切 换 , 以 便 对 缓 冲 区 进 行 编 辑 。 你 甚 至 可 以 访 问 kill 缓 冲 区 , 并 对 它 们 进行 编 辑 。 buffer-menu 实 用 命 令 提 供 一 个 菜 单 界 面 , 该 菜 单 界 面 会 列 出 所 有 的缓 冲 区 , 你 可 以 非 常 方 便 地 选 择 要 编 辑 的 缓 冲 区 。

你 也 可 以 同 时 在 各 自 的 窗 口 中 显 示 不 同 的 缓 冲 区 。 用 来 保 存 文 件 内 容 的 缓冲 区 称 为 文 件 缓 冲 区 。 当 你 在 屏 幕 上 显 示 多 个 文 件 缓 冲 区 的 时 候 , 实 际 上 是 在屏 幕 上 同 时 显 示 多 个 文 件 的 内 容 。 列 目 录 命 令 实 用 命 令 提 供 给 用 户 一 个 菜 单 界面 , 该 菜 单 将 列 出 你 当 前 目 录 下 的 所 有 文 件 。 你 可 以 在 该 菜 单 界 面 上 打 开 、 保存 或 删 除 指 定 的 文 件 。

表 18-1Emacs 编 辑 器 编 辑 命 令

光 标 移 动 命 令 功 能

CTRL-b 左 移 光 标 一 个 字 符 , 即 向 后

( backward ) 一 个 字 符

CTRL-f 右 移 光 标 一 个 字 符 , 即 向 后

( forward ) 一 个 字 符

CTRL-n 下 移 光 标 一 行 , 即 移 至 下 一 行( Next )

CTRL-p 上 移 光 标 一 行 , 即 移 至 上 一 行

( previous)

CTRL-v 光 标 向 前 ( forward ) 滚 屏

CTRL-z 光 标 向 后 ( backward ) 滚 屏

CTRL-l 光 标 移 动 至 屏 幕 中 央

ESC f 光 标 前 移 ( forward ) 一 个 单 词

ESC b 光 标 后 移 ( backward ) 一 个 单 词

ESC ] 光 标 移 至 下 一 段

ESC [ 光 标 移 至 上 一 段

CTRL-a 光 标 移 动 至 行 首 ( 行 上 第 一 个 非 空 格字 符 )

CTRL-e 光 标 移 动 至 行 尾 ( 行 尾 最 后 一 个 非 空格 字 符 )

续 表

ESC < 光 标 移 动 至 缓 冲 区 头 部 ( 通 常 是 文 件头 部 )

ESC > 光 标 移 动 至 缓 冲 区 尾 部 ( 通 常 是 文 件尾 部 )

ESC num 重 复 执 行 其 后 的 命 令 num 次

ESC x 移 动 至 显 示 域 , 以 便 输 入 一 个 命 令

删 除 ( deletion) 命 令 功 能

DEL 删 除 光 标 前 的 字 符

CTRL-d 删 除 光 标 后 的 字 符

删 除 ( kill) 与 Yanks 命令 功 能

CTRL-k 删 除 ( kill, 下 同 ) 至 行 尾

CTRL-k CTRL-k 删 除 至 行 尾 , 并 同 时 删 除 行 尾 的 换 行字 符

ESC d 删 除 光 标 后 的 单 词

ESC DEL 删 除 光 标 前 的 单 词

ESC k 删 除 至 句 子 结 尾

CTRL-w 删 除 一 个 字 符 块

CTRL-y 插 入 缓 冲 区 内 容 至 文 件

CTRL-x u 取 消 前 一 次 命 令

搜 索 与 替 换 命 令 功 能

续 表

CTRL-s 向 前 ( forward ) 搜 索 文 件 中 与 模 式匹 配 的 字 符 串

CTRL-r 向 后 ( backward ) 搜 索 文 件 中 与 模 式匹 配 的 字 符 串

ESC CTRL-s 向 前 ( forward ) 搜 索 文 件 中 与 正 则表 达 式 匹 配 的 字 符 串

ESC CTRL-r 向 后 ( backward ) 搜 索 文 件 中 与 正 在表 达 式 匹 配 的 字 符 串

replace string 执 行 全 局 替 换

replace regexp 对 正 则 表 达 式 执 行 全 局 替 换

query-replace-regexp 查 询 正 则 表 达 式 , 然 后 再 执 行 替 换 操作

ESC % pattern ENTER

replacement ENTER 查 询 与 模 式 匹 配 的 字 符 串 , 然 后 再 执行 替 换 操 作

SPACEBAR 先 替 换 , 再 移 动 到 下 一匹 配 的 字 符 串

DEL 不 替 换 , 直 接 移 动 至 下 一 匹 配的 字 符 串

ESC 退 出 搜 索 - 替 换 操 作

续 表

.

替 换 后 退 出

!替 换 所 有 没 有 替 换 的 匹 配 字 符 串

^ 移 动 至 前 一 替 换 处

字 符 块 操 作 命 令

功 能 与 效 果

CTRL-@ 或

标 识 一 个 字 符 块

CTRL-SPACEBAR CTRL-x CTRL-x

交 换 光 标 位 置 与 标 识 位 置

ESC H

CTRL-x CTRL-p

把 一 段 落 标 识 为 字 符 块把 一 页 面 标 识 为 字 符 块

CTRL-x h

把 整 个 文 件 缓 冲 区 标 识 为 一 个 字 符 块

文 本 格 式

auto-fill-mode

设 置 覆 盖 模 式 选 项

ESC num CTRL-x f

设 置 右 边 界

ESC q

调 整 一 段 落

ESC q

调 整 一 字 符 块

18-2 Emacs 窗 口 命 令

命 令

功 能

CTRL-x 2

垂 直 方 向 分 割 一 个 窗 口

CTRL-x 5

水 平 方 向 分 割 一 个 窗 口

CTRL-x o

选 择 另 外 一 个 窗 口

续 表

CTRL-x p 选 择 前 一 个 窗 口

ESC CTRL-v 滚 动 当 前 窗 口

CTRL-x 0 关 闭 当 前 窗 口

CTRL-x 1 关 闭 初 当 前 窗 口 外 的 所 有 窗 口

CTRL-x ^ 增 加 窗 口 的 高 度

CTRL-x } 增 加 窗 口 的 宽 度

表 18-3Emacs 文 件 缓 冲 区 与 缓 冲 区 命 令

文 件 缓 冲 区 命 令 功 能

CTRL-x CTRL-f 打 开 并 读 取 一 个 文 件 到 缓 冲 区

CTRL-x CTRL-s 把 缓 冲 区 的 内 容 保 存 到 一 个 文 件 中 去

CTRL-x CTRL-c 退 出 编 辑 器

CTRL-x CTRL-v 关 闭 当 前 的 文 件 , 并 读 取 一 个 新 的 文 件 到 当 前 窗 口

CTRL-x I 把 文 件 的 内 容 插 入 到 一 个 缓 冲 区

CTRL-x CTRL-q 打 开 一 个 只 读 文 件 ( 你 不 能 修 改 它 )

CTRL-x d 进 入 列 目 录 缓 冲 区 。 该 缓 冲 区 列 出 了 当 前 目 录 下 的所 有 文 件 与 子 目 录 , 你 可 以 移 动 到 其 它 的 文 件 或 目录 下 , 也 可 以 显 示 其 它 目 录 中 的 文 件 。 此 外 , 你 还可 以 选 择 并 打 开 一 个 文 件 。

n 移 动 到 下 一 文 件 或 目 录

p 移 动 到 前 一 文 件 或 前 一 目 录

续 表

e 如 果 当 前 光 标 在 一 目 录 上 , 将 进 入 该 目 录 下 。 如果 当 前 光 标 在 一 文 件 上 , 则 打 开 该 文 件 。

s 标 识 一 个 文 件 , 表 明 将 保 存 该 文 件d 标 识 一 个 文 件 , 表 明 将 删 除 该 文 件u 取 消 删 除 文 件 标 识

x 执 行 标 识 的 文 件

缓 冲 区 命 令 功 能

CTRL-x b 切 换 到 另 一 缓 冲 区 。 编 辑 器 将 提 示 你 输 入 要 切 换 的缓 冲 区 的 名 字 ( 要 创 建 一 个 新 的 缓 冲 区 , 输 入 新 的缓 冲 区 的 名 字 即 可 ) 。

CTRL-x k 删 除 一 个 缓 冲 区 ( kill)

CTRL-x CTRL-b 显 示 所 有 的 缓 冲 区 列 表

ESC x buffer-menu 从 缓 冲 区 列 表 中 选 择 一 个 缓 冲 区

d 或 k 标 识 一 个 将 要 删 除 的 缓 冲 区

u 取 消 一 个 缓 冲 区 的 标 识

s 标 识 一 个 将 要 保 存 的 缓 冲 区

x 执 行 标 识 的 缓 冲 区

18-4 Emacs 编 辑 器 帮 助 命 令

帮 助 命 令 功能

CTRL-h CTRL-h 列 出 所 有 的 帮 助 选 项

续 表

CTRL-h I 访问 Emacs 帮 助 手 册 ( manua l)

CTRL-h t 运行 Emacs 编 辑 器 的 帮 助 指 南 tutorial

CTRL-h b 显 示 它 们 代 表 的 按 键 与 命 令