vi - ¿cómo generar una secuencia numérica?


¿Hay una manera de generar una secuencia numérica en vi(m)?

Por ejemplo, de una fila aleatoria en un archivo (abierto en vim), diga Row-i - a una fila aleatoria, diga Row-j, donde Row-i

Digamos 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 numérica de la línea #4 a la línea #8 comenzando con el número 1 al número 5. Despues 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 número de pasos? ..por ejemplo, la secuencia debe ser 2, 4, 6, 8, 10.. es decir, con el paso cuenta 2.

Tenga EN CUENTA:

Esto SO post es similar pero no lo mismo.

Author: dreftymac, 2012-03-28

10 answers

Seleccione varias líneas con V (Shift-v), luego escriba comando a continuación:

:let i=1 | '<,'>g/^/ s//\=i . " "/ | let i+=2

Escriba :help sub-replace-expression para leer más.

 40
Author: kev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-30 02:23:32

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. Datos de ejemplo:

aaa
bbb
ccc

Primero inserte un número de inicio y un espacio :

1 aaa
bbb
ccc

Luego registre esta macro en la línea 1 (<C-a> significa presione CTRL-a):

qq0yf 0j0P0<C-a>q

Explicación:

  1. qq: registrar macro en registro q
  2. 0: vaya a la primera columna.
  3. yf: tira de todo hasta e incluyendo el primer espacio (recuerde que su primera línea tiene 1 y un espacio).
  4. 0jP: baja y pega el patrón al principio de la línea.
  5. 0<C-a>: vaya a la primera columna e incremente el número en uno.
  6. q: finalizar la grabación de macros.

Esto da:

1 aaa
2 bbb
ccc

Ahora puede aplicar esta macro usando @q el tiempo que desee. Si necesita un aumento de dos simplemente use CTRL-aCTRL-a en lugar de solo una vez. Ahora podría aplicar esta macro a líneas consecutivas, por ejemplo:

:.,$norm @q

Agregará números de línea iniciales para el resto de su archivo.

 25
Author: hochl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 08:56:03
: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, podría usar V para seleccionar las líneas que desea cambiar.

 9
Author: Kent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 08:36:29

Con Vim 8.0 se puede usar g Ctrl-a , véase :help v_g_CTRL-A

Vaya a la línea #4, use Ctrl-vpara seleccionar el primer carácter en bloque, presione Shift i, ingrese 1 (hay un espacio después del 1) y esc para salir del modo de inserción. El resultado se verá 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 de nuevo para seleccionar todos los 1 insertados excepto el primero. Pulse 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.

 5
Author: rkta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 07:23:59

Seleccione las líneas de destino en modo visual, luego ejecute el comando Ex

:'<,'>s/^/\=(line('.')-line("'<")+1).' '
 2
Author: ib.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 08:28:07

Aquí hay un truco sucio, pero entonces la vida se compone de estos. :)

ESC :r! for i in $(seq 1 10); do echo "This is line \#${i}"; done

No multiplataforma.

 1
Author: Noufal Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 08:29:36

Creo que todas las soluciones propuestas son demasiado difíciles de recordar, puede usarlo una vez, pero luego debe entrar en todos los detalles cada vez que lo use (si lo usa menos de una vez al día o así).

Encontré el script de incremento visual muy fácil de instalar y usar. Una vez instalado en vim, solo necesita generar una columna de 0, seleccionarla con Ctrl-V y escribir el comando :I. A continuación, generará automáticamente números crecientes en cada línea. También hay otras características:

  • comience con un número diferente de 0
  • números de teclado izquierdo o derecho 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ía

Esto resuelve un problema más general porque también funciona en una posición diferente de la columna 0, la columna solo tiene que ser seleccionable con Ctrl-V.

El vimball de la plugin es aquí o aquí.

 1
Author: Gismo Ranas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-15 13:54:54

El complemento Nexus proporciona el tipo de serie y un objeto, s1, del tipo utilizado de esta manera:

:4,8s/^/\=s1.next().' '/

Nexus también viene con un objeto Serie s0 que produce 0 como su primer objeto .next() resultado. Tanto s0 como s1 utilizan un incremento de 1 paso. Todos los objetos de la serie tienen una .método reset () que los devuelve a su valor iniciado. Se pueden crear nuevos objetos de serie como la siguiente llamada:

let s2 = Series(0, 2)

Que crea un objeto de 2 pasos que cumple con su segunda solicitud(rindiendo: 2, 4, 6, 8...)

 1
Author: dahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 15:16:23

(si su vim tiene soporte Perl default por defecto en muchas Distribuciones Linux): Seleccione las líneas en modo visual (V) y haga

:perldo s/^/++$z . " "/e
 0
Author: JJoao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 08:04:33

Un método menos flexible, pero fácil de recordar es usar un plugin 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 OP, se debe insertar algún número en su lugar. Renumber puede manejar el pedido real y lo hace basado en solo el primer número.

En este ejemplo estoy usando <C-v> para insertar el número inicial en todas las líneas que desee numerar.

4G<C-v>4jGI1 <Esc>gv:Renumber

Para usar pasos de dos

:Renumber s2

 -1
Author: Heikki Naski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 10:08:06