2010-11-19 10 views
20

Muchas veces parece que tengo una lista de elementos, y necesito agregar números delante de ellos. Por ejemplo:Macro para hacer listas numeradas en vim?

Item one 
Item two 
Item three 

Cuáles deberían ser:

1. Item one 
2. Item two 
3. Item three 

En vim, puedo presionar I en modo de edición, introduzca "1", el escape golpeado. Luego voy a la siguiente línea, presiono ., y luego ^A para incrementar el número. Esto parece enormemente ineficiente ... ¿cómo podría hacer una macro para poder pasar a la siguiente línea e insertar un número al principio que sea uno mayor que la línea anterior?

Respuesta

18

Puede grabar fácilmente una macro para hacerlo.

Primero inserte 1. al comienzo de la primera línea (hay un par de espacios después del 1. pero no puede verlos).

Vaya al inicio de la segunda línea y entre en modo de registro con qa.

Pulse la siguiente secuencia de teclas:

i       # insert mode 
<ctrl-Y><ctrl-Y><ctrl-Y> # copy the first few characters from the line above 
<ESC>      # back to normal mode 
|       # go back to the start of the line 
<ctrl-A>     # increment the number 
j       # down to the next line 
q       # stop recording 

Ahora se puede reproducir la grabación con @a (la primera vez; para los tiempos posteriores, se puede hacer @@ para repetir el último ejecutado macro) y se llevará agregue un nuevo número incrementado al inicio de cada línea.

+7

Utilice '3 @ a' para ejecutar la macro 3 veces –

+8

Me gustaría ir a' k^yWjP^ j' en su lugar. Es posible que el texto no esté al principio de la línea y, lo que es más importante, su macro no funcionará después de la décima línea. –

+0

Spot on, @Luc: precisamente como lo tenía yo mismo, excepto que vi un viraje hacia^hasta el final para que colocara el cursor al comienzo de la línea cuando terminara. No hubo diferencias funcionales debido al^al comienzo, solo me sentí un poco más ordenado. –

10

Seleccione sus líneas en modo visual con: V, a continuación, escriba:

:'<,'>s/^\s*\zs/\=(line('.') - line("'<")+1).'. ' 

que es fácil de poner en un comando:

command! -nargs=0 -range=% Number <line1>,<line2>s/^\s*\zs/\=(line('.') - <line1>+1).'. ' 
+0

Me gusta la repetibilidad de esto. Para líneas simples, es genial. Desafortunadamente, para * my * propósitos, cuando inserto numeración, suelo hacerlo en reStructuredText, y por lo tanto necesito esencialmente '}' funcionalidad, pero debido a la forma en que está haciendo conteo de líneas, simplemente reemplazando '^' con '\ n \ n' no lo cortaría Lástima, de lo contrario hubiera ingresado mi '.vimrc'. Buen código, de todos modos, no estaba al tanto de '\ =()' - ¡y no puedo encontrarlo en la ayuda de vim! –

+0

Puedes usar cualquier función que desees, como por ejemplo una función que cuente por sí misma. En ese caso, es posible que deba jugar con un comando que encapsula el "bucle", p. http://stackoverflow.com/questions/1809571/how-do-i-substitute-from-a-list-of-strings-in-vim/1809780#1809780. De lo contrario, consulte ': h sub-replace - \ =' –

+0

truco hermoso de line() - ¡aún no lo había encontrado! – egbutter

2

Puede utilizar la función de 'registro'. Es una manera fácil de grabar macros en Vim.

Ver: registro ayuda

En 'q' modo normal para empezar a grabar lo que se escribe en la 'a' registro Escriba el comando necesario insertar un número al principio de la línea, con copia a la siguiente línea y use CTRL-A para aumentar su valor. 'q' para finalizar la grabación y luego '@a' para reproducir la macro almacenada en el registro 'a' ('@@' repite la última macro).

Y puede hacer cosas como '20 @a 'para hacerlo veinte veces seguidas.

Es bastante útil para repetir la modificación del texto.

Dependiendo de los casos, es más fácil o más difícil de usar que una expresión regular.

6

También hay algunos plugins para hacer este tipo de trabajo si tiene que hacerlo en alguna ocasión:

http://vim.sourceforge.net/scripts/script.php?script_id=670

+0

No puedo estar más de acuerdo, un plugin dedicado para esa tarea es mucho mejor que una macro casera, y esto porque crear series es una tarea que tendrá más de una vez. – Benoit

2

Tal vez no es una solución macro, pero al menos es fácil.

añadir números a todas las líneas

Es posible utilizar :%!nl -ba:%!cat -n o comandos que se sumarán los números de línea a todas las líneas.

En Windows, debe tener instalado Cygwin/MSYS/SUA.

añadir números a líneas seleccionadas

Para añadir números sólo para las líneas seleccionadas, por favor seleccione en el modo visual (v y cursores), a continuación, cuando haya terminado - ejecutar el comando: :%!nl (ignoran las líneas en blanco) o :%!cat -n (líneas en blanco incluidas).

formatear

Para eliminar espacios adicionales, seleccione y en el bloque visual (Ctrl + v) y sacarlas (x).

Para añadir algunos caracteres (., :, )) después de los números, seleccione y en el bloque visual (Ctrl + v), tiene que poner el carácter (Un, escriba el carácter, y luego terminar con Esc).

+0

Para agregar algunos caracteres ('.') puede usar': '<,'> normal a' en las líneas seleccionadas. Como la selección se hizo antes, repítelo con 'gv'. – wryrych

0

Inserte un número al comienzo del bloque de texto, por ejemplo.

1. Item One

Entre el mandato modo normal vim como sigue:

qb^yW+P^<Ctrl-A>q 

Esto significa:

qb  # start recording macro 'b' 
^  # move to start of text on the line 
yW  # 'yank' or copy a word including the ending whitespace. 
+  # move one line down to the start of the next line 
P  # place text ahead of the cursor 
^  # move to start of text 
<Ctrl-A> # increment text 
q  # Finish recording macro 

Lo que esto le permite hacer es repetición de la macro a través de la última línea de lista numerada tantas veces como sea necesario.

Cuestiones relacionadas