vim - serie - terminos de sucesiones
vi-¿cómo generar una secuencia numérica? (10)
¿Hay alguna manera de generar una secuencia numérica en vi (m)?
Por ejemplo, desde una fila al azar en un archivo (abierto en vim), diga Fila-i - a una fila aleatoria, digamos Fila-j, donde Fila-i <Fila-j, ¿hay alguna manera de generar secuencia numérica desde Fila? -i a Row-j comenzando con el número 1 al número j-i + 1 con incremento de paso como 1?
Supongamos que tengo las siguientes líneas en un archivo.
this is line #1
this is line #2
this is line #3
this is line #4
this is line #5
this is line #6
this is line #7
this is line #8
this is line #9
this is line #10
Quiero prefijar la secuencia de números de la línea 4 a la línea 8, comenzando con el número 1 al número 5. Después de la operación, el archivo resultante debe ser el siguiente:
this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #10
Si esto es posible, ¿hay alguna manera de aumentar el conteo de pasos? ..por ejemplo, la secuencia debe ser 2, 4, 6, 8, 10 ... es decir, con el conteo de pasos 2.
Tenga en cuenta:
Esta publicación SO es similar pero no es lo mismo.
(si su vim tiene soporte Perl - predeterminado en muchas distribuciones de Linux): Seleccione las líneas en modo visual (V) y haga
:perldo s/^/++$z . " "/e
Aquí hay un truco sucio, pero la vida está compuesta de estos. :)
ESC :r! for i in $(seq 1 10); do echo "This is line /#${i}"; done
No es una plataforma cruzada.
Con Vim 8.0 uno puede usar g Ctrl-a , ver :help v_g_CTRL-A
Vaya a la línea 4, use Ctrl-v para bloquear, seleccione el primer carácter, presione Mayús y escriba 1
(hay un espacio después de 1) y esc para salir del modo de inserción. El resultado será así:
this is line #1
this is line #2
this is line #3
1 this is line #4
1 this is line #5
1 this is line #6
1 this is line #7
1 this is line #8
this is line #9
this is line #10
Ahora, comenzando desde la línea 5, use Ctrl-v nuevamente para seleccionar todos los insertados 1
excepto el primero. Presione g Ctrl-a para crear una secuencia.
this is line #1
this is line #2
this is line #3
1 this is line #4
2 this is line #5
3 this is line #6
4 this is line #7
5 this is line #8
this is line #9
this is line #1
Use 2g Ctrl-a para usar un conteo de pasos de 2.
Creo que todas las soluciones propuestas son demasiado difíciles de recordar, puedes usarlas una sola vez, pero luego debes consultar todos los detalles cada vez que la uses (si la usas menos de una vez al día).
Encontré el script de incremento visual realmente fácil de instalar y usar. Una vez que está instalado en vim, solo necesita generar una columna de 0, seleccionarla con Ctrl-V y escribir el comando: I. Luego generará automáticamente números crecientes en cada línea. También hay otras características:
- comenzar con un número diferente de 0
- números de almohadilla izquierda o derecha con 0 (como 001, ..., 015)
- números decrecientes o crecientes
- aumentar en más de 1
- fechas (pero necesita un complemento adicional), letras del alfabeto, nombres de días
Esto resuelve un problema más general porque también funciona en una posición diferente a la columna 0, la columna tiene que ser seleccionable con Ctrl-V.
El complemento Nexus proporciona el tipo de serie y un objeto, s1, de ese tipo usado así:
:4,8s/^//=s1.next().'' ''/
Nexus también viene con un objeto de la serie s0 que arroja 0 como su primer resultado .next (). Tanto s0 como s1 usan un incremento de 1 paso. Todos los objetos de la serie tienen un método .reset () que los devuelve a su valor iniciado. Los nuevos objetos de la serie se pueden crear como la siguiente llamada:
let s2 = Series(0, 2)
que crea un objeto de 2 pasos que cumple su segunda solicitud (rendimiento: 2, 4, 6, 8 ...)
En lugar de una construcción complicada, simplemente podría usar una macro con la función CTRL-a para incrementar un número inicial. Ejemplo de datos:
aaa
bbb
ccc
primero inserte un número de inicio y un espacio :
1 aaa
bbb
ccc
luego grabe esta macro en la línea 1 ( <Ca>
significa presionar CTRL-a ):
qq0yf 0j0P0<C-a>q
Explicación:
-
qq
: registra macro en el registroq
-
0
: ir a la primera columna. -
yf
: tira todo hasta e incluyendo el primer espacio (recuerda que tu primera línea tiene1
y un espacio). -
0jP
: baja y pega el patrón al comienzo de la línea. -
0<Ca>
: vaya a la primera columna e incremente el número en uno. -
q
: finaliza la grabación de macro.
esto da:
1 aaa
2 bbb
ccc
ahora puedes aplicar esta macro usando @q
tiempo que quieras. Si necesita un aumento de dos, simplemente use CTRL-a CTRL-a en lugar de solo una vez. Ahora podría aplicar esta macro a líneas consecutivas, por ejemplo:
:.,$norm @q
agregará los principales números de línea para el resto de su archivo.
Seleccione las líneas de destino en modo Visual, luego ejecute el comando Ex
:''<,''>s/^//=(line(''.'')-line("''<")+1).'' ''
Seleccione varias líneas con V (Shift-v), luego escriba el comando a continuación:
:let i=1 | ''<,''>g/^/ s///=i . " "/ | let i+=2
Escriba :help sub-replace-expression
para leer más.
Un método menos flexible pero fácil de recordar es usar un complemento de renumeración como Renumber.vim http://www.vim.org/scripts/script.php?script_id=189
Si todavía no hay números, como en el PO, se debe insertar un número en su lugar. Renumerar puede manejar el pedido real y lo hace en función del solo primer número.
En este ejemplo, estoy usando <Cv>
para insertar el número inicial en todas las líneas que desea numerar.
4G<Cv>4jGI1 <Esc>gv:Renumber
Para usar los pasos de dos
:Renumber s2
:4,8s/^//=line(".")-3." "
hará lo que quieras
si necesitas contar = 2:
:4,8s/^//=2*(line(".")-3)." "
esto te dará 2,4,6,8,10
los números de línea están codificados en mi ejemplo, puede usar V para seleccionar las líneas que desea cambiar.