Quale pezzo di codice in Emacs fa in modo che `line-number-mode` stampi“ ?? ”come numero di riga nei buffer con linee lunghe?


21

Sto usando line-number-modeper avere un indicatore della linea corrente nella mia modeline, tuttavia per file di grandi dimensioni o meglio, file con linee lunghe, inizia a visualizzare due punti interrogativi anziché un numero di riga. Ho scavato un po 'e ho scoperto che mentre line-number-modeè definito in simple.el, le variabili personalizzabili (e probabilmente tutta la logica coinvolta) sono definite in xdisp.c. Cambiare la line-number-display-widthvariabile in un numero arbitrariamente alto potrebbe risolverlo, ma sono molto più interessato al pezzo di codice e alla logica che lo fa stampare i due punti interrogativi. Sarebbe molto utile se qualcuno di voi potesse trovarlo per me, forse anche spiegare la logica dietro di esso.


2
Non M-: (format-mode-line "%l")mostrare punti interrogativi, anche tu?
lunaryorn,

Sì, mi dà "??" come risultato della valutazione.
Wasamasa,

1
Bene, allora dai un'occhiata alla definizione di format-mode-line.
lunaryorn,

Risposte:


25

Grazie ai suggerimenti di @ lunaryorn sono stato in grado di individuare il pezzo di codice che causa questo. Alla format-mode-linefine sembra che le chiamate decode_mode_spectrasformino i codici di formato dati in valori. Nel caso di %lquesta funzione esegue alcuni controlli di integrità per evitare di dedicare troppo tempo al calcolo, quindi verifica se la linea corrente sta superando line-number-display-limit-width. Dato che è il caso del mio file in questione, passa a no_valueun'etichetta che restituisce un ??valore imbottito .

"Risolvere" questo implica impostare la variabile su un valore sufficientemente alto:

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

Questo valore è stato derivato osservando l'euristica corrispondente in xdisp.ccui prende l'altezza della finestra due volte più trenta e la moltiplica con line-number-display-limit-width, per evitare di traboccare most-positive-fixnumsu un sistema a 32 bit, un valore di 2000000 sarebbe una scommessa sicura.


2
Invece di mantenere due domande simili, l'altra domanda non dovrebbe essere chiusa come duplicata e aggiornare invece questa risposta?
Kaushal Modi,

@kaushalmodi: Fatto!
Wasamasa,

2
Per modifiche temporanee:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Eponimo

Immagino che ciò avesse senso quando i computer erano molto più lenti. L'ho impostato su un valore elevato nel mio file init per diversi decenni.
Jim Balter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.