¿Puede Vim escribir líneas incrementales? es decir, en cada línea A se convierte en B, y 1 se convierte en 2

8

Quería escribir esto:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

Terminé usando LibreCalc, colocando las diferentes partes en diferentes celdas, agregando las letras y los números, concatenando los resultados y pegando el lote nuevamente en Vim.

Aprecio que lo que quería escribir es un código horrible. Estoy estudiando Python en este momento y he estado tratando de evitar ir a buscar información que sé que se cubrirá más adelante en el curso que estoy siguiendo ( http://interactivepython.org/ ).

La forma más rápida que supe de hacer esto en vim fue escribir algo como

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

Sé que vim es muy poderoso (lo he estado usando durante un par de semanas, realmente lo estoy disfrutando).

¿Hubiera sido posible escribir lo que quería con algún comando vim?

Duncan Betts
fuente

Respuestas:

11

Si bien se puede hacer con secuencias de comandos, si tiene una versión muy reciente de Vim (por ejemplo, la de Arch Linux), puede usar g Ctrl-apara incrementar un bloque visual. En tu caso:

  1. Escribe la línea original: A = mapping[0] Esc
  2. Yank línea y poner 25 copias de la siguiente: yy25p
  3. Seleccione visualmente la columna que contiene el 0carácter (selección de bloque, usando Ctrl-v), excluyendo el 0de la primera línea (para que termine con una columna que contenga los últimos 25 ceros), luego increméntelos con g Ctrl-a.
  4. Aplicar el mismo método para la columna que contiene A.

( Nota : Como muestran los comentarios, uno necesita agregar alphaa las nrformatsopciones, para poder incrementar letras, por ejemplo:. set nrformats+=alphaMi vimrc tiene:, set nrformats=hex,alphadeshabilitando así el incremento octal y binario, que no uso)

VanLaser
fuente
yy no funciona para mi Puedo ver en la hoja de trucos que imprimí de www.vimcheatsheet.com que este es un comando muy estándar. vim --version devuelve esto: pastebin.com/DcFxZh1S . Tendré que investigar por qué no me funciona ... (Lo he intentado en los modos de comando visual e inserción). Además, cuando pego, todo aparece en la misma línea. Sin embargo, he probado g Ctrl-a y hace exactamente lo que quería, gracias :)
Duncan Betts
1
:verbose map ydebería mostrarle qué asignaciones que comienzan con yusted y dónde se establecieron. Pero tienes que usar yyen modo normal.
VanLaser
1
Corregido: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Duncan Betts
1
¿Qué versión de vimse incrementará Aa Bla Ctrl-aacción? El mío definitivamente no, y estoy en 7.4 1-1202.
Cory Klein
44
@CoryKlein Intenta escribir :set nrformats+=alpha. Agregará el valor alphaa la opción 'nrformats'y debería permitir Ctrl-a"incrementar" los caracteres alfabéticos. Si le gusta este comportamiento, puede agregarlo a su vimrc. De lo contrario, puede agregarlo a la opción con el operador +=y eliminarlo luego con el operador -=( :set nrformats-=alpha).
saginaw
6

Prefiero la solución de incremento visual que @VanLaser usó (Ver :h v_CTRL-A). Sin embargo, mostraré que esto también se puede hacer a través de macro.

Empezar con:

A = mapping[0]

Registre las siguientes pulsaciones de teclas en una macro de su elección (por ejemplo q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

Esto duplicará la línea y luego incrementará el primer carácter (p A. Ej. ) Y luego incrementará la parte del número. Ejecute esta macro 24 veces y listo, por ejemplo 24@q.

  • qq - comenzar a grabar en el registro q
  • yyp - duplicar la línea
  • :set nrformats+=alpha<cr>- 'nrformatsno tiene alphapor defecto
  • <c-a>- Con alphaahora podemos incrementar letras
  • :set nrformats-=alpha<cr>- eliminar alphade'nrformats'
  • <c-a> - incremente el siguiente número
  • q - para de grabar
  • 24@q- reproducir macro en el registro q24 veces

Para más ayuda ver:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
fuente
Nice one :) 25?
VanLaser
1
@VanLaser: 1 (línea de inicio) + 1 (grabación de la macro) + 24 = 26.
Peter Rincker
4

Buenas respuestas ya proporcionadas, no habría pensado en hacerlo tan bien. Hubiera escrito todas las letras en una sola línea y luego hubiera introducido texto y salto de línea con una sustitución de expresión (usando el número de línea para el número incremental), algo así como

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
fuente
muy genial ! (+1)
JJoao
2

Casi siempre cuando hago algo como esto, elijo usar :substitutesobre macros. Especialmente la capacidad de evaluar la expresión en reemplazo cuando se comienza lo \=hace a menudo posible (ver :h sub-replace-special).

Una vez que tenga líneas vacías en su lugar ( 25i<Enter><Esc>), puede usar el comando

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

las secuencias necesarias se generan usando el número de línea ( '.'argumento) actual devuelto por la función line(), y usando nr2char () para convertir números decimales a equivalentes ASCII (65 = A). Las cadenas necesarias se concatenan usando.

Sakari Cajanus
fuente
1

Siempre puede intentar usar el sistema operativo ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
fuente
1
Perl no está en el sistema operativo.
dash-tom-bang