Quel morceau de code dans Emacs fait que "line-number-mode` affiche" ?? "comme numéro de ligne dans les tampons avec de longues lignes?

21

J'utilise line-number-modepour avoir un indicateur de la ligne actuelle dans ma modélisation, cependant pour les fichiers volumineux ou plutôt les fichiers avec de longues lignes, il commence à afficher deux points d'interrogation au lieu d'un numéro de ligne. J'ai creusé un peu et découvert que tandis que line-number-modeest défini dans simple.el, les variables personnalisables (et probablement toute la logique impliquée) sont définies dans xdisp.c. Changer la line-number-display-widthvariable en un nombre arbitrairement élevé pourrait résoudre ce problème, mais je suis beaucoup plus intéressé par le morceau de code et la logique qui le fait imprimer les deux points d'interrogation. Ce serait très utile si l'un d'entre vous pouvait le trouver pour moi, peut-être même expliquer la logique derrière cela.

wasamasa
la source
2
Affiche M-: (format-mode-line "%l")- t -il également des points d'interrogation?
lunaryorn
Oui, ça me donne "??" comme résultat de l'évaluation.
wasamasa
1
Eh bien, jetez un oeil à la définition de format-mode-line.
lunaryorn

Réponses:

25

Grâce aux suggestions de @ lunaryorn, j'ai pu localiser le morceau de code à l'origine de cela. Il ressemble format-mode-lineéventuellement à des appels decode_mode_specpour transformer les codes de format donnés en valeurs. Pour le cas de %lcette fonction, fait quelques vérifications d'intégrité pour éviter de passer trop de temps à calculer, puis vérifie si la ligne actuelle dépasse line-number-display-limit-width. Comme c'est le cas pour mon fichier en question, il saute sur une no_valueétiquette qui renvoie une ??valeur rembourrée .

"Résoudre" cela implique de régler la variable sur une valeur suffisamment élevée:

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

Cette valeur a été dérivée en regardant l'heuristique correspondante dans xdisp.claquelle prend la hauteur de la fenêtre fois deux plus trente et la multiplie avec line-number-display-limit-width, pour éviter de déborder most-positive-fixnumsur un système 32 bits, une valeur de 2000000 serait une valeur sûre.

wasamasa
la source
2
Au lieu de conserver deux questions similaires, l'autre question ne devrait-elle pas être fermée en double et mettre à jour cette réponse à la place?
Kaushal Modi
@kaushalmodi: Terminé!
wasamasa
2
Pour les changements temporaires:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Éponyme
Je suppose que cela avait du sens lorsque les ordinateurs étaient beaucoup plus lents. Je l'ai réglé sur une valeur élevée dans mon fichier init pendant plusieurs décennies.
Jim Balter