Pregunta:
En primer lugar, dado que esta es mi primera publicación aquí, solo me gustaría decir que he encontrado que VIM es una gran herramienta y que el foro aquí es muy útil para encontrar respuestas a preguntas, con muchas personas útiles que brindan asistencia invaluable. Todavía soy muy nuevo en VIM, así que casi todo lo que he aprendido sobre él proviene de aquí.
Mi pregunta es: sé cómo revertir TODAS las líneas en un archivo (: g / ^ / m0 entre otras formas), pero ¿hay alguna manera de revertir cada 4 líneas en un archivo, de modo que
line1
line2
line3
line4
line5
line6
line7
line8
...
se convierte en
line4
line3
line2
line1
line8
line7
line6
line5
...
Puede suponer que siempre habrá un múltiplo exacto de 4 líneas en dichos archivos.
Respuesta:
El comando :Reverse
explicado en Vim Wiki se puede usar para esto (puede incluirlo en su .vimrc
para hacerlo permanente):
command! -bar -range=% Reverse <line1>,<line2>g/^/m<line1>-1|nohl
Luego puede grabar una macro para ejecutar el comando en cada cuatro líneas:
qmV3j:Reverse<cr>4jq
1000@m
Explicación:
-
qm
: 'q' en modo normal inicia (y detiene) la grabación de una macro en un registro dado (registro 'm', en este caso, pero podría ser cualquier otra letra) -
V
: ingrese al modo visual y seleccione la línea actual -
3j
: expanda la selección visual a las siguientes 3 líneas -
:Reverse<cr>
: ejecuta el comando Reverse en las líneas seleccionadas (<cr>
aquí significa la tecla enter ) -
4j
: pasa a las siguientes líneas sin cambios -
q
: deja de grabar la macro -
1000@m
: ejecute la macro registrada en el registro 'm' 1000 veces (puede aumentar este número si su archivo tiene más de 4000 líneas)
Editar:
Como se menciona en los comentarios, puede usar una macro recursiva en lugar de usar un recuento:
qmV3j:Reverse<cr>4jq
qM@mq
@m
qM
: si el registro especificado paraq
está en mayúsculas, la macro se agrega al registro (lo cual también es útil cuando se da cuenta de cuándo se perdió los últimos pasos en una macro compleja)-
@m
: ejecuta la macro en el registrom
-
q
: deja de agregar la macro
A pesar de que se crea como una macro, puede crear un comando para esto si es una tarea común en su flujo de trabajo:
function! Reverse4()
let reg_m = @m
let @m = '<c-r><c-r>m'
normal! @m
let @m = reg_m
endfunction
command! Reverse4 call Reverse4()
function! Reverse4()
/endfunction
: define una nueva función-
let reg_m = @m
: guarda el contenido actual del registrom
-
let @m = "<cr><cr>m"
: inserte la macro en el registrom
– tenga en cuenta que<cr>
es la notación vim para Ctrl + r y que debe escribir esto, no copiar / pegar, por lo que su la línea será similar alet @m = 'V3j:Reverse^M4j@m'
y contendrá un carácter especial (^ M) -
normal! @m
: el comando normal ejecuta su argumento como se ha escrito en modo normal, por lo que ejecutará la macro recursiva -
let @m = reg_m
: restaura el contenido del registrom
, por lo que no tiene que recordar que este registro se está usando en esta función y evitar usarlo -
command! Reverse4 call Reverse4()
: crea un nuevo comando para esta función
Dependiendo de sus necesidades, puede mejorarlo, por ejemplo: pasar un argumento al comando y la función para que funcione para cualquier número de líneas en lugar de estar fijo en grupos de 4 líneas.