Относительные номера строк в Emacs - PullRequest
21 голосов
/ 29 июля 2011

Кто-нибудь знает, как, если что-то подобное Относительные номера строк Vim существует для emacs?Я использую Vimpulse, и человек, это было бы очень удобно иметь!Я знаю какой-то шут, поэтому, если это не так, я могу попытаться сделать свой собственный, если я получу точку в правильном направлении.

Обновление : Благодаря правильному ответу,Я придумал это, это покажет 1 для текущей строки и -1 для предыдущей строки, для объединения с vimpulse yanks и delete.

Огромное спасибо всем, кто помог!Я знаю, что это не совсем то, что делает Vim, но что хорошего в относительных номерах строк в 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)

Ответы [ 5 ]

13 голосов
/ 03 августа 2011

(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)
9 голосов
/ 25 октября 2011

Я только что наткнулся на код Скотта Джадерхольма для этого и вспомнил, что видел этот вопрос, поэтому я решил опубликовать ссылку на соответствующие строки в его .emacs .

Обновление: если вы используете MELPA (и вы должны быть!), Просто Mx пакет-установка RET linum-относительный .

5 голосов
/ 30 января 2014

В связанной ноте, если вы хотите перейти только к определенной строке, ace-jump-mode предоставляет команду ace-jump-line-mode, которая позволяет перейти к определенной строке, видимой на экране.Однако для строк используются буквы, а не цифры:

ace-jump-mode screenshot

4 голосов
/ 28 января 2019

В Emacs 26.1 есть встроенный режим номера строки (display-line-numbers-mode).Включите его и установите (setq display-line-numbers 'relative) для использования относительных номеров строк.

4 голосов
/ 29 июля 2011

Посмотрите на Mx linum-mode и переменную linum-format.

linum-format - это переменная, определенная в `linum.el '.
Ее значениеявляется динамическим

Документация:

Формат, используемый для отображения номеров строк.
Либо строка формата, например "% 7d", "динамическая", чтобы адаптировать ширину по мере необходимости, либо функция, котораявызывается с номером строки в качестве аргумента и должен вычисляться как строка, отображаемая в этой строке.
См. также `linum-before-numbering-hook '.

...