パッケージと名前のプレフィックス

xyzzy の拡張 lisp では「<拡張の名前>-<コマンド名>」みたいな名前をつける習慣がある。たとえば complete+-select-prev-item みたいな。たぶん package system の無い emacs での習慣をそのまま持ってきたんだと思う。

これは拡張ごとに package 作っちゃって「<拡張の名前>:<コマンド名>」にした方がすっきりするんじゃないかというお話。

以下、"extension" という名前の拡張があるものとして。

想定、あるいは私案

  • 拡張 lisp "extension" で package "extension" を作って使う
  • コマンドや設定用変数は export する
  • user package から extension package を use-package しない
    • つまり設定なんかは (setq extension:*config-var* ...) と書く
    • M-x extension:command で実行する*1

ウマーなところ

  • extension.l では (defun command ...) とか書ける(全部に prefix つけんでいい)
  • 他の拡張から use せずに特定の関数だけ使いたいとかいう場合に、extension:extension-useful-function とかまどろっこしいことしなくていい
  • major mode がみんなそうなったら、hoge-mode:newline-and-indent とか hoge-mode:*keymap* とか共通化(?)できそう
;;; foo-mode と bar-mode と baz-mode 全部の hook に何か突っ込む
(dolist (mode (mapcar #'find-package '(:foo :bar :baz)))
  (add-hook (intern "*start-hook*" mode) ...))

;;; 現状でもこれで 大抵は 上手くいく
(dolist (mode '("foo" "bar" "baz"))
  (add-hook (intern (concat "*" mode "-hook*")
                    (symbol-package
                     (find-symbol (concat mode "-mode") "user")))
            ...))

マズーなところ

  • package をいちいち定義せにゃならん
  • package system を理解してないと、上手くアクセスできないことがありそう
  • コマンドの補完(complete+)がそのままだと微妙かも
  • editor のコマンド類は use されてるので、一貫性が無くなる
  • ac-mode の補完がそのままだと微妙かも
  • prefix なしのコマンドというのが、user package 内でしか定義できない
    • user package にそのコマンドだけ import するという手はある
  • emacs と違う
  • 既存の拡張はそんな風になってないので、拡張で定義した package を user から use するものとしないものが混在するハメになっていちいち調べるのめんどい
  • export してない symbol は触って欲しくないもの と考えると、extension:touch-me と extension::dont-touch-me の違いは小さすぎるかも
  • package を指定するのは大抵 (find-package "extension") とかしなきゃならなん
  • typo するとコメントになってしまう
  • major mode の package name が "extension-mode" として、その major mode 自体のコマンド名は・・・
    • user::extension-mode を定義する
    • extension-mode:extension-mode を user package に import する
  • editor package でいいや って程度のものはどうしろと?

*1:補完候補に出てこないからできないのかと思ったけど、":" が出てくるまでは補完候補として出てこないだけだった