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

我已经居中游标模式激活globaly,如下所示:

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

它工作正常,但有一些主要的模式,我想自动禁用它。 例如粘液重覆和壳。

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

我试过这个钩子,但是没有效果。 该variables不会改变。

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

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

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

单独的模式可以实现自定义的方式来指定某种黑名单或其他方法来防止在某些情况下启用模式,所以一般来说,值得查看相关的Mx customize-group选项来查看是否这样设施存在。 但是,对于任何全球化的次要模式来说,一个很好的干净的一般方法是暂时避开我的。

遗憾的是,由该macros定义的MODE-enable-in-buffers函数不能做到这一点(with-current-buffer buf (if ,global-mode ...))检查由全局模式函数。 如果是这样,你可以简单地使用slime-repl-mode-hook来使全局模式variablesbuffer-local和nil。

一个简单的方法就是检查2全局小模式定义的turn-on参数是什么(在这种情况下,它是centered-cursor-mode本身3 ),并且写一些build议来阻止它被评估为有问题的模式。

 (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-hookafter-change-major-mode-hook函数将在APPEND化次要模式执行后可靠运行,因此我们可以执行如下操作:

 (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创build的“全局”次要模式混淆。 “全球化”小模式虽然仍然涉及全球小模式,但在实践中的工作方式却很不一样,所以最好把它们称为“全球化”而不是“全球化”。

2 Ch f define-globalized-minor-mode RET显示turn-on是第三个参数,我们使用Mx find-function RET global-centered-cursor-mode RET检查模式定义。

3这个方法,这个事实将阻止你使用粘液复制模式或shell模式缓冲区来启用这个小模式,而具有单独启动function的全局化次模式仍然可以在其非复制模式下被调用,全球forms,如果你愿意。

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

Interesting Posts