编辑: 使用最新版本的magit和git-gutter,这不再需要如此多的配置,请参阅lunaryorns答案以获取更加实时和简单的解决方案。
原始答案:
切换窗口方法可能有点过度,因为您将会刷新超过您需要的。
Magit没有提供before/after stage/unstage hooks,但我们可以使用advice来创建自己的hooks!
您可以为stage和unstage hook定义两个变量。
(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状态缓冲区项目的名称,并仅刷新该项目,则会更好。但这是一个很好的开始!