查看源代码 Emacs 的 Erlang 模式

对于为程序员设计的编辑器来说,最重要的功能可能就是能够根据编程语言的结构缩进代码行。Erlang 模式当然提供了此功能。所使用的布局基于该语言的常用用法。该模式还提供诸如语法高亮、电动命令、模块名称验证、包括段落填充的注释支持、框架、标签支持等功能。

在以下描述中, 一词的使用含义是:“点可以看作是光标的位置。更准确地说,点是两个字符之间的位置,而光标绘制在点后面的字符上”。

缩进

以下命令可直接用于缩进。

  • TAB (erlang-indent-command) - 缩进当前代码行。
  • M-C-\ (indent-region) - 缩进区域中的所有行。
  • M-l (indent-for-comment) - 在行上代码的右侧(如果有)插入注释字符。

包含注释的行根据所使用的 % 字符的数量以不同的方式缩进

  • 带有 1 个 % 字符的行缩进到代码的右侧。该列由变量 comment-column 指定,默认情况下使用第 48 列。
  • 带有 2 个 % 字符的行将缩进到与在相同情况下代码相同的深度。
  • 带有 3 个或更多 % 字符的行缩进到左边距。
  • C-c C-q (erlang-indent-function) - 缩进当前 Erlang 函数。
  • M-x erlang-indent-clause RET - 缩进当前 Erlang 子句。
  • M-x erlang-indent-current-buffer RET - 缩进整个缓冲区。

编辑 - 填充注释

在文本模式下编辑普通文本时,您可以让 Emacs 通过 fill-paragraph 命令重新格式化文本。此命令不适用于注释,因为它会将注释字符视为单词。Erlang 编辑模式提供一个了解 Erlang 注释结构的命令,可用于填充注释中的文本段落。例如

%% This is   just a very simple test to show
%% how the Erlang fill
%% paragraph   command works.

显然,文本格式很差。与其逐行格式化此段落,不如尝试按 M-q 按下 erlang-fill-paragraph。结果是

%% This is just a very simple test to show how the Erlang fill
%% paragraph command works.

编辑 - 注释/取消注释区域

C-c C-c 将在标记区域中所有行的开头放置注释字符。如果您想要两个而不是一个注释字符,您可以执行 C-u 2 C-c C-c

C-c C-u 将撤消注释区域命令。

编辑 - 移动点

  • M-C-a (erlang-beginning-of-function) - 将点移动到当前或前一个 Erlang 函数的开头。使用数字参数(例如 C-u 2 M-C-a),该函数会向后跳过多个 Erlang 函数。如果参数为负数,则点将移动到当前函数下方的函数的开头。
  • C-c M-a (erlang-beginning-of-clause) - 与上面相同,但将点移动到当前或前一个 Erlang 子句的开头。
  • M-C-e (erlang-end-of-function) - 移动到当前或以下 Erlang 函数的末尾。使用数字参数(例如 C-u 2 M-C-e),该函数会向后跳过多个 Erlang 函数。如果参数为负数,则点将移动到当前函数下方的函数的末尾。
  • C-c M-e (erlang-end-of-clause) - 与上面相同,但将点移动到当前或以下 Erlang 子句的末尾。

编辑 - 标记

  • M-C-h (erlang-mark-function) - 将区域放在当前 Erlang 函数周围。点放置在开头,标记放置在函数的末尾。
  • C-c M-h (erlang-mark-clause) 将区域放在当前 Erlang 子句周围。点放置在开头,标记放置在函数的末尾。

编辑 - 函数头命令

  • C-c C-j (erlang-generate-new-clause) - 在当前 Erlang 函数中创建一个新子句。点放置在参数列表的括号之间。
  • C-c C-y (erlang-clone-arguments) - 复制前一个 Erlang 子句的函数参数。当定义与前一个参数几乎相同的新子句时,此命令很有用。

编辑 - 对齐

  • C-c C-a (align-current) - 对齐光标周围的注释、箭头、赋值和类型注释。
Example:

sum(L) -> sum(L, 0).
sum([H|T], Sum) -> sum(T, Sum + H);  % recurse
sum([], Sum) -> Sum.   % base case

-record { two :: int(), % hello
          three = hello :: string(),    % there
          four = 42 :: int() }.

becomes:

sum(L) -> sum(L, 0).
sum([H|T], Sum) -> sum(T, Sum + H); % recurse
sum([], Sum)    -> Sum.             % base case

-record { two           :: int(),    % hello
          three = hello :: string(), % there
          four  = 42    :: int() }.

语法高亮

可以从 Erlang 菜单激活语法高亮。有四种不同的选择

  • 关闭:正常的黑白显示。
  • 级别 1:函数头、保留字、注释、字符串、带引号的原子和字符常量将着色。
  • 级别 2:上述、属性、Erlang bif、保护和用单引号括起来的注释中的单词将着色。
  • 级别 3:上述、变量、记录和宏将着色。(此级别也称为圣诞树级别。)

标签

为了使标签命令工作,它需要您生成一个标签文件。请参阅 Erlang 模式用户指南

  • M-. (find-tag) - 查找函数定义。默认值是点下的函数名称。
  • 查找标签 (erlang-find-tag) - 类似于 Elisp 函数 find-tag'。能够检索 Erlang 模块。标签可以采用tag'、module:、`module:tag' 形式给出。
  • M-+ (erlang-find-next-tag) - 查找标签的下一个出现位置。
  • M-TAB (erlang-complete-tag) - 对标签搜索中输入的标签执行补全。补全为当前标签表中列出的名称集。
  • 标签 apropos (tags-apropos) - 显示标签表中 REGEXP 匹配的所有标签的列表。
  • C-x t s (tags-search) - 在标签表中列出的所有文件中搜索与 REGEXP 匹配的内容。找到匹配项时停止。

框架

框架是一段预先编写的代码,可以插入到缓冲区中。Erlang 模式附带一组预定义的框架。可以从 Erlang 菜单或从名为 tempo-template-erlang-* 的命令访问框架,因为框架是使用标准 Emacs 包“tempo”定义的。以下是可用框架的简要说明

  • 简单框架:If、Case、Receive、Receive After、Receive Loop - 基本代码结构。
  • 标头元素:Module、Author - 这些命令插入 -module('xxx').-author('my@home'). 形式的行。它们可以直接使用,但也用作下面描述的完整标头的一部分。
  • 完整标头:Small(最低要求)、Medium(包含有关模块基本信息的字段)和 Large Header(具有一些额外布局结构的中等标头)。
  • Small Server - 用于不使用 OTP 的简单服务器的框架。
  • Application - 用于 OTP 应用程序行为的框架
  • Supervisor - 用于 OTP 监督器行为的框架
  • Supervisor Bridge - 用于 OTP 监督器桥接行为的框架
  • gen_server - 用于 OTP gen_server 行为的框架
  • gen_event - 用于 OTP gen_event 行为的框架
  • gen_fsm - 用于 OTP gen_fsm 行为的框架
  • gen_statem (StateName/3) - 用于使用状态名称函数的 OTP gen_statem 行为的框架
  • gen_statem (handle_event/4) - 用于使用一个状态函数的 OTP gen_statem 行为的框架
  • 库模块 - 用于不实现进程的模块的框架。
  • Corba 回调 - 用于 Corba 回调模块的框架。
  • Erlang 测试套件 - 用于 erlang 测试服务器的回调模块的框架。

Shell

  • 新 shell (erlang-shell) - 启动新的 Erlang shell。
  • C-c C-z, (erlang-shell-display) - 显示 Erlang shell,如果没有启动任何 shell,则启动一个新的 shell。

编译

  • C-c C-k, (erlang-compile) - 编译当前缓冲区中的 Erlang 模块。您还可以使用 C-u C-c C-k 通过调试选项 debug_infoexport_all 调试编译该模块。
  • C-c C-l, (erlang-compile-display) - 显示编译输出。
  • C-u C-x` 从头开始解析编译器输出。此命令会将点放置在找到第一个错误的行上。
  • C-x` (erlang-next-error) - 将点移动到下一个错误。将更新显示编译错误的缓冲区,以便当前错误可见。

Man

在 unix 上,您可以在 emacs 中查看手册页。为了找到手册页,变量 erlang-root-dir 应绑定到包含 Erlang 安装的目录的名称。该名称不应包含最后的斜杠。实际上,您应该在 ~/.emacs 中添加以下形式的行,

(setq erlang-root-dir "/the/erlang/root/dir/goes/here")

启动 IMenu

  • M-x imenu-add-to-menubar RET - 此命令将创建一个 IMenu 菜单,其中包含当前缓冲区中的所有函数。该命令将询问您菜单的合适名称。Xemacs 不支持此功能。

版本

  • M-x erlang-version RET - 此命令显示 Erlang 编辑模式的版本号。在询问有关 Erlang 模式的问题时,请务必提供版本号。