如何仅为 *.el 文件启用 Show-Paren 模式?
我试过了
(add-hook 'emacs-lisp-mode-hook '(lambda()
(show-paren-mode 1)
))
但它仍然为所有情况启用 Show-Paren 模式。即使在*scratch*
缓冲区中,我也启用了 Show-Paren 模式。
如前所述,show-paren-mode
是一种全局次要模式。也就是说,一个人可能只能在一些缓冲区上运行它,例如:
(show-paren-mode) ;; activate the needed timer
(setq show-paren-mode ()) ;; The timer will do nothing if this is nil
(defun show-paren-local-mode ()
(interactive)
(make-local-variable 'show-paren-mode) ;; The value of shom-paren-mode will be local to this buffer.
(setq show-paren-mode t))
(add-hook 'emacs-lisp-mode-hook 'show-paren-local-mode)
它未经测试,它可能无法正常工作。查看文档可能有效,但查看代码可能有效。这可能仅适用于某些版本的 show-paren-mode。
show-paren-mode
是全局次要模式。这意味着它听起来如何。这在很大程度上是设计使然,因为大多数人(包括我自己)发现这种次要模式对所有缓冲区都有帮助。为什么要对任何文件禁用它?
从文档
Show Paren 模式是一种全局次要模式。启用后,任何匹配的括号都会在
show-paren-style' after
Emacs 空闲时间的 show-paren-delay' 秒内突出显示。
你的代码是正确的。但是,您应该考虑这样一个事实,即*scratch*
缓冲区的主要模式lisp-interaction-mode
源自emacs-lisp-mode
(这几乎无关紧要)和模式的定义:
(define-minor-mode show-paren-mode
"Toggle visualization of matching parens (Show Paren mode).
With a prefix argument ARG, enable Show Paren mode if ARG is
positive, and disable it otherwise. If called from Lisp, enable
the mode if ARG is omitted or nil.
Show Paren mode is a global minor mode. When enabled, any
matching parenthesis is highlighted in `show-paren-style' after
`show-paren-delay' seconds of Emacs idle time."
:global t :group 'paren-showing
...)
:global t
是这里的关键 - 该模式是全局的,并且在所有缓冲区中都启用,无论它们的主要模式如何。
我认为你可以使用
(setq-default show-paren-data-function #'ignore)
(show-paren-mode)
正式启用该模式但保持安静。然后像
(defun set-up-emacs-lisp-mode ()
(setq-local show-paren-data-function #'show-paren--default))
(add-hook 'emacs-lisp-mode-hook #'set-up-emacs-lisp-mode)
在 Emacs Lisp 缓冲区中启用它。我没有测试过这个设置,只是相反(通常启用,仅在文本模式下禁用)。
我曾经使用过(setq-local show-paren-mode nil)
,但这会使 Emacs 突出显示 Ido 提示符中的大括号,所以我更喜欢(setq-default show-paren-data-function #'ignore)
.