9

git-gutterバージョン管理されたファイルに加えた変更を視覚化したりmagit、ステージング/コミット/差分などに使用します.

プロジェクトに取り組んでいるとき、私は通常、magit-status常にウィンドウを開いたままにします。私が抱えている問題は、バッファー内の変更をステージングまたはステージング解除しmagit-statusてから、ステータスを更新したばかりのファイルを表示するウィンドウに戻ると、によって生成されたフリンジ注釈が git-gutter 自動的に調整されないことです。(更新をトリガーするための私の現在の回避策は、ヒットしてからファイルを保存することですが、あまり効率的ではありません。SPC Backspace)C-x C-s

私は見て、確かに、それはに設定されているgit-gutter.elと呼ばれるカスタマイズ可能な変数を提供しますgit-gutter:update-hooks

(after-save-hook after-revert-hook window-configuration-change-hook)

デフォルトで。したがって、このリストに正しいフックを追加するだけで十分です。ウィンドウを切り替えるときに実行されるフックの名前は何ですか? Elisp マニュアルのさまざまなセクションを調べましたが、探しているものを見つけることができませんでした。または、magit変更のステージングまたはアンステージング時に実行されるフックを提供しますか?


編集

同様の問題に直面しているためにこれを読んでいる場合: 以下で得た答えは両方とも有効な解決策です! の新しいバージョンのmagit場合、@lunaryorn のソリューションは短くて便利です。@Jordon Biondo のソリューションでは、もう少しカスタム コードを追加する必要がありますが、カスタム フックを作成して既存の機能に挿入するための一般化可能な (!) アドバイスが付属しています。したがって、私は1つの答えしか受け入れることができないため、両方のポスターに賛成票を投じてSOカルマをブーストしてください:)

4

3 に答える 3

8

編集最新バージョンのmagitとgit-gutterを使用すると、これにはそれほど多くの構成は必要なくなります。より最新でシンプルなソリューションについては、lunaryornsの回答を参照してください。


元の回答:

必要以上にリフレッシュすることになるため、ウィンドウを切り替える方法は少しやり過ぎかもしれません。

Magit はステージ前/ステージ後/ステージ解除フックを提供していませんが、アドバイスを使用して独自のフックを作成できます!

stage フックと unstage フックに 2 つの変数を定義できます。

(defvar my-magit-after-stage-hooks nil
  "Hooks to be run after staging one item in magit.")

(defvar my-magit-after-unstage-hooks nil
  "Hooks to be run after unstaging one item in magit.")

フックを実行するための素敵なラッパー関数があります:関数のアドバイスrun-hooksを使用して、カスタム フックを後で実行します。magit-stage-itemmagit-unstage-item

(defadvice magit-stage-item (after run-my-after-stage-hooks activate)
  "Run `my-magit-after-stage-hooks` after staging an item in magit."
  (when (called-interactively-p 'interactive)
    (run-hooks 'my-magit-after-stage-hooks)))

(defadvice magit-unstage-item (after run-my-after-unstage-hooks activate)
  "Run `my-magit-after-unstage-hooks` after unstaging an item in magit."
  (when (called-interactively-p 'interactive)
    (run-hooks 'my-magit-after-unstage-hooks)))

私たちのフックでは、すべてのバッファを反復処理し、必要に応じて git-gutter を更新できます。これは、ステージングされているものとステージングされていないものがわからないためです。したがって、git-gutter-mode を実行しているすべての可視バッファの git-gutter 表示を更新するだけです。(すべての git-gutter バッファーを実行したい場合は、get-buffer-window呼び出しを削除してください。)

(defun my-refresh-visible-git-gutter-buffers ()
  "Refresh git-gutter-mode on all visible git-gutter-mode buffers."
  (dolist (buff (buffer-list))
    (with-current-buffer buff
      (when (and git-gutter-mode (get-buffer-window buff))
        (git-gutter-mode t)))))

最後に、フック関数をカスタム フックに追加するだけです。

(add-hook 'my-magit-after-unstage-hooks
          'my-refresh-visible-git-gutter-buffers)
(add-hook 'my-magit-after-stage-hooks
          'my-refresh-visible-git-gutter-buffers)

理想的には、どのファイルがステージング/ステージング解除されたかを知り、それらのバッファーのみをリフレッシュします。より深い magit 関数でアドバイスを回避し、操作している magit ステータス バッファー アイテムの名前を取得し、それのみをリフレッシュできる場合です。しかし、これは良いスタートです!

自動 git gitter リフレッシュ

于 2014-04-28T19:41:20.030 に答える
6

これは私が current で行う必要があることですmagit:

(add-hook 'magit-post-refresh-hook
          #'git-gutter:update-all-windows)
于 2016-07-01T20:35:28.843 に答える
3

現在のバージョンの magitは「magit-revert-buffer-hook」を使用していないことに注意してください。そのため、lunaryorn のソリューションは機能しない可能性があります。

の git-gutter update フック機能を追加できます。magit-after-revert-hookこれmagit-not-reverted-hookは、magit が現在のリポジトリからすべての訪問済みバッファを更新するときに呼び出されます (たとえば、commit または "g" コマンドの後)。

(add-hook 'git-gutter:update-hooks 'magit-after-revert-hook)
(add-hook 'git-gutter:update-hooks 'magit-not-reverted-hook)
于 2015-08-30T11:25:20.543 に答える