Que parte do código no Emacs faz com que o `line-number-mode` imprima" ?? "como número da linha em buffers com linhas longas?

21

Estou usando line-number-modepara ter um indicador da linha atual na minha modelagem, no entanto, para arquivos grandes ou melhor, arquivos com linhas longas, ele começa a exibir dois pontos de interrogação em vez de um número de linha. Eu cavei um pouco e descobri que enquanto line-number-modeestá definido simple.el, as variáveis ​​personalizáveis ​​(e provavelmente toda a lógica envolvida) são definidas xdisp.c. Alterar a line-number-display-widthvariável para um número arbitrariamente alto pode corrigir isso, mas estou muito mais interessado no trecho de código e na lógica que o faz imprimir os dois pontos de interrogação. Seria muito útil se algum de vocês pudesse encontrá-lo para mim, talvez até explique a lógica por trás disso.

wasamasa
fonte
2
Será que M-: (format-mode-line "%l")mostram pontos de interrogação, também?
lunaryorn
Sim, isso me dá "??" como resultado da avaliação.
wasamasa
1
Bem, então dê uma olhada na definição de format-mode-line.
lunaryorn

Respostas:

25

Graças às sugestões do @ lunaryorn, consegui localizar o código que está causando isso. Parece que format-mode-lineeventualmente chamadas decode_mode_specpara transformar os códigos de formato fornecidos em valores. Para o caso %ldesta função, realiza algumas verificações de sanidade para evitar gastar muito tempo calculando e depois verifica se a linha atual está excedendo line-number-display-limit-width. Como esse é o caso do meu arquivo em questão, ele salta para um no_valuerótulo que retorna um preenchido ??como valor.

"Resolver" isso envolve definir a variável para um valor suficientemente alto:

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

Esse valor foi obtido observando as heurísticas correspondentes nas xdisp.cquais a altura da janela é multiplicada por dois mais trinta e a multiplica line-number-display-limit-width, para evitar o transbordamento most-positive-fixnumem um sistema de 32 bits, um valor de 2000000 seria uma aposta segura.

wasamasa
fonte
2
Em vez de manter duas perguntas semelhantes, a outra pergunta não deve ser fechada como duplicada e atualizar essa resposta?
Kaushal Modi
@kaushalmodi: Done!
wasamasa
2
Para alterações temporárias:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Eponymous 15/06
Suponho que isso fazia sentido quando os computadores eram muito mais lentos. Defini um valor alto no meu arquivo init por várias décadas.
Jim Balter