Emacs:在magit-status缓冲区中暂存或取消暂存更改时更新git-gutter注释

时间:2014-04-28 15:03:06

标签: emacs hook magit

我使用git-gutter来查看我对版本控制文件所做的更改,并使用magit进行转移/提交/差异等。

在处理项目时,我通常会一直打开magit-status窗口。我遇到的问题是,当我暂停或取消暂停magit-status缓冲区中的更改,然后切换回显示我刚更新状态的文件的窗口时,生成的边缘注释{{ 1}} 未自动调整。 (我当前触发更新的解决方法是点击 SPC Backspace ,然后按 Cx Cs 来保存文件,但这不是很有效。)

我查看了git-gutter,果然它提供了一个名为git-gutter.el的可自定义变量,该变量设置为

git-gutter:update-hooks

默认情况下。所以我真正需要做的就是在这个列表中添加正确的钩子,我应该好好去。 切换窗口时运行的挂钩的名称是什么?我查看了Elisp手册的各个部分,但未能找到我要查找的内容。或者,(after-save-hook after-revert-hook window-configuration-change-hook) 是否提供在暂存或取消暂停更改时运行的挂钩?


修改

如果您正在阅读本文,因为您遇到了类似的问题:我在下面得到的两个答案都是有效的解决方案!对于较新版本的magit@lunaryorn's solution简短且甜蜜。 @Jordon Biondo's solution需要添加更多自定义代码,但附带了一般化(!)建议,用于创建自定义挂钩并将其注入现有功能。所以,因为我只能接受一个答案:通过用upvote奖励两张海报来提升你的SO业力:)

3 个答案:

答案 0 :(得分:8)

使用最新版本的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-hooks我们将使用function advicemagit-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状态缓冲项的名称并且仅刷新,我们就会知道哪些文件已暂存/未暂存且只刷新这些缓冲区那。但这是一个好的开始!

auto git gitter refreshing

答案 1 :(得分:3)

这是我需要对当前magit执行的操作:

(add-hook 'magit-post-refresh-hook
          #'git-gutter:update-all-windows)

答案 2 :(得分:2)

请注意,当前版本的magit 使用`magit-revert-buffer-hook'。因此,lunaryorn的解决方案可能无效。

您可以添加private void panel1_Paint(object sender, PaintEventArgs e) { List<Point> points1 = new List<Point>() { new Point(300, 100), new Point(500, 300), new Point(400, 500), new Point(200, 300) }; List<Point> points2 = new List<Point>() { new Point(100, 100), new Point(500, 100), new Point(500, 400), new Point(100, 400) }; e.Graphics.DrawClosedCurve(Pens.Red, points1.ToArray(), (float)(trackBar1.Value / 100f), System.Drawing.Drawing2D.FillMode.Alternate); e.Graphics.DrawClosedCurve(Pens.Blue, points2.ToArray(), (float)(trackBar1.Value / 100f), System.Drawing.Drawing2D.FillMode.Alternate); } magit-after-revert-hook的git-gutter更新挂钩函数,当magit刷新当前存储库中的所有访问缓冲区时(例如在提交或&#34; g&#34;命令之后) ):

magit-not-reverted-hook