chr*_*hrm 24 emacs slime read-eval-print-loop
我有glob-cursor-mode激活全局,像这样:
(require 'centered-cursor-mode)
(global-centered-cursor-mode 1)
Run Code Online (Sandbox Code Playgroud)
它工作正常,但有一些主要模式,我想自动禁用它.例如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))))
Run Code Online (Sandbox Code Playgroud)
phi*_*ils 17
使用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)
Run Code Online (Sandbox Code Playgroud)
我们可以做的事情(具有易于重复使用的模式)在启用后立即再次禁用缓冲区本地次要模式.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))
Run Code Online (Sandbox Code Playgroud)
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缓冲区启用这个次要模式,而具有单独开启功能的全球化次要模式仍然可以在其非调用全球形式如果你愿意的话.
chr*_*hrm 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)
Run Code Online (Sandbox Code Playgroud)
它应该适用于所有其他全局次要模式.只需复制global-xxx-mode定义并进行正确的异常.
归档时间: |
|
查看次数: |
6267 次 |
最近记录: |