27

我在全球范围内激活了居中光标模式,如下所示:

(require 'centered-cursor-mode)
(global-centered-cursor-mode 1)

它工作正常,但有一些主要模式我想自动禁用它。例如 slime-repl 和 shell。

还有另一个问题处理相同的问题,但另一种次要模式。不幸的是,答案只为这个特定的次要模式(global-smart-tab-mode)提供了解决方法,它不适用于 centered-cursor-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))))
4

2 回答 2

20

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

于 2011-07-27T05:56:50.953 回答
13

我制作了一个新的全局次要模式,在某些模式下不会被激活。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 并做出正确的例外。

于 2011-07-27T18:37:25.867 回答