(2012-03-16: номера строк теперь выровнены по правому краю и отображаются с правильным лицом.)
Проблема заключается в том, что к тому времени пользовательский linum-format
вызвана функция, точка уже перемещена (на linum-update-window
) к рассматриваемой линии, поэтому мы больше не можем использовать ее для установления разницы между двумя линиями;он просто напечатает ноль для каждой строки.
Существует linum-before-numbering-hook
, но он запускается после того, как точка была перемещена в начало буфера, так что это бесполезно длянаша цель.
Следующий код решает проблему, используя рекомендации для linum-update
для сохранения текущего номера строки, чтобы он был доступен для пользовательской функции linum-format
.
ДляВыровняйте числа по правому краю. Сначала я использовал жестко заданную строку формата %3d
на том основании, что одно окно с более чем 100 строками кода не слишком вероятно.Однако, если вы фанат follow-mode
(или просто имеете несколько окон в одном буфере), это обстоятельство становится чрезвычайно вероятным;поэтому код теперь вычисляет количество столбцов, необходимых динамически.Использование linum-before-numbering-hook
делает это более эффективным, чем подход, принятый по умолчанию в формате dynamic
linum.
Обратите внимание, что если вы закомментируете add-hook
, используется более быстрый нединамический подход.
(defvar my-linum-format-string "%3d")
(add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)
(defun my-linum-get-format-string ()
(let* ((width (1+ (length (number-to-string
(count-lines (point-min) (point-max))))))
(format (concat "%" (number-to-string width) "d")))
(setq my-linum-format-string format)))
(defvar my-linum-current-line-number 0)
(setq linum-format 'my-linum-relative-line-numbers)
(defun my-linum-relative-line-numbers (line-number)
(let ((offset (- line-number my-linum-current-line-number)))
(propertize (format my-linum-format-string offset) 'face 'linum)))
(defadvice linum-update (around my-linum-update)
(let ((my-linum-current-line-number (line-number-at-pos)))
ad-do-it))
(ad-activate 'linum-update)