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 的解决方案需要添加更多自定义代码,但附带通用 (!) 建议,用于创建自定义挂钩并将它们注入现有功能。所以,因为我只能接受一个答案:通过用赞成票奖励两张海报来提升你的 SO 业力:)

4

3 回答 3

8

编辑使用最新版本的 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 状态缓冲区项目的名称并仅刷新它。但这是一个好的开始!

自动 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 更新钩子函数,magit-after-revert-hookmagit-not-reverted-hookmagit 从当前存储库刷新所有访问过的缓冲区时(例如,在提交或“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 回答