org-multiple-keymap.el v0.2 をリリースしました


先日公開しました org-multiple-keymap.el、個人的には大変便利に使わせていただいております。

MELPA のダウンロード数などを見ましても、爆発的ヒット作とは程遠い感じですが、るびきちさんにもレビューいただき大変ありがたい限りです。

emacs org-multiple-keymap.el : org-modeで特定のカーソル位置で操作を簡単にする | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

あれから、いろいろと変更を加えましたので、ご紹介しておきます。

新しく作った要素にもキーマップが適用されるようになりました。

この問題はるびきちさんのレビューでも指摘されていた点ですが、 after-change-functions というフックポイントに更新関数をひっかけることによって 自動でキーマップが適用されるようになりました。

eieioによる構造化

中身を eieio を使って全面的に書き直しました。アクセッサーなど共通部分をスーパークラスとして、その下にtimestampなどの各要素を単位としたクラスを生成しています。 こんなに短いコードで果して eieio を使う必要があったのかというと、あまりない気もしますが見通しはとても良くなったと思います。

情報源による拡張

eieioにより構造化されたことで、機能の拡張が容易になりました。auto-completeやHelmのように情報源を定義することで独自に要素とキーマップを紐づけることができます。

使用する情報源は、 org-mukey-source-list というリストにより管理されていますので、 新しく作ったクラスを追加することで org-multiple-keymap-minor-mode が有効になる際にインスタンスが生成され、キーマップが有効となります。

例えば、 org-mukey-source-hoge というクラス定義を新たに作ったのであれば、以下のように書くと良いでしょう。Org-modeの使い方は千差万別だと思いますので、新しい情報源を定義するなり、使用する情報源を変えるなり、使いやすいようにカスタマイズしてもらえれば幸いです。

(push org-mukey-source-hoge org-mukey-source-list)

情報源の定義には、新しいクラスを定義して各スロットに必要な情報を与えることになります。以下は、timestamp sourceのクラス定義です。

(defclass org-mukey-source-timestamp (org-mukey-source)
((region :initform 'org-mukey-make-timestamp-alist)
 (keymap :initform org-mukey-timestamp-map)
 (parse-function :initform 'org-mukey-timestamp-refresh)))

各スロットは、以下のとおり。

region スロット

キーマップを適用するポイントの値からなる連想リストを返す関数を格納します。carが先頭、cdrが末尾となります。

keymap スロット

使いたいキーマップを格納します。

parse-function スロット

新たにできた要素を判定して、キーマップを適用させる関数を格納します。

新たな要素の追加

これまで、キーマップが適用される要素はtimestampとpriorityの二つだけでしたが、新たにheadingも追加しました。見出しの先頭にあるアスタリスクでキーマップが適用されます。キーマップは次のとおりです。

key command
a org-archive-subtree
b org-do-promote
d org-mukey-todo-done
f org-do-demote
n org-next-visible-heading
p org-previous-visible-heading
u outline-up-heading