永久禁用Emacs中主要模式的全局镜像

时间:2017-01-30 16:51:40

标签: emacs minor-mode

由于启用linum-mode (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)) 非常慢,我试图为该模式禁用它。大约6年前就回答了同样的问题: automatically disable a global minor mode for a specific major mode

根据phils的回答,我在.emacs文件中添加了以下内容:

doc-view-mode

问题在于我无法使其永久。当我启动一个新缓冲区时,行号重新出现在{{1}}的缓冲区中。请帮忙!

1 个答案:

答案 0 :(得分:1)

您的问题是您自己的全球化次要模式正在调用全局 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-modedefine-global-minor-mode是一回事,但我更喜欢“全球化”命名,因为它更能说明它的用途(即采用缓冲区本地次要模式,并创建一个新的全局次要模式)模式,其中控制缓冲区本地模式 - 在大量缓冲区中启用或禁用它。“常规”全局次模式不会以这种方式依赖于缓冲区本地次模式,所以“全球化”术语有助于将这种模式与其他全局模式区分开来。)

n.b。当您使用自定义全球化次要模式时,您不需要任何my-inhibit-global-linum-mode代码。这是一种完全不同的方法,您可以从.emacs文件中删除它。