2011-07-29 18 views
20

¿Alguien sabe cómo si algo como esto Vim Relative Line Numbers existe para emacs? Yo uso vimpulse, y hombre, eso sería muy útil. Sé un poco de ceceo, así que si no lo hace, podría tratar de hacer lo mío, si tengo un punto en la dirección correcta.números de línea relativa en Emacs

actualización: Gracias a la respuesta correcta, se me ocurrió esto, que mostrará 1 de la línea actual, y -1 para la línea anterior, para combinar con tirones vimpulse y eliminaciones.

¡Gracias a todos los que ayudaron! Sé que no es exactamente lo que hace Vim, pero ¿de qué sirven los números de líneas relativas en vim que comienzan en cero? Tonto 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) 
+0

Al igual que Steve dijo, se utiliza vimpulse en Emacs. http://www.emacswiki.org/emacs/Vimpulse – phils

+0

@phils - ah, gracias, perdí ese pedazo de la publicación. – jtahlborn

+0

Steve, me he tomado la libertad de actualizar su versión con una corrección de errores para usar la cara correcta para la salida de la función de formato de línea. – phils

Respuesta

13

(2012-03-16:. Números de línea son ahora alineado a la derecha, y se muestran en la cara correcta)

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

Hay una linum-before-numbering-hook, pero esto se ejecuta después de punto se ha movido hasta el inicio de la memoria intermedia, por lo que no es útil para nuestro propósito.

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

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

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) 
+0

Dos preguntas. ¿Cómo puedo tener los números de línea negativos sin el prefijo '-'? ¿Y cómo puedo evitar que los números de línea obtengan la misma configuración de rostro en la línea que representan? Por ejemplo, los números de línea para las líneas comentadas obtienen el mismo color aplicado que los comentarios mismos. – jimeh

+0

Para eliminar el signo menos, simplemente llame a 'abs' para obtener el valor absoluto del número. es decir: '(number-to-string (abs (- line-number my-linum-current-line-number)))' – phils

+0

Para la pregunta dos, a mi código le faltaba un truco: cuando 'linum-format' es una función , el valor de retorno no se considera automáticamente con la cara de Linum. He actualizado el código anterior para encargarme de eso. A continuación, puede 'M-x personalizar-grupo RET linum RET' si desea modificar la cara aún más. – phils

4

Mira M-xlinum-mode y la variable linum-format.

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

Documentación:

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

+0

Ah, no lo había visto antes, solo puedo darle una función para crear la secuencia que se muestra en la línea ... buena idea, podría tratar de hacer mi propio este fin de semana. – Steve

9

me encontré con código de Scott Jaderholm para esto, y recordaba haber visto a esta pregunta, así que decidí hacer una referencia a the relevant lines in his .emacs.

Actualización: Si está utilizando MELPA (y debe ser!), Justo M-x paquete a instalar RET-Linum relativa.

+1

se ha movido a https://github.com/scottjad/linum-relativenumber –

+1

La biblioteca más completa y actualizada que proporciona esta funcionalidad en realidad parece ser [linum-relative] (http: //www.emacswiki. org/emacs/linum-relative.el), para lo cual [Melpa] (http://melpa.milkbox.net/) proporciona un paquete instantáneo ELPA. – sanityinc

+0

@sanityinc linum-relative no se instala desde melpa para mí con package.el o el-get. Como hiciste que funcionara? –

5

En una nota relacionada, si sólo está buscando para pasar a una línea específica, ace-jump-mode proporciona un comando ace-jump-line-mode que le permite saltar a una línea específica visible en la pantalla. Se utiliza letras en lugar de números de líneas, sin embargo:

ace-jump-mode screenshot

Cuestiones relacionadas