Относительные номера строк в Emacs
Кто-нибудь знает, как для emacs существует нечто подобное Vim Relative Line Numbers? Я использую Vimpulse, и человек, это было бы очень удобно иметь! Я знаю какой-то шут, поэтому, если это не так, я мог бы попытаться сделать свой собственный, если бы я получил точку в правильном направлении.
Обновление: благодаря правильному ответу, я пришел к этому, который покажет 1 для текущей строки и -1 для предыдущей строки, для объединения с vimpulse yanks и delete.
Огромное спасибо всем, кто помог! Я знаю, что это не совсем то, что делает Vim, но что хорошего в относительных номерах строк в vim, начинающихся с нуля?? Глупый Вим.
(defvar my-linum-current-line-number 0)
(setq linum-format 'my-linum-relative-line-numbers)
(defun my-linum-relative-line-numbers (line-number)
(let ((test2 (1+ (- line-number my-linum-current-line-number))))
(propertize
(number-to-string (cond ((<= test2 0) (1- test2))
((> test2 0) test2)))
'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)
6 ответов
(2012-03-16: номера строк теперь выровнены по правому краю и отображаются на правильной грани.)
Проблема здесь в том, что к тому времени обычай linum-format
функция вызвана, точка уже перемещена linum-update-window
) к рассматриваемой строке, поэтому мы больше не можем использовать ее для установления разницы между двумя строками; было бы просто напечатать ноль для каждой строки.
E сть linum-before-numbering-hook
, но это выполняется после перемещения точки в начало буфера, так что это бесполезно для нашей цели.
Следующий код решает проблему с помощью совета для linum-update
сохранить текущий номер строки, чтобы он был доступен для пользовательских linum-format
функция.
Для выравнивания чисел по правому краю я изначально использовал жестко заданную строку формата %3d
на основании того, что одно окно, отображающее более 100 строк кода, было не слишком вероятным. Если вы поклонник follow-mode
Однако (или просто иметь несколько окон в одном буфере) это обстоятельство становится чрезвычайно вероятным; поэтому код теперь вычисляет количество столбцов, необходимых динамически. Использование linum-before-numbering-hook
делает это более эффективным, чем подход по умолчанию dynamic
Линум формат.
Обратите внимание, что если вы закомментируете 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)
В Emacs 26.1 есть встроенный режим номера строки (display-line-numbers-mode)
, Включите его и установите (setq display-line-numbers 'relative)
использовать относительные номера строк.
Я только что наткнулся на код Скотта Джадерхольма для этого и вспомнил, что видел этот вопрос, поэтому я решил опубликовать ссылку на соответствующие строки в его.emacs.
Обновление: если вы используете MELPA (и вы должны это делать!), Просто Mx package-install RET linum-lative.
Что касается примечания, если вы хотите перейти только к определенной строке, ace-jump-mode предоставляет команду ace-jump-line-mode
это позволяет перейти к определенной строке, видимой на экране. Однако для строк используются буквы, а не цифры:
Посмотри на Mx linum-mode
и linum-format
переменная.
linum-format - это переменная, определенная в `linum.el'.
Его значение является динамическимДокументация:
Формат, используемый для отображения номеров строк.
Либо строка формата, такая как "%7d", "динамическая" для адаптации ширины по мере необходимости, либо функция, которая вызывается с номером строки в качестве аргумента и должна вычислять строку, которая будет отображаться в этой строке.
Смотрите также "linum-before-numbering-hook".
emacs 28, это сработало для меня
(global-display-line-numbers-mode 1)
(setq display-line-numbers-type 'relative)
может быть полезно
Раньше я использовал пакет «linum-relative», который конфликтовал с «diff-hl»: номера строк не были видны в регионах различий с контролем версии, собственные номера строк работают нормально!