vc-modeを使わずに mode-lineにブランチ情報を表示する

以前カーネル開発で vc-modeを onにしたままやっていたら、バックグラウンドで
ごにょごにょしすぎて、まともに使えるか!!、ってなってそれ以降ずっと offに
していたんですが、さすがにブランチ情報がないと branch切ったときの確認に
手間がかかるなぁってことで、表示するようにしてみました。


CVS, subversionとかもう使わないんで、git対応だけです。
ついでに今リポジトリ内にいない場合もその情報を表示するように
しています。

コード

;; Show Git branch information to mode-line
(let ((cell (or (memq 'mode-line-position mode-line-format)
		(memq 'mode-line-buffer-identification mode-line-format)))
      (newcdr '(:eval (my/update-git-branch-mode-line))))
  (unless (member newcdr mode-line-format)
    (setcdr cell (cons newcdr (cdr cell)))))

(defun my/update-git-branch-mode-line ()
  (let* ((branch (replace-regexp-in-string
                  "[\r\n]+\\'" ""
                  (shell-command-to-string "git symbolic-ref -q HEAD")))
         (mode-line-str (if (string-match "^refs/heads/" branch)
                            (format "[%s]" (substring branch 11))
                          "[Not Repo]")))
    (propertize mode-line-str
                'face '((:foreground "Dark green" :weight bold)))))

イメージ

おわりに

vc-modeを onにして問題なければそうした方がいいでしょう。