Question Comment inverser les lignes sélectionnées ordonnées dans vim?


Par exemple, si j'ai quatre lignes comme suit:

la première ligne
  la deuxième ligne
  la troisième ligne
  la quatrième ligne

Je veux les retourner à

la quatrième ligne
  la troisième ligne
  la deuxième ligne
  la première ligne

Comment pourrais-je faire ça en vim?


79
2017-09-17 23:57


origine


Dupliquer sur Débordement de pile: Comment retourner une sélection visuelle dans vim? - Palec
En relation: Inverser toutes les lignes @ Vim Wikia - Palec
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1  vi.stackexchange.com/a/2107/10254 - qeatzy


Réponses:


Pour inverser toutes les lignes d'un fichier,

:g/^/m0

Pour une explication voir

:help 12.4

ce qui montre également comment inverser seulement une gamme de lignes.


79
2017-09-18 00:35



Bon conseil sur la section d'aide exacte! Pour résumer: 1. placez un marqueur à la dernière ligne que vous voulez inverser (je nomme le marqueur 'a' en utilisant ma), 2. déplacer le curseur sur la première ligne du bloc, 3. taper :'a,.g/^/m 'a - Brent Faust
Oui, y compris le réponse réelle ici sur les sites Stack Exchange est un must; se référer à une source externe ne suffit pas. (En citant, cependant, les accessoires.) - ELLIOTTCABLE


Sélectionnez les lignes souhaitées, appuyez sur !, et dans l'invite résultante, passez les lignes à travers tac à la :'<,'>!tac. Voir man tac pour plus de détails.


58
2017-08-16 14:01



Pour sélectionner les lignes, utilisez shift+v pour entrer en mode ligne visuelle, alors j pour ajouter des lignes à la sélection. - wisbucky
Je peux confirmer que cela fonctionne dans les fenêtres avec gvim, ainsi que! Sinon, vous devez utiliser des numéros de ligne absolus (peut-être pouvez-vous utiliser relative, mais vous devez faire attention) avec le :g/^/m0 (ce qui est aussi très difficile à retenir) ... Donc, essentiellement, tac devrait être avec vim, peu importe la plate-forme sur laquelle vous êtes, MAIS ce n'est pas 100% vimscript, MAIS qui s'en soucie: P - dylnmc
Ceci est incroyable !!!! - itzjustricky


Sur Mac OS X, tac n'existe pas, mais vous pouvez utiliser tail -r dans le même sens:

:%!tail -r

Cela fonctionne également très bien pour le mode visuel:

:'<,'>!tail -r

Extrait tail(1)la page de manuel:

L'option -r permet d'afficher l'entrée dans l'ordre inverse, par   ligne. En outre, cette option modifie la signification de -b, -c et   options -n. Lorsque l’option -r est spécifiée, ces options spécifient le nombre d’octets, de lignes ou de blocs de 512 octets à afficher, au lieu de   les octets, lignes ou blocs du début ou de la fin de l'entrée de   qui pour commencer l'affichage. La valeur par défaut pour l'option -r est de   afficher toutes les entrées.


28
2018-06-03 17:18



Excellent! Donc, pour fournir «tac» sous OS X: alias tac='tail -r' - Brent Faust
Vous pouvez aussi brew install coreutils et utilise gtac. - Andrew Marshall


Pour les plus à l'aise avec le mode visuel:
 1. Identifiez le numéro de ligne au-dessus de la sélection que vous voulez retourner avec :set nu.
 2. Shift-V pour mettre en surbrillance la sélection que vous souhaitez retourner (mode visuel).
 3. :g/^/m <Line number from step 1>.

Notez qu'en mode visuel, il apparaîtra automatiquement comme      :'<,'>g/^/m <Line number> lorsque vous tapez la commande à partir de 3.

Cette commande fonctionne en déplaçant la sélection une ligne à la fois dans le numéro de ligne que vous lui donnez. Lorsque le deuxième objet est poussé dans le numéro de ligne donné, il pousse le premier vers le numéro de ligne + 1. Le troisième pousse le premier et le deuxième vers le bas et ainsi de suite jusqu'à ce que la liste entière soit insérée dans le numéro de ligne unique liste inversée


3
2018-06-13 20:52



Vous pouvez utiliser le '< au lieu d'entrer le numéro de ligne manuellement. Il suffit de commencer la sélection une ligne plus tôt et d'exécuter :'<,'>g/^/m'<. - Palec
@Palec Ah, conseil très utile. Je vous remercie! - horta


Une commande :Rev[erse] et les mappages facultatifs pour votre vimrc, vous n'avez donc pas à vous rappeler et à effectuer les étapes non évidentes de cette recette:

" 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 cartes pour le mode visuel mais pas le mode sélection, comme :help mapmode-x conseille pour la cartographie des caractères imprimables.)

(Basé sur: http://tech.groups.yahoo.com/group/vim/message/34305 )


2
2018-02-09 11:10



Cela devrait être la réponse acceptée IMO. Plus généralement utile et je n'ai pas à me souvenir :'<,'>g/^/m'< :) - Eliot
@Eliot, merci! :) (J'ai ajouté un peu de "contenu bonus".;)) - Aaron Thoma
Comment puis-je dire que la sélection commence à -1 dans ce cas? Parce que le déménagement commence à ce stade. - SergioAraujo
@SergioAraujo: Quelque chose comme :-1,+1Rev Qu'est-ce que tu cherches? Sachez que vous pouvez sélectionner visuellement la plage que vous souhaitez inverser, par exemple: V7j:Rev. Si cela ne répond pas à votre question, je ne l’ai pas comprise, vous devez donc l’élaborer ou la reformuler pour moi. - Aaron Thoma


Disons que vous êtes à la ligne 3, nous avons donc une plage de 3 à 6. Tapez simplement.

:3,6g/^/m2

1
2018-02-17 10:25



Vous pouvez laisser implicite le numéro de la ligne actuelle: avec le curseur sur la première ligne de votre portée, vous pouvez raccourcir :,6g/^/m2; ou sur la dernière ligne de la gamme: :3,g/^/m2; et :3,6g/^/m2 fonctionne de n'importe où dans le fichier. - Aaron Thoma