Какой фрагмент кода в Emacs заставляет `line-number-mode` печатать« ?? »как номер строки в буферах с длинными строками?

21

Я использую line-number-modeиндикатор текущей строки в моей моделине, однако для больших файлов или, скорее, для файлов с длинными строками, он начинает отображать два знака вопроса вместо номера строки. Я немного покопался и обнаружил, что, хотя line-number-modeон определен в simple.el, настраиваемые переменные (и, вероятно, вся задействованная логика) определены в xdisp.c. Изменение line-number-display-widthпеременной на произвольно большое число может исправить это, но меня гораздо больше интересует фрагмент кода и логика, которая заставляет его печатать два вопросительных знака. Было бы очень полезно, если бы кто-нибудь из вас смог найти это для меня, возможно, даже объяснить логику этого.

wasamasa
источник
2
M-: (format-mode-line "%l")Показывает ли знаки вопроса тоже?
lunaryorn
Да, это дает мне "??" как результат оценки.
Васамаса
1
Ну, тогда взгляните на определение format-mode-line.
lunaryorn

Ответы:

25

Благодаря предложениям @ lunaryorn я смог найти фрагмент кода, вызывающий это. Похоже, что в format-mode-lineконце концов вызовы decode_mode_specпревращают данные коды формата в значения. В случае %lэтой функции выполняется несколько проверок работоспособности, чтобы не тратить слишком много времени на вычисления, а затем проверяется, превышает ли текущая строка line-number-display-limit-width. Так как это относится к моему файлу, о котором идет речь, он переходит на no_valueметку, которая возвращает заполненное ??значение.

«Решение» включает в себя установку переменной на достаточно высокое значение:

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

Это значение было получено путем просмотра соответствующей эвристики, в xdisp.cкоторой берется высота окна, умноженная на два плюс тридцать, и умножается на нее line-number-display-limit-width, чтобы избежать переполнения most-positive-fixnumв 32-битной системе, значение 2000000 будет безопасной ставкой.

wasamasa
источник
2
Вместо того, чтобы оставлять два одинаковых вопроса, не следует ли закрыть другой вопрос как дубликат и обновить вместо этого ответ?
Каушал Моди
@kaushalmodi: Готово!
Васамаса
2
Для временных изменений:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
Одноименный
Я полагаю, это имело смысл еще тогда, когда компьютеры были намного медленнее. Я установил его на высокое значение в моем файле инициализации в течение нескольких десятилетий.
Джим Балтер