Примеры основных режимов
Режим Text — пожалуй, самый простой режим, если не считать режима Fundamental. Ниже приведены фрагменты из text-mode.el, иллюстрирующие многие из перечисленных выше соглашений:
;; Create the syntax table for this mode.
(defvar text-mode-syntax-table
(let ((st (make-syntax-table)))
(modify-syntax-entry ?\" ". " st)
(modify-syntax-entry ?\\ ". " st)
;; Add 'p' so M-c on 'hello' leads to 'Hello', not 'hello'.
(modify-syntax-entry ?' "w p" st)
...
st)
"Syntax table used while in `text-mode'.")
Вот как сейчас определена сама команда режима:
(define-derived-mode text-mode nil "Text"
"Major mode for editing text written for humans to read.
In this mode, paragraphs are delimited only by blank or white lines.
You can thus get the full benefit of adaptive filling
(see the variable `adaptive-fill-mode').
\\{text-mode-map}
Turning on Text mode runs the normal hook `text-mode-hook'."
(setq-local require-final-newline mode-require-final-newline))
Три режима Lisp (режим Lisp, режим Emacs Lisp и режим взаимодействия с Lisp) обладают большим количеством возможностей, чем режим Text, поэтому их код соответственно сложнее. Ниже приведены фрагменты из lisp-mode.el, иллюстрирующие, как написаны эти режимы.
Вот как определены таблицы синтаксиса и аббревиатур режима Lisp:
;; Create mode-specific table variables.
(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)
"Syntax table used in `lisp-mode'.")
Три режима Lisp используют значительную часть общего кода. Например, режим Lisp и режим Emacs Lisp наследуются от режима данных Lisp, а режим взаимодействия с Lisp наследуется от режима Emacs Lisp.
Среди прочего, режим данных Lisp настраивает переменную comment-start для обработки комментариев Lisp:
(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"
"Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
Commands:
Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs. Semicolons start comments.
\\{lisp-mode-map}
Note that `run-lisp' may be used either to start an inferior Lisp job
or to switch back to an existing one."
(setq-local find-tag-default-function 'lisp-find-tag-default)
(setq-local comment-start-skip
"\\(\\(^\\|[^\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
(setq imenu-case-fold-search t))
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Example-Major-Modes.html