Emacs 菜鸡教程

Minor Mode Example

例子来源于How to Make an Emacs Minor Mode

目的

minor mode的目的是

  • 保存state
  • 自定义功能
  • 绑定特定功能到按键

conventions

  • 使用define-minor-mode定义的mode名字,请以-mode结尾。
  • define-minor-mode会自动创建对应的NAME-hook, NAME-map

Example

;; 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 mode hook

使用add-hook把对应的mode加到mode-hook后面。

(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)

定义变量

变量的作用域当然越小越好,不要干扰其他mode。 (make-variable-buffer-local),(make-local-variable)就是这个目的。 用法参考Elisp Variables

Keymaps

定义keymap对象。参考keybindings