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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.