查看源代码 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_info
和export_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 模式的问题时,请务必提供版本号。