Welcher Code in Emacs bewirkt, dass der Zeilennummernmodus "??" als Zeilennummer in Puffern mit langen Zeilen ausgibt?

21

Ich verwende line-number-mode, um einen Indikator für die aktuelle Zeile in meinem Modeline zu haben. Bei großen Dateien oder eher Dateien mit langen Zeilen werden jedoch anstelle einer Zeilennummer zwei Fragezeichen angezeigt. Ich habe ein bisschen gegraben und herausgefunden, dass, während line-number-modein definiert ist simple.el, die anpassbaren Variablen (und wahrscheinlich die gesamte Logik) in definiert sind xdisp.c. Das Ändern der line-number-display-widthVariablen in eine willkürlich hohe Zahl könnte dies beheben, aber ich interessiere mich viel mehr für den Code und die Logik, mit der die beiden Fragezeichen gedruckt werden. Es wäre sehr nützlich, wenn einer von Ihnen es für mich finden könnte, vielleicht sogar die Logik dahinter erklären könnte.

Wasamasa
quelle
2
Zeigt auch M-: (format-mode-line "%l")Fragezeichen?
Lunaryorn
Ja, es gibt mir "??" als Bewertungsergebnis.
Wasamasa
1
Dann werfen Sie einen Blick auf die Definition von format-mode-line.
Lunaryorn

Antworten:

25

Dank der Vorschläge von @ lunaryorn konnte ich den Code ausfindig machen, der das verursacht hat. Es sieht so aus, als würden format-mode-lineeventuell Aufrufe ausgeführt decode_mode_spec, um die angegebenen Formatcodes in Werte umzuwandeln. Bei %ldieser Funktion werden einige Überprüfungen durchgeführt, um zu vermeiden, dass zu viel Zeit für Berechnungen aufgewendet wird line-number-display-limit-width. Anschließend wird überprüft, ob die aktuelle Zeile überschritten wird . Da dies für meine fragliche Datei der Fall ist, springt sie zu einer no_valueBezeichnung, die einen ??als Wert aufgefüllten Wert zurückgibt .

Beim "Lösen" wird die Variable auf einen ausreichend hohen Wert gesetzt:

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

Dieser Wert wurde abgeleitet, indem die entsprechenden Heuristiken betrachtet wurden, in xdisp.cdenen die Fensterhöhe mit zwei plus dreißig multipliziert line-number-display-limit-widthwird. Um ein Überlaufen most-positive-fixnumauf einem 32-Bit-System zu vermeiden , wäre ein Wert von 2000000 eine sichere Wette.

Wasamasa
quelle
2
Sollte die andere Frage nicht als Duplikat geschlossen werden und stattdessen diese Antwort aktualisieren, anstatt zwei ähnliche Fragen zu behalten?
Kaushal Modi
@ kaushalmodi: Fertig!
Wasamasa
2
Für vorübergehende Änderungen:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Namensgeber
Ich nehme an, das ergab Sinn, als Computer viel langsamer waren. Ich habe es für einige Jahrzehnte auf einen hohen Wert in meiner Init-Datei gesetzt.
Jim Balter