Por ejemplo, si tengo cuatro líneas de la siguiente manera:
la primera línea
la segunda línea
la tercera línea
la cuarta línea
Quiero revertirlos a
la cuarta línea
la tercera línea
la segunda línea
la primera línea
¿Cómo podría hacer esto en Vim?
vim
editing
text-editors
text-editing
Jichao
fuente
fuente
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1
vi.stackexchange.com/a/2107/10254Respuestas:
Para invertir todas las líneas en un archivo,
Para una explicación ver
que también muestra cómo invertir solo un rango de líneas.
fuente
ma
), 2. mueva el cursor a la primera línea del bloque, 3. escriba:'a,.g/^/m 'a
Seleccione las líneas deseadas, presione
!
, y en el indicador resultante canalice las líneas a través detac
una:'<,'>!tac
. Verman tac
para más detalles.fuente
shift+v
para ingresar al modo de línea visual, luegoj
para agregar líneas a la selección.gvim
! De lo contrario, debe usar números de línea absolutos (tal vez puede usar relativo, pero debe tener cuidado) con el:g/^/m0
(que también es realmente difícil de recordar) ... Entonces, esencialmente, tac debe estar con vim sin importar qué plataforma estás en, PERO no es 100% vimscript, PERO a quién le importa: P:.,'a!tac
funciona con un mínimo esfuerzo.shift+v
, puede usar}
para llegar hasta el siguiente párrafo, o vaciar el espacio vertical. Además,man tac: concatenate and print files in reverse
.En Mac OS X,
tac
no existe, pero puede usarlotail -r
para el mismo efecto:Esto también funciona bien para el modo visual:
Extracto de
tail(1)
la página de manual de:fuente
alias tac='tail -r'
brew install coreutils
y usagtac
.Para aquellos que se sienten más cómodos con el modo Visual:
1. Identifique el número de línea sobre la selección que desea voltear usando
:set nu
.2.
Shift-V
para resaltar la selección que desea voltear (modo visual).3
:g/^/m <Line number from step 1>
..Tenga en cuenta que en modo visual se mostrará automáticamente como
:'<,'>g/^/m <Line number>
cuando escribe el comando de 3.Este comando funciona moviendo la selección una línea a la vez al número de línea que le da. Cuando el segundo elemento se inserta en el número de línea dado, empuja el primero hacia abajo hasta el número de línea + 1. Luego, el tercero empuja el primero y el segundo hacia abajo y así sucesivamente hasta que toda la lista ha sido empujada al número de línea único, lo que resulta en un lista de orden inverso.
fuente
'<
lugar de ingresar el número de línea manualmente. Simplemente comience la selección una línea antes y ejecute:'<,'>g/^/m'<
.Un comando
:Rev[erse]
y asignaciones opcionales para suvimrc
, para que no tenga que recordar y realizar los pasos no obvios de esta receta:(
:xmap
asigna para el modo Visual pero no para Seleccionar, como se:help mapmode-x
recomienda para asignar caracteres imprimibles).(Basado en: http://tech.groups.yahoo.com/group/vim/message/34305 )
fuente
:'<,'>g/^/m'<
:):-1,+1Rev
lo que estás buscando? Sepa que usted puede seleccionar visualmente el rango que desea revertir, por ejemplo:V7j:Rev
. Si eso no responde a su pregunta, no lo he entendido, por lo que necesitaría elaborarlo o reformularlo para mí.Digamos que está en la línea 3, por lo tanto, tenemos un rango de 3 a 6. Simplemente escriba.
fuente
:,6g/^/m2
; o cuando en la última línea de la gama::3,g/^/m2
; y:3,6g/^/m2
funciona desde cualquier parte del archivo.