启用新的主要模式后,change-major-mode-hook似乎正在运行。在更改主要模式之前,如何去运行一项功能?

示例:带有major-mode-abc的缓冲区的minor-mode-xyz处于活动状态,该次要模式负责放置某些叠加层。更改为major-mode-def时,如果remove-overlays在更改主要模式之前处于活动状态,则必须执行minor-mode-xyz函数。新的major-mode-def也会再次激活minor-mode-xyz并立即绘制新的叠加层(这是一件好事);但是,这些新的覆盖层(我想保留的覆盖层)被'change-major-mode-hook 'remove-overlays nil t删除了。我希望remove-overlays函数使用与minor-mode-xyz关联的钩子运行,而不是作为启用major-mode-def的一部分。

最佳答案

我可能误解了您的问题,但是在这里看不到任何问题,假定您从主要模式钩子启用了次要模式并将其清理功能添加到change-major-mode-hook
change-major-mode-hook在主要模式函数的最开始处运行,然后再执行其他任何操作,包括主要模式挂钩。因此,您的次要模式的清除功能称为,然后通过新的主要模式的钩子重新启用您的次要模式。如果这对您不起作用,则您的次要模式实施或设置中可能存在缺陷。

另外,您可以延迟将新的叠加层添加到post-command-hook中,而不是直接在次要模式函数中添加它们。定义一个局部缓冲区变量,然后在次要模式函数中将该变量设置为非nil值。然后将一个函数添加到局部于本地的post-command-hook,如果变量为非nil,则添加覆盖。

这样可以确保在完全设置新的主要模式之前,不会绘制覆盖图,包括清除所有旧覆盖图。这种方法的另一个优点是,叠加层的添加可以访问新主要模式的文件本地变量和目录变量。

09-30 19:51