在 Emacs 中永久禁用主要模式的全局次要
Permanently disable a global minor for a major mode in Emacs
由于 doc-view-mode
在启用 linum-mode
的情况下非常慢,我试图在该模式下禁用它。大约 6 年前已经回答了同样的问题:
automatically disable a global minor mode for a specific major mode
根据 phils, I have put the following in my .emacs 文件的答案:
(define-global-minor-mode my-global-linum-mode global-linum-mode
(lambda ()
(when (not (memq major-mode
(list 'doc-view-mode 'shell-mode)))
(global-linum-mode))))
(my-global-linum-mode 1)
(add-hook 'doc-view-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))
问题是我无法让它永久工作。当我开始一个新的缓冲区时,行号重新出现在 doc-view-mode
的缓冲区中。请帮忙!
你的问题是你自己的全球化次要模式正在调用 global linum 次要模式而不是 buffer-local linum小模式!
您想这样做:
(define-global-minor-mode my-global-linum-mode linum-mode
(lambda ()
(when (not (memq major-mode
(list 'doc-view-mode 'shell-mode)))
(linum-mode 1))))
(my-global-linum-mode 1)
我建议实际使用 derived-mode-p
进行 major-mode
测试:
(define-globalized-minor-mode my-global-linum-mode linum-mode
(lambda ()
(unless (or (minibufferp)
(derived-mode-p 'doc-view-mode 'shell-mode))
(linum-mode 1))))
n.b。 define-globalized-minor-mode
与 define-global-minor-mode
相同,但我更喜欢 "globalized" 命名,因为它更能说明它的用途(即采用 buffer-local 次要模式,并创建控制 buffer-local 模式的新全局次要模式——在许多缓冲区中启用或禁用它,集体。'regular' 全局次要模式将不依赖以这种方式在 buffer-local 次模式上,因此 "globalized" 术语有助于将这种模式与其他全局模式区分开来。
n.b。当您使用自定义的全球化次要模式时,您不需要任何 my-inhibit-global-linum-mode
代码。这是一种完全不同的方法,您可以将其从 .emacs 文件中删除。
由于 doc-view-mode
在启用 linum-mode
的情况下非常慢,我试图在该模式下禁用它。大约 6 年前已经回答了同样的问题:
automatically disable a global minor mode for a specific major mode
根据 phils, I have put the following in my .emacs 文件的答案:
(define-global-minor-mode my-global-linum-mode global-linum-mode
(lambda ()
(when (not (memq major-mode
(list 'doc-view-mode 'shell-mode)))
(global-linum-mode))))
(my-global-linum-mode 1)
(add-hook 'doc-view-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))
问题是我无法让它永久工作。当我开始一个新的缓冲区时,行号重新出现在 doc-view-mode
的缓冲区中。请帮忙!
你的问题是你自己的全球化次要模式正在调用 global linum 次要模式而不是 buffer-local linum小模式!
您想这样做:
(define-global-minor-mode my-global-linum-mode linum-mode
(lambda ()
(when (not (memq major-mode
(list 'doc-view-mode 'shell-mode)))
(linum-mode 1))))
(my-global-linum-mode 1)
我建议实际使用 derived-mode-p
进行 major-mode
测试:
(define-globalized-minor-mode my-global-linum-mode linum-mode
(lambda ()
(unless (or (minibufferp)
(derived-mode-p 'doc-view-mode 'shell-mode))
(linum-mode 1))))
n.b。 define-globalized-minor-mode
与 define-global-minor-mode
相同,但我更喜欢 "globalized" 命名,因为它更能说明它的用途(即采用 buffer-local 次要模式,并创建控制 buffer-local 模式的新全局次要模式——在许多缓冲区中启用或禁用它,集体。'regular' 全局次要模式将不依赖以这种方式在 buffer-local 次模式上,因此 "globalized" 术语有助于将这种模式与其他全局模式区分开来。
n.b。当您使用自定义的全球化次要模式时,您不需要任何 my-inhibit-global-linum-mode
代码。这是一种完全不同的方法,您可以将其从 .emacs 文件中删除。