gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:07:28 28 4
gpt4 key购买 nike

我用 git-gutter 用于可视化我对版本控制文件所做的更改,以及 magit用于分期/提交/差异等。

在进行项目时,我通常会保留 magit-status window 随时打开。我遇到的问题是,当我在 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)

默认情况下。所以我真正需要做的就是在这个列表中添加正确的钩子(Hook),我应该很高兴。切换窗口时运行的钩子(Hook)的名称是什么?我查看了 Elisp 手册的各个部分,但无法找到我要查找的内容。或者,是否 magit提供在暂存或取消暂存更改时运行的 Hook ?

编辑 :

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

最佳答案

编辑 : 使用最新版本的 magit 和 git-gutter,这不再需要这么多配置,请参阅 lunaryorns 答案以获得更新和简单的解决方案。

原答案:

切换窗口方法可能有点矫枉过正,因为你会刷新比你需要的更多。

Magit 不提供阶段前/阶段后/非阶段钩子(Hook),但是我们可以使用建议制作自己的钩子(Hook)!

你可以为你的 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.")

有一个很好的运行钩子(Hook)的包装函数: run-hooks 我们将使用 function advicemagit-stage-item 之后运行我们的自定义 Hook 和 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)))

对于我们的钩子(Hook),我们可以遍历所有缓冲区,并在适用时刷新 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)))))

最后,只需将您的钩子(Hook)函数添加到您的自定义钩子(Hook)中!

(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

关于Emacs:在 magit-status 缓冲区中暂存或取消暂存更改时更新 git-gutter 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com