Emacs中的哪段代码可以使“ line-number-mode”在长行缓冲区中以行号显示“ ??”?


21

line-number-mode过去在我的modeline中使用了当前行的指示器,但是对于大文件或长行文件,它开始显示两个问号而不是行号。我进行了一点挖掘,发现虽然在line-number-mode中定义simple.el了可自定义变量(并且可能涉及到的所有逻辑),但都在中定义了xdisp.c。将line-number-display-width变量更改为任意高的数字可能会解决此问题,但是我对代码片段和使它打印两个问号的逻辑更感兴趣。如果你们中的任何一个能为我找到它,甚至解释它背后的逻辑,那将是非常有用的。


2
是否也M-: (format-mode-line "%l")显示问号?
lunaryorn 2014年

是的,它确实给了我“ ??” 作为评估结果。
wasamasa 2014年

1
好了,然后看一下的定义format-mode-line
lunaryorn 2014年

Answers:


25

感谢@lunaryorn的建议,我得以找到导致此问题的代码段。format-mode-line最终调用似乎decode_mode_spec将给定的格式代码转换为值。对于%l此功能的情况,请进行一些完整性检查,以避免花费太多时间进行计算,然后检查当前行是否超出line-number-display-limit-width。由于我的文件属于这种情况,因此它会跳转到一个no_value标签,该标签返回填充??的值。

“解决”涉及将变量设置为足够高的值:

(setq line-number-display-limit-width 2000000)

该值是通过查看相应的试探法得出的,在该试探法中xdisp.c,将窗口高度乘以2加30,然后乘以line-number-display-limit-width,以避免most-positive-fixnum在32位系统上溢出,将值2000000确定是安全的。


2
与其保留两个类似的问题,不应该将另一个问题作为一个重复项关闭,而不是更新此答案吗?
Kaushal Modi

@kaushalmodi:完成!
wasamasa

2
临时更改:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
同名,2015年

我想这在计算机速度慢得多的时候是有道理的。几十年来,我在init文件中将它设置为很高的价值。
吉姆·巴尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.