160 votes

Comment puis-je inverser l'ordre des lignes sélectionné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 inverser pour

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

Comment pourrais-je faire cela dans Vim ?

156voto

Unnati Gutpa Points 11

Pour inverser toutes les lignes d'un fichier,

:g/^/m0

Pour une explication, voir

:help 12.4

qui montre également comment inverser juste une plage de lignes.

132voto

Blindy Points 26706

Sélectionnez les lignes souhaitées, appuyez sur !, et dans la fenêtre de commande résultante redirigez les lignes à travers tac à la manière de :'<,'>!tac. Consultez man tac pour plus de détails.

47voto

Thomas Perl Points 519

Sous Mac OS X, tac n'existe pas, mais vous pouvez utiliser tail -r pour le même effet:

:%!tail -r

Cela fonctionne également très bien en mode visuel:

:'<,'>!tail -r

Extrait de la page de manuel de tail(1):

L'option -r permet d'afficher l'entrée dans l'ordre inverse, par ligne. De plus, cette option modifie la signification des options -b, -c et -n. Lorsque l'option -r est spécifiée, ces options indiquent le nombre d'octets, de lignes ou de blocs de 512 octets à afficher, au lieu des octets, lignes ou blocs depuis le début ou la fin de l'entrée à partir de laquelle commencer l'affichage. Par défaut, l'option -r affiche l'ensemble de l'entrée.

9voto

horta Points 419

Pour ceux qui sont plus à l'aise avec le mode Visuel :
1. Identifiez le numéro de ligne au-dessus de la sélection que vous souhaitez retourner en utilisant :set nu.
2. Shift-V pour mettre en surbrillance la sélection que vous souhaitez retourner (mode visuel).
3. :g/^/m .

Notez qu'en mode visuel, cela s'affichera automatiquement comme :'<,'>g/^/m lorsque vous saisissez la commande du point 3.

Cette commande fonctionne en déplaçant la sélection d'une ligne à la fois vers le numéro de ligne que vous lui donnez. Lorsque le deuxième élément est poussé dans le numéro de ligne donné, il pousse le premier vers la ligne numéro + 1. Ensuite, le troisième pousse le premier et le deuxième vers le bas, et ainsi de suite jusqu'à ce que toute la liste soit poussée vers le numéro de ligne unique, ce qui donne une liste ordonnée à l'envers.

8voto

Aaron Thoma Points 570

Une commande :Rev[erse] et des mappings optionnels pour votre vimrc, afin que vous n'ayez pas à vous souvenir et à exécuter les étapes non évidentes de cette recette :

" Inverser les lignes de tout le fichier ou d'un bloc visuellement sélectionné.
    " :Rev est un préfixe plus court que vous pouvez utiliser.
    " Adapté de http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \      kt
    \      exe ",g/^/m't"
    \  call setpos("'t", save_mark_t)

nmap r :Reverse
xmap r :Reverse

(:xmap mappe pour le mode Visuel mais pas le mode Sélection, comme le conseille :help mapmode-x pour mapper des caractères imprimables.)

(Basé sur : <a href="http://tech.groups.yahoo.com/group/vim/message/34305" rel="nofollow noreferrer">http://tech.groups.yahoo.com/group/vim/message/34305</a> )

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X