檢視原始碼 Emacs 的 Erlang 模式
對於專為程式設計師設計的編輯器來說,最重要的功能之一可能是根據程式語言的結構縮排程式碼行的能力。Erlang 模式當然也提供此功能。所使用的佈局是基於該語言的常見用法。該模式還提供語法高亮、電動指令、模組名稱驗證、包括段落填滿在內的註解支援、骨架、標籤支援等功能。
在以下描述中,游標位置 一詞表示:「游標位置可以視為游標的位置。更精確地說,游標位置是兩個字元之間的位置,而游標則繪製在游標位置之後的字元之上。」
縮排
以下指令可直接用於縮排。
-
TAB
(erlang-indent-command
) - 縮排目前程式碼行。 -
M-C-\
(indent-region
) - 縮排區域中的所有行。 -
M-l
(indent-for-comment
) - 在該行程式碼(如果有的話)右側插入註解字元。
包含註解的行會根據使用的 % 字元數量進行不同的縮排。
- 具有一個 % 字元的行將縮排到程式碼的右側。欄位由變數
comment-column
指定,預設使用欄位 48。 - 具有兩個 % 字元的行將縮排到與相同情況下程式碼相同的深度。
- 具有三個或更多 % 字元的行將縮排到左邊界。
-
C-c C-q
(erlang-indent-function
) - 縮排目前的 Erlang 函式。 -
M-x erlang-indent-clause RET
- 縮排目前的 Erlang 子句。 -
M-x erlang-indent-current-buffer RET
- 縮排整個緩衝區。
編輯 - 填滿註解
在文字模式下編輯一般文字時,您可以使用 fill-paragraph
指令讓 Emacs 重新格式化文字。此指令不適用於註解,因為它會將註解字元視為文字。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、guards,以及註解中以單引號括起來的單字將會上色。
- 層級 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').
形式的行。它們可以直接使用,但也用作下面描述的完整標頭的一部分。 - 完整標頭:小型(最小需求)、中型(包含模組基本資訊的欄位)和大型標頭(具有一些額外版面配置結構的中型標頭)。
- 小型伺服器 - 不使用 OTP 的簡單伺服器骨架。
- 應用程式 - OTP 應用程式行為的骨架
- 監督程式 - OTP 監督程式行為的骨架
- 監督程式橋接器 - 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
) - 將游標移至下一個錯誤。顯示編譯錯誤的緩衝區將會更新,以使目前的錯誤可見。
手冊
在 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 模式的問題時,請務必提供版本號碼。