请教:这是 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))))

This was fixed in bug#54481 and was even committed to master, but 老煩 made sure it got summarily reverted.

So how about this to get us back to where we were, with the one real improvement of `hl-line-overlay-priority’ being made a defcustom? - 老煩

You hold all the cards, sir. Nothing in the past has prevented you from unilaterally quashing my changes. - dickmao

好像不是,我现在用的 emacs 版本是 29.4 。这个 bug 好像是 29.05 就改了。

我也这样觉得的,而且感觉 global-hl-line-mode 和 hl-line-mode 的行为不应该这么分裂,文档描述跟其他 mode 是一致的,行为却不一样。

这样确实可以,不过如果确是 bug,还是想上游能修改了。