Подтвердить что ты не робот

Относительные номера строк в 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)
4b9b3361

Ответ 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) для использования относительных номеров строк.