Emacsのminor modeを作る
emacsEmacsのマイナーモードを作る際に調べたことメモ
[2021-12-17 09:32:51]
とりあえず検索:emacs minor mode tutorial
[2021-12-17 09:33:41]
これを読もう。
Creating a new minor mode is really easy, it’s just a matter of understanding Emacs’ conventions.
だそうな。
[2021-12-17 09:34:23]
- 名前は
-modeで終わること - モードを有効/無効にする関数は、↑と同じ名前
- キーマップは、
-mode-mapという名前 - フックは、
-mode-hookという名前
が、convention。そうやね
[2021-12-17 09:37:21]
(define-minor-mode foo-mode
"Get your foos in the right places.")
というマクロがあるらしい。
[2021-12-17 10:48:58]
define-minor-modeにはキーワード引数を渡せる
:lightermodelineに表示される文字列。他のモードに 直接くっつくので、デリミタとして先頭にスペースを1文字入れるのがconvention:keymapこのマイナーモード用のキーマップ。(make-keymap)か(make-sparse-keymap)で作る:globalマイナーモードがグローバルになる
define-minor-modeの残りには、任意のlispコードを書ける。これは、-mode関数を読んだとき(つまり、マイナーモードを有効/無効にするとき)に毎回実行される。
とりあえず、マイナーモード作るには、こんくらい分かってれば良いぽい
[2021-12-17 10:55:40]
autoloadを理解しないとな・・
https://qiita.com/tadsan/items/431899f76f3765892abd#4–autoloadsel
xxx-mode-autloads.elというスクリプトで、xxx-model.elのロードを必要なときまで遅延してくれる。
で、このxxx-mode-autloads.elは、
関数定義や変数定義の上の行に;;;###autoloadと書いてやるだけで、パッケージ管理ツールが適切に自動生成してくれます
らしい。
[2021-12-17 12:09:56]
とりあえず、こんな感じのサンプルコードをでっち上げる。
;;; zetasql-formatter-mode.el --- -*- lexical-binding: t -*-
;; Copyright (C) 2021 Yasunori Horikoshi
;; Author: Yasunori Horikoshi <horikoshi.et.al@gmail.com>
;; Keywords: lisp
;; Version: 0.0.1
;;; Commentary:
;;; Code:
(define-minor-mode zetasql-formatter-mode
"Format query by zetasql-formatter before saving the buffer.")
;;;###autoload
(defun zsfm-format ()
"Format sql in the buffer."
(message "hoge"))
;;;###autoload
(add-hook 'sql-mode-hook
'(lambda ()
(add-hook 'before-save-hook 'zsfm-format nil t)))
(provide 'zetasql-formatter-mode)
;;; zetasql-formatter-mode.el ends here
~/projects/zetasql-formatter-mode/zetasql-formatter-mode.elとして保存。
[2021-12-17 12:06:52]
パッケージ管理ツールに適切に自動生成してもらうには・・M-x package-install-fileで、上のファイルを指定してみる。
すると・・
~/.emacs.d/elpa/zetasql-formatter-mode-0.0.1というディレクトリができる- 中を見てみると・・
zetasql-formatter-mode{.el,.elc,-pkg.el,-autloads.el}ができてる
zetasql-formatter-mode-autoloads.elの中を見てみると・・
(autoload 'zsfm-format "zetasql-formatter-mode" "\
Format sql in the buffer." nil nil)
(add-hook 'sql-mode-hook '(lambda nil (add-hook 'before-save-hook 'zsfm-format nil t)))
こんなコードが書いてある。ふむふむ
zsfm-formatがauto-loadに渡されているadd-hookの内容は、そのまま書いてある
起動時には、このautoloadsファイルが読まれる。するとどうなるかというと、
zsfm-formatが初めて呼ばれたときに、zetasql-format-mode.elcが読まれるように登録されるadd-hookは、そのまま書いてあるので、*.sqlを開いたときに、before-save-hookにzsfm-formatが登録される
つまり、初めて*.sqlファイルを開いて、保存したときに、zetasql-format-mode.elcが読まれるようになるんじゃね