Относительные номера строк в 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»: номера строк не были видны в регионах различий с контролем версии, собственные номера строк работают нормально!

Другие вопросы по тегам