我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)
Run Code Online (Sandbox Code Playgroud)
默认情况下.所以我真正需要做的就是在这个列表中添加正确的钩子,我应该好好去.切换窗口时运行的挂钩的名称是什么?我查看了Elisp手册的各个部分,但未能找到我要找的内容.或者,是否magit提供在暂存或取消暂停更改时运行的挂钩?
编辑:
如果您正在阅读本文,因为您遇到了类似的问题:我在下面得到的两个答案都是有效的解决方案!对于较新版本magit,@ lunaryorn的解决方案简短而且甜美.@Jordon Biondo的解决方案需要添加更多自定义代码,但附带了一般化(!)建议,用于创建自定义钩子并将它们注入现有功能.所以,因为我只能接受一个答案:用upvote奖励两张海报来提升你的SO业力 :)
编辑:使用最新版本的magit和git-gutter,这不再需要这么多配置,请参阅lunaryorns的答案以获得更新和简单的解决方案.
原答案:
切换窗口方法可能有点矫枉过正,因为你会比你需要的更新.
Magit不提供前/后舞台/非舞台挂钩,但我们可以使用建议制作我们自己的挂钩!
您可以为舞台和非舞台挂钩定义两个变量.
(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 Code Online (Sandbox Code Playgroud)
有一个很好的包装器函数用于运行挂钩: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)))
Run Code Online (Sandbox Code Playgroud)
对于我们的钩子,我们可以遍历所有缓冲区,并在适用时刷新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)))))
Run Code Online (Sandbox Code Playgroud)
最后,只需将钩子函数添加到自定义钩子中即可!
(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)
Run Code Online (Sandbox Code Playgroud)
理想情况下,如果您可以使用更深层的magit函数的建议并获取您正在执行的magit状态缓冲区项的名称并仅刷新它,我们就会知道哪些文件已暂存/未暂存且仅刷新这些缓冲区.但这是一个好的开始!

这就是我需要对 current 做的事情magit:
(add-hook 'magit-post-refresh-hook
#'git-gutter:update-all-windows)
Run Code Online (Sandbox Code Playgroud)