emacs line-numbers vimpulse

Números de línea relativos en Emacs



line-numbers vimpulse (4)

¿Alguien sabe si existe algo como este Vim Relative Line Numbers para emacs? Yo uso vimpulse, y hombre, eso sería muy útil tener! Conozco algunos lisp, así que si no lo hace, podría intentar hacer el mío, si tengo un punto en la dirección correcta.

Actualización : gracias a la respuesta correcta, se me ocurrió esto, que mostrará 1 para la línea actual y -1 para la línea anterior, para combinar con vimpulse yanks y eliminar.

¡Muchas gracias a todos los que ayudaron! Sé que no es exactamente lo que hace Vim, pero ¿de qué sirven los números de línea relativos en vim que comienzan en cero? Tonta 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)


Acabo de encontrar el código de Scott Jaderholm para esto, y recordé haber visto esta pregunta, así que decidí publicar un enlace a las líneas relevantes en sus .emacs .

Actualización: Si está utilizando MELPA (¡y debería estarlo!), Solo instale Mx package-install RET linum-relative .


En una nota relacionada, si solo estás buscando moverte a una línea específica, ace-jump-mode proporciona un comando ace-jump-line-mode que te permite saltar a una línea específica visible en la pantalla. Sin embargo, utiliza letras en lugar de números para las líneas:


Mire el linum-mode Mx y la variable de linum-format .

linum-format es una variable definida en `linum.el ''.
Su valor es dinámico.

Documentación:

Formato utilizado para mostrar los números de línea.
Ya sea una cadena de formato como "% 7d", `dinámica ''para adaptar el ancho según sea necesario, o una función que se llame con un número de línea como argumento y debe evaluar una cadena que se mostrará en esa línea.
Véase también `linum-before-numbering-hook ''.


(2012-03-16: los números de línea ahora están alineados a la derecha y se muestran en la cara correcta).

El problema aquí es que cuando se llama a una función de linum-format personalizada, el punto ya se ha movido (mediante linum-update-window ) a la línea en cuestión, por lo que ya no podemos usarlo para establecer la diferencia entre los dos. líneas; simplemente imprimiría un cero para cada línea.

Hay un linum-before-numbering-hook , pero esto se ejecuta después de que el punto se haya movido al inicio del búfer, por lo que no es útil para nuestro propósito.

El siguiente código resuelve el problema usando consejos para linum-update para almacenar el número de línea actual, de modo que esté disponible para la función de linum-format personalizada.

Para alinear a la derecha los números, inicialmente utilicé una cadena de formato codificada de %3d sobre la base de que no era muy probable una sola ventana que muestre más de 100 líneas de código. Sin embargo, si eres un fanático del follow-mode de follow-mode (o simplemente tienes varias ventanas en el mismo búfer), esa circunstancia es extremadamente probable; por lo que el código ahora calcula el número de columnas requeridas dinámicamente. El uso de linum-before-numbering-hook hace esto más eficiente que el enfoque adoptado por el formato dynamic predeterminado de linum.

Tenga en cuenta que si comenta el add-hook , se utiliza el enfoque no dinámico más rápido.

(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)