scramble cadenza

技術ネタのガラクタ置き場

magit と elscreen を使いやすく

イントロ

magitelscreen は結構相性悪いと感じることが多く、今まで以下の様な点で困っていた。

  • magit-mode を終了しても magit 用の buffer が消えない
    • なんとなく気持ち悪い
    • 1 つならまだしも、2 ~ 3個残る。
  • elscreen 上で magit buffer を閉じた時、どの buffer が開かれるか、学習できなかった
    • 本当は最後に作業していた buffer を開きたい。
      • 条件によっては、何故か magit 用 buffer がスクリーンに残ったり 、わけがわからない
    • 複数の elscreen 上で magit 動かすと、最後の buffer を全く覚えておらず、不思議な挙動をしているように感じてしまう。

何言っているかわからないと思うが、俺も何が起こってるかわからなかった。

magit + elscreen で運用している人が少ないのか、あまりインターネッツに情報がない。
これはなんとなく magit 使いづらいと感じていた部分を少しだけ直した話になります。

やったこと

以下のような関数作って、フックに追加する。
これで二週間くらい運用して見た限りでは、だいぶストレスがなくなりました。

しかし、magit-status 毎に buffer を新しく生成しているので、PC リソース(というかメモリ)を上手に使えていないはず。

(defun elscreen-kill-all-scratch-screen ()
  "Delete all scratch screen"
  (interactive)
  (dolist (screen-and-buffer (elscreen-get-screen-to-name-alist))
    (when (and (string-match "*scratch*" (cdr screen-and-buffer))
               (> (length (elscreen-get-screen-list)) 1))
      (elscreen-kill (car screen-and-buffer)))))

(defun delete-all-magit-buffers ()
  "Delete all *magit-xxx* buffer"
  (interactive)
  (dolist (buffer (buffer-list))
    (when (string-match "*magit" (buffer-name buffer))
      (kill-buffer buffer))))

(defun magit-mode-quit-window ()
  "Restores the previous window configuration and kills the magit buffer"
  (interactive)
  (delete-all-magit-buffers)
  (elscreen-kill-all-scratch-screen)
  (jump-to-register :magit-fullscreen))

(define-key magit-status-mode-map (kbd "q") 'magit-mode-quit-window)

(defun with-editor-post-finish-hook-1 ()
  (delete-all-magit-buffers)
  (elscreen-kill-all-scratch-screen))

(defun with-editor-post-cancel-hook-1 ()
  (delete-all-magit-buffers)
  (elscreen-kill-all-scratch-screen))