Примеры основных режимов
Текстовый режим, пожалуй, самый простой режим помимо основного. Вот выдержки из 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'.")
;; Create the keymap for this mode.
(defvar text-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "\e\t" 'ispell-complete-word)
…
map)
"Keymap for `text-mode'.
Many other modes, such as `mail-mode', `outline-mode' and
`indented-text-mode', inherit all the commands defined in this map.")
Вот как теперь определяется фактическая команда режима:
(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 text-mode-variant t) (setq-local require-final-newline mode-require-final-newline))
Три режима Lisp (режим Lisp, режим Emacs Lisp и режим взаимодействия с Lisp) имеют больше функций, чем режим Текст, и соответствующий код более сложен. Вот выдержки из 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 lisp-mode-shared-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map prog-mode-map)
(define-key map "\e\C-q" 'indent-sexp)
(define-key map "\177" 'backward-delete-char-untabify)
map)
"Keymap for commands shared by all sorts of Lisp modes.")
А вот код для настройки карты клавиш для режима Lisp:
(defvar lisp-mode-map
(let ((map (make-sparse-keymap))
(menu-map (make-sparse-keymap "Lisp")))
(set-keymap-parent map lisp-mode-shared-map)
(define-key map "\e\C-x" 'lisp-eval-defun)
(define-key map "\C-c\C-z" 'run-lisp)
…
map)
"Keymap for ordinary Lisp mode.
All commands in `lisp-mode-shared-map' are inherited by this map.")
И, наконец, вот команда основного режима для режима 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Example-Major-Modes.html