Comment puis-je déplacer facilement une ligne?

48

Quelle est la commande (ou raccourci) pour déplacer une ligne vers le haut ou le bas dans vim? Mon flux de travail actuel consiste à tirer (copier) la ligne et à supprimer cette ligne et à mettre (coller) cette ligne.

Vader
la source
8
Depuis la suppression de fait des coupes, vous pouvez sauter le Yank: ddkPdéplacer vers le bas est plus facile: ddp.
muru

Réponses:

52

Tout d'abord, vous n'avez pas besoin de tirer et de supprimer; ce dernier mettra également le contenu supprimé dans le registre (par défaut ou spécifié). Par conséquent, ddp/ ddkPsont des commandes courantes pour déplacer une ligne d’une ligne vers le bas / haut.

Alternativement, vous pouvez utiliser la :movecommande, ie :move +1/ :move -2; cela n'empiète pas sur le registre et vous pouvez également déplacer des plages entières. Vous pouvez facilement définir des mappages de touches pour raccourcir cela.

Si vous (vient et souvent confort supplémentaire avec eux) pas l' esprit plugins, tant Tim Pope plug - in intact et mon LineJuggler plug - in fournissent ]e/ [ecorrespondances pour déplacer les lignes (et plusieurs autres, Tim pour une variété d'utilisations, la mine concentre sur le traitement lignes)).

Ingo Karkat
la source
36

Le plus simple est: :m+ou :m-2qui est l’abréviation de :moveIngo suggérée.

Ou utilisez le mode visuel ( V) en coupant la ligne ( d/ x) puis collez-la ( p- sous le curseur, Pau - dessus du curseur) après avoir déplacé votre curseur à la bonne place avant de le coller (donc en résumé, il s'agit de Vxp/ Vdp).

Lorsque vous déplacez plusieurs lignes en mode visuel, vous devez utiliser :m '>+1(déplacer d’une ligne vers le bas) ou :m '<-2(déplacer d’une ligne vers le haut).


Voici un exemple de mappage utile ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

qui est similaire à Sublime Text ( Win / OSX ).

Voici quelques suggestions sur vim wikia :

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

En mode normal ou en mode insertion, appuyez sur Alt-j pour déplacer la ligne actuelle vers le bas ou appuyez sur Alt-k pour déplacer la ligne actuelle.

Après avoir sélectionné visuellement un bloc de lignes (par exemple, en appuyant sur V puis en déplaçant le curseur vers le bas), appuyez sur Alt-j pour déplacer tout le bloc vers le bas ou appuyez sur Alt-k pour le déplacer.

Voir également:

Kenorb
la source
2
+1 pour le lien Vim wikia. Appris quelques choses là-bas.
Gonçalo Ribeiro
Je ne sais pas pourquoi, mais ils fonctionnent très bien dans Gvim, mais ne fonctionnent pas comme prévu dans terminal vim. (Il semble que ce soit le problème de tmux)
CodyChan
12

Si je veux échanger une ligne avec la ligne ci-dessus, je fais habituellement ce qui suit

ddkP

Explication

  • dd supprimera la ligne et l'ajoutera au registre par défaut.
  • k montera une ligne (j descendrais une ligne)
  • P va coller au dessus de la ligne courante
venkatvb
la source
3
Pour déplacer la ligne actuelle vers le bas, utilisezddp
Qinjie le
4

FWIW, voici ce que j'ai utilisé pendant des années. Il déplace la ligne actuelle de haut en bas en mode normal ou la sélection en mode visuel, tout en ajustant l'indentation automatiquement.

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
romainl
la source