今天配置 emacs 时,想在全局启用了 hl-line-mode ,但在 text-mode 禁用。我用了如下代码:
(add-hook 'text-mode-hook (lambda () (hl-line-mode -1)))
但一直不生效。查看文档(C-h f hl-line-mode)上说的传入 0 或者 负数为禁用。最后简单瞄了下代码(对 elisp 不熟悉),然后改成下面的配置:
(add-hook 'text-mode-hook (lambda () (hl-line-mode 'toggle)))
就 OK 了。
使用了什么代码全局开启 hl-line-mode
呢?
只有'toggle
参数可以关闭global-hl-line-mode
。
;; hl-line.el:159
(when (and global-hl-line-mode
(eq arg 'toggle))
(setq hl-line-mode nil)
(setq-local global-hl-line-mode nil)
(global-hl-line-unhighlight))
1 个赞
这样就更 hl-line-mode 中的描述不一致了,好像也更其他 mode 的使用逻辑不一样。
不矛盾,(hl-line-mode -1)
可以关闭hl-line-mode
,但是你启用的是global-hl-line-mode
。我估计人家专门做了'toggle
就是针对这个使用场景。
还是有问题的。
如果楼主因为某种原因临时关闭了全局 hl-line-mode
,对于新开的 text buffer (hl-line-mode 'toggle)
刚好就起了相反的作用。
而且 toggle
从字面上看不出意图是关还是开,-1
就很明确了。
参考上面的讨论,给个解决方法:
(add-hook 'text-mode-hook
(lambda () (when global-hl-line-mode
(hl-line-mode 'toggle))))
好像不是,我现在用的 emacs 版本是 29.4 。这个 bug 好像是 29.05 就改了。
我也这样觉得的,而且感觉 global-hl-line-mode 和 hl-line-mode 的行为不应该这么分裂,文档描述跟其他 mode 是一致的,行为却不一样。
这样确实可以,不过如果确是 bug,还是想上游能修改了。