web-dev-qa-db-fra.com

Comment 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

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

Comment pourrais-je faire cela dans vim?

92
Jichao

Pour inverser toutes les lignes d'un fichier,

:g/^/m0

Pour une explication voir

:help 12.4

qui montre également comment inverser une plage de lignes.

84
garyjohn

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

66
Rhys Ulerich

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

:%!tail -r

Cela fonctionne également bien pour le mode visuel:

:'<,'>!tail -r

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

L'option -r entraîne l'affichage de l'entrée dans l'ordre inverse, ligne par ligne. En outre, cette option modifie la signification des options -b, -c et -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 des octets, des lignes ou des blocs du début ou de la fin de l'entrée à partir de laquelle commencer l'affichage. La valeur par défaut de l'option -r consiste à afficher toutes les entrées.

31
Thomas Perl

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 inverser à l’aide de :set nu.
2. Shift-V pour mettre en surbrillance la sélection que vous voulez retourner (mode visuel).
3. :g/^/m <Line number from step 1>.

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

Cette commande consiste à déplacer la sélection ligne par ligne dans le numéro de ligne que vous lui avez attribué. Lorsque le deuxième élément est inséré dans le numéro de ligne indiqué, il passe au premier numéro de ligne + 1. Le troisième abaisse les premier et deuxième et ainsi de suite jusqu'à ce que toute la liste soit insérée dans le seul numéro de ligne, ce qui entraîne liste ordonnée inverse.

3
horta

Une commande :Rev[erse] et des mappages facultatifs pour votre vimrc, afin que vous n'ayez pas à vous rappeler et à exécuter 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 mappe pour le mode visuel mais non sélectif, car :help mapmode-x recommande de mapper les caractères imprimables.)

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

2
Aaron Thoma

Disons que vous êtes à la ligne 3, nous avons donc une plage de 3 à 6. Il suffit de taper.

:3,6g/^/m2
1
SergioAraujo