我使用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业力:)
答案 0 :(得分:8)
编辑:,这不再需要这么多配置,请参阅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 advice在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状态缓冲项的名称并且仅刷新,我们就会知道哪些文件已暂存/未暂存且只刷新这些缓冲区那。但这是一个好的开始!
答案 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