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.