Questão Como as linhas selecionadas reversas ordenam no vim?


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

a primeira linha
  a segunda linha
  a terceira linha
  a quarta linha

Eu quero reverter eles para

a quarta linha
  a terceira linha
  a segunda linha
  a primeira linha

Como eu poderia fazer isso no vim?


79


origem


Duplicar em Estouro de pilha: Como virar uma seleção visual no vim? - Palec
Relacionado: Reverter todas as linhas @ Vim Wikia - Palec
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1  vi.stackexchange.com/a/2107/10254 - qeatzy


Respostas:


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.


79



Ótima dica sobre a exata seção de ajuda! Para resumir: 1. defina um marcador na última linha que deseja inverter (nomeio o marcador 'a' usando ma), 2. mova o cursor para a primeira linha do bloco, 3. digite :'a,.g/^/m 'a - Brent Faust
Sim, incluindo o resposta real aqui nos sites do Stack Exchange é uma obrigação; referindo-se a uma fonte externa não é suficiente. (Citando isso, porém, adereços.) - ELLIOTTCABLE


Selecione as linhas desejadas, clique em !, e no canal de prompt resultante as linhas através tac a la :'<,'>!tac. Vejo man tac para mais detalhes.


58



Para selecionar as linhas, use shift+v para entrar no modo de linha visual, j para adicionar linhas à seleção. - wisbucky
Posso confirmar que isso funciona em janelas com gvim, também! Caso contrário, você tem que usar números de linha absolutos (talvez você pode usar parente, mas você tem que ter cuidado) com o :g/^/m0 (o que também é realmente difícil de lembrar) ... Então, essencialmente, tac deve estar com o vim não importa em qual plataforma você está, MAS não é 100% vimscript, MAS quem se importa: P - dylnmc
isso é incrível !!!! - itzjustricky


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 de tail(1)Manpage:

A opção -r faz com que a entrada seja exibida na ordem inversa, por   linha. Além disso, esta opção altera o significado do -b, -c e   -n opções. Quando a opção -r é especificada, essas opções especificam o número de bytes, linhas ou blocos de 512 bytes a serem exibidos, em vez de   os bytes, linhas ou blocos do começo ou fim da entrada de   qual começar a exibição. O padrão para a opção -r é   exibir toda a entrada.


28



Excelente! Então, para fornecer 'tac' no OS X: alias tac='tail -r' - Brent Faust
Você também pode brew install coreutils E use gtac. - Andrew Marshall


Para aqueles mais confortáveis ​​com o modo visual:
 1. Identifique o número da linha acima da seleção que você deseja invertida :set nu.
 2 Shift-V para realçar a seleção que você quer invertida (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 o comando de 3.

Esse comando funciona movendo a seleção de uma linha por vez para o número de 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 inverter lista ordenada.


3



Você pode usar o '< em vez de digitar o número da linha manualmente. Basta iniciar a seleção uma linha antes e executar :'<,'>g/^/m'<. - Palec
@Palec Ah, dica muito útil. Obrigado! - horta


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 mapas para o modo Visual, mas não Select, como :help mapmode-x aconselha para o mapeamento de caracteres imprimíveis.)

(Baseado em: http://tech.groups.yahoo.com/group/vim/message/34305 )


2



Esta deve ser a resposta aceita IMO. Geralmente útil e não preciso lembrar :'<,'>g/^/m'< :) - Eliot
@Eliot, obrigado! :) (eu adicionei um pouco de 'conteúdo bônus';)) - Aaron Thoma
Como posso dizer que a seleção começa -1 neste caso? Porque o movimento começa neste ponto. - SergioAraujo
@SergioAraujo: é algo como :-1,+1Rev o que você está procurando? Saiba que você pode selecionar visualmente o intervalo que deseja reverter, por exemplo: V7j:Rev. Se isso não responder à sua pergunta, eu não entendi, então você precisa elaborar ou reformular isso para mim. - Aaron Thoma


Vamos dizer que você está na linha 3, por isso temos um intervalo de 3 a 6. Apenas digite.

:3,6g/^/m2

1



Você pode deixar implícito o número da linha atual: com o cursor na primeira linha do seu intervalo, você pode reduzir para :,6g/^/m2; ou quando na última linha do intervalo: :3,g/^/m2; e :3,6g/^/m2 funciona de qualquer lugar no arquivo. - Aaron Thoma