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.


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)).


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:


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.