自动禁用特定主要模式的全局次要模式

时间:2011-07-26 22:44:23

标签: emacs read-eval-print-loop slime

我已将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))))

2 个答案:

答案 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函数仍然可以以非全局形式调用。

4 https://stackoverflow.com/a/19295380/324105

答案 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定义并做出正确的例外。