Comment permuter deux lignes dans vim?

94

J'ai ceci:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

Et je veux obtenir ceci:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

Existe-t-il un moyen de le faire rapidement en utilisant des raccourcis clavier?

Bartłomiej Semańczyk
la source
Vous pouvez envisager d'utiliser un autre éditeur si vous n'êtes pas familier avec vim. Vous pouvez configurer l'éditeur pour git uniquement en utilisant l'un git config --global core.editor <whatever>ou l' autre , ou pour beaucoup de choses à la fois (y compris git) en incluant export EDITOR=<whatever>dans votre fichier .bashrc.
Sven Marnach

Réponses:

160

Pour permuter la ligne actuelle avec la suivante, tapez ddpen mode commande.

  • dd - supprimer la ligne (en fait appelée cut dans d'autres éditeurs) et la sauvegarder dans le registre
  • p - coller la ligne du registre
Sven Marnach
la source
3
Déplacez le curseur sur la première ligne, puis tapez ddp. Si vous n'êtes pas encore en mode commande, appuyez sur Escpour passer en mode commande.
Sven Marnach
32
ddsupprime la ligne courante après l'avoir copiée dans un "registre". pcopie ("met") le contenu du registre dans votre tampon après la ligne courante. De même, vous pouvez échanger deux caractères avec xpou deux mots avec dwwP.
Keith Thompson
@KeithThompson malheureusement, pas aussi facile que ça d'échanger deux mots.
CS
@CS Faites-vous référence au fait que dwwPcela ne fonctionne pas de la même manière si les deux mots sont à la fin d'une ligne? (Et échanger le dernier mot sur une ligne avec le premier mot sur la ligne suivante est encore plus délicat.)
Keith Thompson
1
@KeithThompson ouais, même si je me sentais un peu mal après avoir fait mon commentaire parce que c'est un cas littéral;)
CS
52

ddsupprime la ligne actuelle, vous pouvez ensuite coller la ligne supprimée à l'aide de p. Il existe une autre façon d'utiliser m. Avec mvous pouvez déplacer les lignes autour de ie

:m 1 déplacera la ligne courante après la ligne 1

:m 0 déplacera la ligne actuelle vers le haut

:m $ déplacera la ligne actuelle vers le bas

Dans votre exemple, placez le curseur sur la première ligne et tapez :m $

Plus d'informations: http://vim.wikia.com/wiki/Moving_lines_up_or_down

M. Eigenbart
la source
1
Merci pour l'explication des "natifs" non vim :-)
Bruno Bieri
1
C'est la réponse que je recherchais également pour élargir mes connaissances sur vim.
Phemelo Khetho
Merci! C'est la réponse que je cherchais. Cela peut devenir encore plus pratique lorsque vous faites glisser plusieurs lignes en même temps en utilisant le mode visuel.
Kareem Jeiroudi le
8

Malgré le fait que cette question soit assez ancienne et marquée comme une réponse, j'aimerais étendre la réponse en disant que vous pouvez utiliser des commandes en mode normal, qui ont été fournies par Sven Marnach avec nnoremapcomme suit:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Cela vous permettra de déplacer des lignes avec Ctrl + Upet Ctrl+ Downdans votre fichier. Cependant, cela écrasera le @"registre, qui stocke votre dernière chaîne / mot / lettre / etc copié. Donc, en ajoutant "(reg) avant ddet les pcommandes, nous pouvons résoudre ce problème:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Ici, nous ajoutons "aavant de supprimer et coller des commandes pour stocker notre ligne dans le @aregistre, de sorte que votre registre de copie par défaut ne sera pas écrasé. Cependant, il peut écraser le contenu du @aregistre (qui sait, mais vous pouvez l'utiliser pour quelque chose d'important dans votre cas d'utilisation, mais cette étape un peu paranoïaque, vous pouvez l'ignorer si vous le souhaitez), corrigeons cela aussi:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>nécessaire pour éviter de faire écho à nos commandes dans la ligne de message en bas.)

Nous avons maintenant deux mappages qui nous permettent de déplacer des lignes dans le fichier avec des raccourcis clavier. Vous pouvez redéfinir les boutons, j'utilise Alt+ j/ k, ce qui serait <A-j>et <A-k>pour ces commandes. Cependant, tous les émulateurs de terminal ne prennent pas en charge les mappages de touches Alt AFAIK.

Andrey Orst
la source
2

Exemple:

  1. one
> 2. two

avec :m-2, interrupteur (ligne actuelle - 2)

> 2. two
  1. one

avec :m+1interrupteur (ligne actuelle + 1)

  1. one
> 2. two

Vous pouvez cartographier cela si vous le souhaitez.

cjadeveloper
la source
C'est la meilleure réponse que la réponse par défaut
Alex Bin Zhao
0

Les mappings proposés dans le wikia Vim page sont en fait le meilleur moyen de mapper des combinaisons de touches qui émulent la façon dont Sublime et d'autres éditeurs implémentent cette fonctionnalité.

Cela inclut une action d'indentation après le déplacement, ce qui est également génial (c'est le double égal == signe , au cas où vous ne le voudriez pas).

Il prend également en charge les modes visuel et d' insertion , de sorte que vous pouvez déplacer des lignes lors de l'édition ou avec des fulblocks.

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

Je les ai personnellement mappés sur <D-J>et <D-K>sur mon Mac, au lieu de ceux <A-qui correspondent à la Altclé. De cette façon, j'utilise Cmd+ Shift+ j/ k, ce qui me semble plus naturel du bout des doigts.

ojosilva
la source