Jaki fragment kodu w Emacsie powoduje, że tryb „numer-linia” wypisuje „??” jako numer linii w buforach z długimi liniami?

21

Używam, line-number-modeaby mieć wskaźnik bieżącej linii w moim modelu, jednak w przypadku dużych plików, a raczej plików z długimi liniami, zaczyna wyświetlać dwa znaki zapytania zamiast numeru linii. Wykopałem trochę i odkryłem, że chociaż line-number-modejest zdefiniowane w simple.el, zmienne, które można dostosowywać (i prawdopodobnie cała logika) są zdefiniowane w xdisp.c. Zmiana line-number-display-widthzmiennej na dowolnie wysoką liczbę może to naprawić, ale bardziej interesuje mnie fragment kodu i logika, która powoduje, że wypisuje on dwa znaki zapytania. Byłoby bardzo przydatne, gdyby ktokolwiek z was mógł to dla mnie znaleźć, może nawet wyjaśnić logikę, która się za tym kryje.

wasamasa
źródło
2
Czy mają również M-: (format-mode-line "%l")znaki zapytania?
lunaryorn
Tak, daje mi to „??” jako wynik oceny.
wasamasa,
1
Więc spójrz na definicję format-mode-line.
lunaryorn,

Odpowiedzi:

25

Dzięki sugestiom @ lunaryorn udało mi się zlokalizować kod powodujący to. Wygląda na to, że w format-mode-linekońcu wywołania decode_mode_speczamieniają podane kody formatu na wartości. W przypadku %ltej funkcji wykonuje kilka kontroli poprawności, aby uniknąć spędzania zbyt dużo czasu na obliczeniach, a następnie sprawdza, czy bieżąca linia przekracza line-number-display-limit-width. Ponieważ dotyczy to mojego pliku, przeskakuje on do no_valueetykiety, która zwraca wartość wypełnienia ??jako wartość.

„Rozwiązanie” polega na ustawieniu zmiennej na wystarczająco wysoką wartość:

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

Wartość tę uzyskano, patrząc na odpowiednią heurystykę, w xdisp.cktórej przyjmuje się wysokość okna razy dwa plus trzydzieści i mnoży ją line-number-display-limit-width, aby uniknąć przepełnienia most-positive-fixnumw systemie 32-bitowym, wartość 2000000 byłaby bezpiecznym zakładem.

wasamasa
źródło
2
Zamiast utrzymywać dwa podobne pytania, czy drugie pytanie nie powinno zostać zamknięte jako duplikat i zamiast tego zaktualizować tę odpowiedź?
Kaushal Modi
@kaushalmodi: Gotowe!
wasamasa
2
W przypadku tymczasowych zmian:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Tytułowy
Przypuszczam, że miało to sens, gdy komputery działały znacznie wolniej. Przez kilka dziesięcioleci ustawiłem wysoką wartość w moim pliku init.
Jim Balter