¿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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.