define-globalized-minor-mode
使用1宏创建的全局次要模式有点棘手。您的代码似乎没有做任何事情的原因是全球化模式after-change-major-mode-hook
用来激活它们控制的缓冲区本地次要模式;并且该钩子在主要模式自己的钩子之后立即运行4。
个别模式可以实现指定某种黑名单的自定义方式或在某些情况下阻止启用该模式的其他方法,因此通常值得查看M-x customize-group
软件包的相关选项以查看是否存在此类设施。然而,对于任何全球化的次要模式来说,一个很好的干净的通用方法目前正在躲避我。
遗憾的是,MODE-enable-in-buffers
该宏定义的函数没有(with-current-buffer buf (if ,global-mode ...))
执行与全局模式函数执行的相同检查。如果是这样,您可以简单地使用 slime-repl-mode-hook 使全局模式变量 buffer-local 和 nil。
一个快速的技巧是检查2全球化次要模式定义的参数是什么turn-on
(在这种情况下它centered-cursor-mode
本身就是3),并写一些周围的建议以阻止对有问题的模式进行评估。
(defadvice centered-cursor-mode (around my-centered-cursor-mode-turn-on-maybe)
(unless (memq major-mode
(list 'slime-repl-mode 'shell-mode))
ad-do-it))
(ad-activate 'centered-cursor-mode)
我们可以做的事情(使用简单的可重用模式)是在启用缓冲区本地次要模式后立即再次禁用它。在全局次要模式起作用后,after-change-major-mode-hook
添加了APPEND
参数 to的函数将可靠地运行,因此我们可以执行以下操作:add-hook
(add-hook 'term-mode-hook 'my-inhibit-global-linum-mode)
(defun my-inhibit-global-linum-mode ()
"Counter-act `global-linum-mode'."
(add-hook 'after-change-major-mode-hook
(lambda () (linum-mode 0))
:append :local))
1或其别名define-global-minor-mode
,我认为应该避免使用,因为可能会与使用define-minor-mode
. “全球化”次要模式虽然仍然涉及全局次要模式,但在实践中的工作方式非常不同,因此最好将它们称为“全球化”而不是“全局”。
图 2 C-hf define-globalized-minor-mode
RET显示这turn-on
是第三个参数,我们在模式定义中使用M-x find-function
RET global-centered-cursor-mode
RET.
3使用这种方法,这一事实将阻止您使用 slime-repl-mode 或 shell-mode 缓冲区启用此次要模式,而具有单独开启功能的全球化次要模式仍然可以在其非-如果您愿意,可以使用全局形式。
4 https://stackoverflow.com/a/19295380/324105