Який фрагмент коду в Emacs робить "рядок-номер-режим" друкувати "??" як номер рядка в буферах з довгими рядками?


21

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


2
Чи M-: (format-mode-line "%l")відображаються також позначки питань?
місячник

Так, це дає мені "??" як результат оцінки.
wasamasa

1
Ну, тоді погляньте на визначення format-mode-line.
місячник

Відповіді:


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-fixnum32-бітної системи, значення 2000000 було б безпечною ставкою.


2
Замість того, щоб зберігати два подібних питання, чи не слід інше запитання закривати як дублікат і не оновлювати цю відповідь замість цього?
Каушал Моді

@kaushalmodi: Готово!
wasamasa

2
Для тимчасових змін:M-x set-variable <RET> line-number-display-limit-width <RET> 2000000 <RET>
однойменний

Я думаю, це мало сенс ще тоді, коли комп'ютери були набагато повільнішими. Я мав це встановити високе значення в моєму файлі init протягом декількох десятиліть.
Джим Балтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.