vimscript – ¿Cómo invertir cada 4 líneas?

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 para q 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 registro m
  • 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 registro m
  • let @m = "<cr><cr>m" : inserte la macro en el registro m – 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 a let @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 registro m , 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.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım