git-gutter: GitGutterの Emacs版

Author: syohex
Published: 2013-03-17
Last Modified: 2020-06-05
GitHub Source: md

概要

git-gutter.elは Sublime Textの GitGutterの Emacs版です. 導入することで前回の変更点からの差分を視覚的に確認することができるようになります.

スクリーンショット

screenshot1

インストール方法

git-gutter.elは MELPAに登録されているので, Emacs24以降を利用している場合は, package.elを使って簡単にインストールすることができます. また el-getのレシピとしても登録されているので, レシピを自分で書くことなく, インストールすることができます.

M-x package-refresh-contents
M-x package-install git-gutter

手動でのインストールは推奨しませんが, 単一ファイルの構成なのでインストールは容易に行うことが できます.

必要要件

  • Emacs 23以降
  • Git 1.7.0以降

設定

以下は package.elもしくは el-getでインストールした場合を想定しています. 手動でインストールした場合は, load-pathの設定及び git-gutter.elのロードを行う必要があります.

global-minor-mode

git-gutter.elが提供するグローバルマイナーモード(global-git-gutter-mode)を有効にすると, git管理下のファイルについてすべて git-gutter-modeを有効にします. git管理下のファイルに ついて常時利用するという場合は, グローバルマイナーモードを有効にするのが良いでしょう.

グローバルマイナーモードを有効にするには, 設定ファイルに以下を追加します.

(global-git-gutter-mode t)

minor-mode

あまりないと思いますが, 特定のモードで git-gutterを有効にしたい場合は, 該当するモードの hookに git-gutter-modeを追加してください.

(add-hook 'ruby-mode-hook 'git-gutter-mode)
(add-hook 'python-mode-hook 'git-gutter-mode)

更新のタイミング

差分情報の表示が更新されるのは以下のタイミングです.

  • after-save-hook
  • after-revert-hook
  • window-configuration-change-hook

定期的に更新したい方は, auto-save-buffersなどと併用すると良いでしょう. またバッファ切替時に更新されるので, magitと相性が良いです. magitの操作を 行った後, 元のバッファに戻ることで差分情報が更新されます.

git-gutter.elの動作が重く感じられるとき

デフォルトでは, 期待通りに差分情報の表示が更新されるように, かなりの頻度で git diffコマンドが 実行されます. そのため, Linuxカーネル等の大規模なソースツリー下においては, 動作が重く感じる ことがあると思います. 現状 windowの更新を行うと必ず呼ばれるので, 画面をたくさんの windowに 分割している場合は特にそう感じると思います.

更新頻度を下げる

window-configuration-change-hook経由で更新関数が呼ばれることが多いので, これを更新ポイントから除去することで大幅に git diffが呼ばれる回数が減ります. window-configuration-change-hookを除去する場合は以下を設定ファイルに 追加してください. 表示されるものが意図したものと違う場合は手動で M-x git-gutterを 実行してみてください

(setq git-gutter:update-hooks '(after-save-hook after-revert-hook))

git-gutter:update-hooksには好きな hookが登録できるので, さらに 除去することや別途追加することも可能です.

git-gutter-modeを利用しない

自動でなく, 更新して欲しいと思ったタイミングで git-gutterを実行するという スタイルにすることで, git diffの呼び出しを最少化できます.

各種コマンド

git-gutter

差分情報を更新します. git-gutter-modeを有効にしている場合は不要です.

git-gutter:next-hunk

次の差分があるブロックに移動します. 現在が最後の差分ブロックの場合は, 先頭の差分ブロックに移動します. prefix argumentを使うことで, 指定した数だけ移動します.

git-gutter:previous-hunk

前の差分ブロックに移動します. git-gutter:next-hunkの逆方向版です.

git-gutter:popup-hunk

現在の差分ブロックの内容をポップアップ(pop-to-buffer)します. 元のコードと現在のコードの 差を見たい場合に利用します.

git-gutter:popup-hunkでバッファをポップアップした状態で, git-gutter:next-hunk, git-gutter:previous-hunkを実行するとポップアップされた バッファの内容も連動して更新されます.

git-gutter:revert-hunk

現在の差分ブロックの修正を更新前の状態に戻します. 間違って戻してしまった場合でも undoを利用することで取り消せます.

git-gutter:toggle

差分情報の表示/非表示を切り替えます.

カスタマイズ

表示する文字, 色の変更

概要記号face
追加git-gutter:added-sign(Default '+') git-gutter:added
削除git-gutter:deleted-sign(Default '-') git-gutter:deletedline
変更git-gutter:modified-sign(Default '=')git-gutter:modified

以下はその設定例となります. 文字数に特に制限はありません.

(setq git-gutter:added-sign "++")
(setq git-gutter:deleted-sign-sign "--")
(setq git-gutter:modified-sign "  ") ;; 空白 2つ
(set-face-foreground 'git-gutter:added  "green")
(set-face-foreground 'git-gutter:deleted  "yellow")
(set-face-background 'git-gutter:modified "magenta")

全角幅文字の設定

全角幅文字を記号として使う場合, git-gutter:window-widthで明示的に幅を指定することを 推奨します. 一部全角幅の文字は Emacsの持つ関数で計算できるのですが, 多くの文字では 計算を誤ってしまうためです. 全角幅文字を signとして指定する例を以下に示します.

(setq git-gutter:window-width 2)
(setq git-gutter:modified-sign "⇔")
(setq git-gutter:added-sign "⇒")
(setq git-gutter:deleted-sign "⇐")

そのときのスクリーンショットは以下のようになります.

screenshot1

linum-modeと併用について

git-gutter.elは linum-modeと同じ方法を使って差分情報を表示しているので, linum-modeと併用することが現状出来ません. linum-modeと併用したい, と 考えられている方には git-gutter-fringeがあります. git-gutter-fringe.elはフリンジに表示する以外は git-gutter.elと同様です. カスタマイズ性がやや低いですが, linum-modeとは干渉しないので, 併用して 利用することができます.

質問, バグレポートについて

質問, バグレポート, 要望等については githubの issuesまでにお願いします.