我已将glob-cursor-mode激活为globaly,如下所示:
(require 'centered-cursor-mode)
(global-centered-cursor-mode 1)
它工作正常,但有一些主要模式我想自动禁用它。例如slime-repl和shell。
还有另一个问题涉及同一问题,但另一个小模式。不幸的是,答案只提供了这种特定次要模式(global-smart-tab-mode)的解决方法,它不适用于居中游标模式。
我试过这个钩子,但它没有效果。变量不会改变。
(eval-after-load "slime"
(progn
(add-hook 'slime-repl-mode-hook (lambda ()
(set (make-local-variable 'centered-cursor-mode) nil)))
(slime-setup '(slime-repl slime-autodoc))))
答案 0 :(得分:16)
使用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
的{{1}}函数将在全局化次要模式执行后可靠地运行,因此我们可以执行以下操作:
add-hook
1 或其别名(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))
,因为可能会混淆使用define-global-minor-mode
创建的“全局”次要模式。 “全球化”的小模式虽然仍然涉及全球次要模式,但在实践中的工作方式却截然不同,因此最好将它们称为“全球化”而不是“全球化”。
2 Ch f define-minor-mode
RET 表明define-globalized-minor-mode
是第三个参数,我们在模式定义中检查 Mx turn-on
RET find-function
RET 。
3 ,这一事实将阻止您使用slime-repl-mode或shell-mode缓冲区启用此次要模式,而具有单独转向的全局化次要模式 - 如果你愿意的话,on函数仍然可以以非全局形式调用。
答案 1 :(得分:12)
我制作了一个新的全局次要模式,在某些模式下不会被激活。 lambda是在每个新缓冲区中调用的函数,用于激活次模式。这是制作例外的正确场所。
(require 'centered-cursor-mode)
(define-global-minor-mode my-global-centered-cursor-mode centered-cursor-mode
(lambda ()
(when (not (memq major-mode
(list 'slime-repl-mode 'shell-mode)))
(centered-cursor-mode))))
(my-global-centered-cursor-mode 1)
它应该适用于所有其他全局次要模式。只需复制global-xxx-mode定义并做出正确的例外。