Magit でコメントの履歴を便利に使う (後編)

Magit の小ネタ、後編です。前編はこちら

前回はコメントの履歴を session.el で恒久化しました。今回は、もう少し履歴を使い易くしたいと思います。

vc.el や Magit のコメント入力ウィンドウでの M-p / M-n による履歴呼び出しは確かに便利ですが、入力中のコメント全体が履歴で上書きされてしまう点が、ちょっと残念だと思います。特に Magit の場合は、コメントの中に Magit 用のヘッダ ("Commit-All: yes" など) も含まれているため、その不便さが特に気になります。大抵、そこは再利用したくないですよね。

そこで、過去のコメントを上書きするのではなくポイントに挿入するようにして、かつ Magit のヘッダは無視するようにしてみましょう。インターフェイスとしては anything.el を利用します。(anything.el の設定は割愛します。)

;;;
;;; 過去に入力したコメントを anything で選択できるようにする
;;;

(defvar anything-c-source-log-edit-comment
  '((name . "Log-edit Comment")
    (candidates . anything-c-log-edit-comment-candidates)
    (action . (("Insert" . (lambda (str) (insert str)))))
    (migemo)
    (multiline))
  "Source for browse and insert Log-edit comment.")

(defun anything-c-log-edit-comment-candidates ()
  (loop for comment in (ring-elements log-edit-comment-ring)
        ;; コメントから Magit のヘッダ部分を除去
        collect (if (string-match ".*-- End of Magit header --\n" comment)
                    (setq comment (substring comment (match-end 0)))
                  comment)))

(defun anything-show-log-edit-comment ()
  "`anything' for Log-edit comment."
  (interactive)
  (anything-other-buffer 'anything-c-source-log-edit-comment
                         "*anything log-edit comment*"))

;; Magit のコメント入力時に C-M-p で anything によるコメント選択起動
(define-key magit-log-edit-mode-map (kbd "C-M-p") 'anything-show-log-edit-comment)

上のプログラムでは、 Magit のコメント入力画面でのみ C-M-p でコメント選択用の anything インターフェイスを起動していますが、キーバインドは自分の好みに合わせてください。 vc.el で使いたい場合は、そちらのキーマップに割り当てるか、グローバルなバインディングとしてしまえばいいと思います。

動作確認環境は以下の通りです。

その他…

ここまでやって、大体満足の行くものになりました。Tortoise 某の便利さに近いです。最近の Tortoise 某では、実際にコミットを行わなかった時の履歴も残しますよね。確かに、コメントまで書いてからコミット前に不備に気づいて一旦中断するということも結構あるので (特にやり直しのきかない Subversion の時)、あったら便利そうです。 Magit でそうすることも割とすぐにできるのですが、今回はやっていません。やっぱり欲しいとなったら追記しようかと思います。