¿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?

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)


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
¿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

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

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.


1

Siempre puede intentar usar el sistema operativo ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perl no está en el sistema operativo.
dash-tom-bang
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.