2011-07-26 31 views
17

我都集中光标模式globaly激活,就像这样:自动禁用全局次要模式为特定的主要模式

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

它工作正常,但也有一些主要的模式,我想禁用它会自动。例如史莱姆重复和壳。

还有另一个问题处理相同的问题,但另一个小模式。不幸的是,答案只提供了这种特定次要模式(global-smart-tab-mode)的解决方法,它不适用于居中游标模式。

我试过这个钩子,但它没有效果。该变量不会改变。与define-globalized-minor-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)))) 

回答

11

我犯了一个新的全球轻微模式,即没有得到在特定的模式激活。 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并设置正确的例外。

+0

当你从一种主要模式切换到另一种主要模式时,它似乎不工作 – xuhdev

10

全局次要模式是有点棘手。您的代码看起来没有做任何事情的原因是全球化模式利用after-change-major-mode-hook来激活它们控制的缓冲区本地次要模式;并且该钩子在之后立即运行主要模式自己的钩子。

单独的模式可以实现指定某种黑名单的自定义方式或其他防止在某些情况下启用模式的方法,因此通常需要查看包的相关M-x customize-group选项以查看是否这样的设施存在。然而,对于任何全球化的次要模式来说,实现这一目标的一个很好的干净的一般方法正在逃避我。

很遗憾,由该宏定义的MODE-enable-in-buffers函数不会执行由全局模式函数执行的相同的(with-current-buffer buf (if ,global-mode ...))检查。如果是这样,你可以可以只需使用slime-repl-mode-hook使全局模式变量buffer-local和nil。

快速劈是检查的turn-on参数是什么全球化次要模式定义(在这种情况下它的centered-cursor-mode本身),并写一些周围建议停止从模式正在评估有问题。

(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参数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)) 

或其别名define-global-minor-mode我觉得应该应避免,因为可能会与define-minor-mode创建的“全局”次要模式混淆。 “全球化”次要模式虽然仍然涉及全球次要模式,但在实践中的工作方式却非常不同,因此最好将它们称为“全球化”而不是“全球化”。

C-H˚Fdefine-globalized-minor-modeRET表明turn-on是第三个参数,我们检查在模式定义与M-Xfind-functionRETglobal-centered-cursor-modeRET。使用这种方法,这个事实将阻止你使用slime-repl-mode或shell-mode缓冲区启用这个次要模式,而具有独立开启功能的全球化次要模式仍然可以如果您愿意,可以以非全局形式调用。

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

+0

感谢您的回答。我试过这个钩子: – chrm

相关问题