¿Qué parte del código en Emacs hace que 'line-number-mode` imprima “??” como número de línea en buffers con líneas largas?

21

Estoy usando line-number-modepara tener un indicador de la línea actual en mi línea de modo, sin embargo, para archivos grandes o más bien, archivos con líneas largas, comienza a mostrar dos signos de interrogación en lugar de un número de línea. He cavado un poco y descubrí que mientras line-number-modeestá definido simple.el, las variables personalizables (y probablemente toda la lógica involucrada) están definidas xdisp.c. Cambiar la line-number-display-widthvariable a un número arbitrariamente alto podría solucionar esto, pero estoy mucho más interesado en el fragmento de código y la lógica que lo hace imprimir los dos signos de interrogación. Sería muy útil si alguno de ustedes pudiera encontrarlo para mí, tal vez incluso explicar la lógica detrás de esto.

wasamasa
fuente
2
¿ M-: (format-mode-line "%l")También muestra signos de interrogación?
lunaryorn el
Sí, me da "??" como resultado de la evaluación.
wasamasa
1
Bueno, entonces eche un vistazo a la definición de format-mode-line.
lunaryorn

Respuestas:

25

Gracias a las sugerencias de @ lunaryorn pude localizar el código que causa esto. Parece que format-mode-lineeventualmente llama decode_mode_specpara convertir los códigos de formato dados en valores. Para el caso de %lesta función, realiza algunas verificaciones de cordura para evitar perder demasiado tiempo calculando, luego verifica si la línea actual está excediendo line-number-display-limit-width. Como ese es el caso de mi archivo en cuestión, salta a una no_valueetiqueta que devuelve un relleno ??como valor.

"Resolver" esto implica establecer la variable en un valor suficientemente alto:

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

Este valor se obtuvo al observar la heurística correspondiente en la xdisp.cque toma la altura de la ventana multiplicada por dos más treinta y la multiplica line-number-display-limit-width, para evitar el desbordamiento most-positive-fixnumen un sistema de 32 bits, un valor de 2000000 sería una apuesta segura.

wasamasa
fuente
2
En lugar de mantener dos preguntas similares, ¿no debería cerrarse la otra pregunta como un duplicado y actualizar esta respuesta?
Kaushal Modi
@kaushalmodi: ¡Listo!
wasamasa
2
Para los cambios temporales:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Eponymous
Supongo que esto tenía sentido cuando las computadoras eran mucho más lentas. Lo he configurado en un valor alto en mi archivo init durante varias décadas.
Jim Balter