檢視原始碼 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_infoexport_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 模式的問題時,請務必提供版本號碼。