Como as linhas selecionadas reversas são ordenadas no vim?

84

Por exemplo, se eu tiver quatro linhas da seguinte forma:

the first line
the second line
the third line
the fourth line

Quero reverter para

the fourth line
the third line
the second line
the first line

Como eu poderia fazer isso no vim?

    
por Jichao 18.09.2010 / 01:57

6 respostas

82

Para reverter todas as linhas em um arquivo,

:g/^/m0

Para uma explicação, veja

:help 12.4

que também mostra como reverter apenas um intervalo de linhas.

    
por 18.09.2010 / 02:35
62

Selecione as linhas desejadas, pressione ! e, no prompt resultante, canalize as linhas por tac a la :'<,'>!tac . Veja man tac para mais detalhes.

    
por 16.08.2012 / 16:01
29

No Mac OS X, tac não existe, mas você pode usar tail -r para o mesmo efeito:

:%!tail -r

Isso também funciona bem para o modo visual:

:'<,'>!tail -r

Trecho da manpage de tail(1) :

The -r option causes the input to be displayed in reverse order, by line. Additionally, this option changes the meaning of the -b, -c and -n options. When the -r option is specified, these options specify the number of bytes, lines or 512-byte blocks to display, instead of the bytes, lines or blocks from the beginning or end of the input from which to begin the display. The default for the -r option is to display all of the input.

    
por 03.06.2013 / 19:18
3

Para aqueles mais confortáveis com o modo visual:
 1. Identifique o número da linha acima da seleção que você deseja inverter usando :set nu .
 2. Shift-V para realçar a seleção que você deseja inverter (modo visual).
 3. :g/^/m <Line number from step 1> .

Note que no modo visual ele aparecerá automaticamente como      :'<,'>g/^/m <Line number> quando você digita no comando de 3.

Este comando funciona movendo a seleção de uma linha por vez para o número da linha que você fornece. Quando o segundo item é empurrado para o número de linha dado, ele empurra o primeiro para baixo para o número de linha + 1. Então o terceiro empurra o primeiro e o segundo para baixo e assim por diante até que toda a lista tenha sido empurrada para o número de linha único resultando em um lista ordenada inversa.

    
por 13.06.2016 / 22:52
2

Um comando :Rev[erse] e mapeamentos opcionais para o seu vimrc , para que você não precise lembrar e executar as etapas não óbvias desta receita:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

( :xmap mapeia para o modo Visual, mas não o modo Seleção, pois :help mapmode-x aconselha o mapeamento de caracteres imprimíveis.)

(Com base em: link )

    
por 09.02.2012 / 12:10
1

Digamos que você esteja na linha 3, por isso temos um intervalo de 3 a 6. Basta digitar.

:3,6g/^/m2
    
por 17.02.2018 / 11:25