おそらくTextモードは、Fundamentalを除いてもっともシンプルなモードです。上述した慣習の多くを説明するために以下にtext-mode.elの抜粋を示します:
;; このモード用に構文テーブルを作成
(defvar text-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?\" ". " st)
(modify-syntax-entry ?\\ ". " st)
;; 'hello'の上でM-c押下により'hello'ではなく'Hello'となるよう'p'を追加
(modify-syntax-entry ?' "w p" st)
...
st)
"Syntax table used while in `text-mode'.")
そして実際にモードコマンドが定義される方法が以下になります:
(define-derived-mode text-mode nil "Text" "人間が読むために記述されたテキストを編集するためのメジャーモード このモードではパラグラフを区切るのはブランク行か空白行だけである したがって適応型フィル(adaptive filling)の全恩恵を受けられる (変数`adaptive-fill-mode'を参照のこと) \\{text-mode-map} Textモードのオンによりノーマルフック`text-mode-hook'が実行される"
(setq-local text-mode-variant t) (setq-local require-final-newline mode-require-final-newline))
3つのLisp用モード(Lispモード、Emacs Lispモード、Lisp Interactionモード)はTextモードより多くの機能をもち、それにふさわしくコードもより複雑です。そのようなモードの記述方法を説明するためにlisp-mode.elの抜粋を示します。
以下はLispモードの構文テーブルとabbrevテーブルを定義する方法です:
;; モード固有のテーブル変数の作成
(define-abbrev-table 'lisp-mode-abbrev-table ()
"Abbrev table for Lisp mode.")
(defvar lisp-mode-syntax-table
(let ((table (make-syntax-table lisp--mode-syntax-table)))
(modify-syntax-entry ?\[ "_ " table)
(modify-syntax-entry ?\] "_ " table)
(modify-syntax-entry ?# "' 14" table)
(modify-syntax-entry ?| "\" 23bn" table)
table)
"`lisp-mode'で使用される構文テーブル")
Lisp用の3つのモードは多くのコードを共有します。たとえばLispモードとEmacs LispモードはLisp Dataモード、Lisp InteractionモードはEmacs Lispモードから派生したモードです。
その中でも特にLisp Dataモードは、Lispコメントを処理するために変数comment-start
をセットアップします:
(setq-local comment-start ";") ...
これらの異なるLisp用モードは、微妙に異なるキーマップをもちます。たとえばLispモードはC-c
C-zをrun-lisp
にバインドしますが、他のLisp用モードはこれを行いません。とはいえすべてのLisp用モードに共通なコマンドがいくつかあります。以下のコードはそれらの共通コマンドをセットアップします:
(defvar-keymap lisp-mode-shared-map :parent prog-mode-map :doc "Keymap for commands shared by all sorts of Lisp modes." "C-M-q" #'indent-sexp "DEL" #'backward-delete-char-untabify)
そして以下がLispモードのためのキーマップをセットアップするコードです:
(defvar-keymap lisp-mode-map :doc "Keymap for ordinary Lisp mode. All commands in `lisp-mode-shared-map' are inherited by this map." :parent lisp-mode-shared-map "C-M-x" #'lisp-eval-defun "C-c C-z" #'run-lisp)
最後はLispモードのためのメジャーモードコマンドです:
(define-derived-mode lisp-mode lisp-data-mode "Lisp" "GNU Emacs Lisp以外のLispコードを編集するためのメジャーモード コマンド: あたかも後方に移動するようにタブをスペースに削除変換する パラグラフ区切りはブランク行でコメント開始はセミコロン \\{lisp-mode-map} `run-lisp'はinferior Lispジョブの開始と既存ジョブ から戻るための両方に使われるかもしれないことに注意"
(setq-local find-tag-default-function 'lisp-find-tag-default) (setq-local comment-start-skip "\\(\\(^\\|[^\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *") (setq imenu-case-fold-search t))