Emacsのマイナーモードを作る際に調べたことメモ

[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にはキーワード引数を渡せる

  • :lighter modelineに表示される文字列。他のモードに 直接くっつくので、デリミタとして先頭にスペースを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で、上のファイルを指定してみる。 すると・・

  1. ~/.emacs.d/elpa/zetasql-formatter-mode-0.0.1というディレクトリができる
  2. 中を見てみると・・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)))

こんなコードが書いてある。ふむふむ

  1. zsfm-formatauto-loadに渡されている
  2. add-hookの内容は、そのまま書いてある

起動時には、このautoloadsファイルが読まれる。するとどうなるかというと、

  1. zsfm-formatが初めて呼ばれたときに、zetasql-format-mode.elcが読まれるように登録される
  2. add-hookは、そのまま書いてあるので、*.sqlを開いたときに、before-save-hookzsfm-formatが登録される

つまり、初めて*.sqlファイルを開いて、保存したときに、zetasql-format-mode.elcが読まれるようになるんじゃね