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