例子来源于How to Make an Emacs Minor Mode
minor mode的目的是
define-minor-mode
定义的mode名字,请以-mode
结尾。define-minor-mode
会自动创建对应的NAME-hook
, NAME-map
;; minor mode
(make-variable-buffer-local
(defvar bo-count 0
"Number of bo inserted into the current buffer"))
(defun insert-bo ()
(interactive)
(setq bo-count (1+ bo-count))
(insert "bo"))
;; define-minor-mode 提供了几个构造参数
;; `:lighter' 在mode line显示的名称。在名字前空一格。
;; `:keymap' 模式的keymap
;; `:global' 这选项只有极少数minor mode会使用,比如YASnippet
(define-minor-mode bo-mode
"Get your bos in the right place"
:lighter " bo"
;; (make-sparse-keymap) 创建keymap
:keymap (let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c f") 'insert-bo)
map)
(make-local-variable 'bo-count))
;; ### autoload
(add-hook 'text-mode-hook 'bo-mode)
(provide 'bo-mode)
使用add-hook
把对应的mode加到mode-hook后面。
(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
变量的作用域当然越小越好,不要干扰其他mode。
(make-variable-buffer-local)
,(make-local-variable)
就是这个目的。
用法参考Elisp Variables
定义keymap对象。参考keybindings