Относительные номера строк в Emacs
Кто-нибудь знает, как если что-то вроде этого Vim Relative Line Numbers существует для emacs? Я использую vimpulse и человека, что было бы очень удобно! Я знаю несколько lisp, поэтому, если это не так, я мог бы попытаться сделать свой собственный, если бы у меня была точка в правильном направлении.
Обновление:
Благодаря правильному ответу, я придумал это, что покажет 1 для текущей строки и -1 для предыдущей строки, для объединения с vimpulse yanks и удаления.
Спасибо тонне всем, кто помог! Я знаю, что это не совсем то, что делает 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)
Ответы
Ответ 1
(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)
Ответ 2
Я просто натолкнулся на код Скотта Ядерхольма для этого и вспомнил, что видел этот вопрос, поэтому решил опубликовать ссылку на соответствующие строки в его .emacs.
Обновление: если вы используете MELPA (и вы должны быть!), просто M-x package-install RET linum-relative.
Ответ 3
В соответствующей заметке, если вы хотите перейти только к определенной строке, ace-jump-mode предоставляет команду ace-jump-line-mode
, которая позволяет перейти к определенной строке, видимой на экране. Однако он использует буквы, а не цифры для строк:
![ace-jump-mode screenshot]()
Ответ 4
Посмотрите M-x linum-mode
и linum-format
.
linum-format - это переменная, определенная в `linum.el '.
Его значение динамическое
Документация:
Формат, используемый для отображения номеров строк.
Либо строка формата, как "% 7d", "dynamic" для адаптации ширины по мере необходимости, или функцию, которая вызывается с номером строки в качестве ее аргумент и должен оценивать строку, которая будет показана на этой строке.
См. Также "linum-before-numbering-hook".
Ответ 5
В Emacs 26.1 есть встроенный режим номера строки (display-line-numbers-mode)
. Включите его и установите (setq display-line-numbers 'relative)
для использования относительных номеров строк.