如何在更改主要模式之前运行功能

时间:2014-09-12 01:57:23

标签: emacs elisp

在新主要模式已启用后,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的一部分。

2 个答案:

答案 0 :(得分:4)

你说“改变主要模式挂钩似乎在......之后运行”:我想知道是什么让你这么想,因为它是在之前运行,即它确实是什么你问(并且正是用于这种情况)。

答案 1 :(得分:3)

我可能误解了你的问题,但我没有看到任何问题,假设您的次要模式是从主模式挂钩启用并将其清理功能添加到change-major-mode-hook

change-major-mode-hook在主模式函数的最开始运行,在其他任何操作之前运行,包括主模式挂钩。因此,您的次要模式的清除功能称为,然后您的次要模式被新主要模式的钩子重新启用。如果这对您不起作用,则您的次要模式实施或设置可能存在缺陷。

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

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