编辑:使用最新版本的 magit 和 git-gutter,这不再需要如此多的配置,请参阅 lunaryorns 答案以获得更新和简单的解决方案。
原答案:
切换窗口方法可能有点矫枉过正,因为你会刷新比你需要的更多。
Magit 不提供阶段前/阶段后/非阶段钩子,但是我们可以使用建议制作自己的钩子!
你可以为你的 stage 和 unstage 钩子定义两个变量。
(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-item
然后magit-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 状态缓冲区项目的名称并仅刷新它。但这是一个好的开始!