请教:这是 hl-line-mode 的一个 bug 吗?

今天配置 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 个赞

用的:

(global-hl-line-mode +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,还是想上游能修改了。