Un moyen plus rapide de déplacer un bloc de texte

25

Voici comment je copie habituellement un bloc de texte ou de code:

  1. Sélectionnez le bloc avec le mode visuel ( V) et supprimez-le avec d; ou s'il s'agit d'une seule ligne, utilisez-la dd.
  2. Allez là où je veux que le texte soit, je suis trop stupide pour me souvenir de la différence entre pet P, donc je comprends bien environ 50% du temps. (si je me trompe: recommencez).
  3. Parfois, l'indentation doit être ajustée, donc je passe à Vnouveau en mode visuel et resélectionne le même bloc, et j'utilise >ou <pour corriger cela.

Existe-t-il un moyen plus simple? Dans certains éditeurs, j'ai vu que vous pouvez "ramasser" un bloc de texte, pour ainsi dire, et le déplacer; voici un exemple d'Emacs (mais j'ai également vu cela dans d'autres éditeurs):

Emacs

Ou peut-être existe-t-il une autre (encore meilleure) manière?

Martin Tournoij
la source
À propos du problème d'indentation, vous pouvez le résoudre en collant avec ]pou [pplutôt que pou P. De cette façon, le bloc que vous collez sera automatiquement indenté.
Gonçalo Ribeiro
Vous voudrez peut-être regarder le screencast de Drew Neil Bubbling Text qui recommande d'utiliser vim-intact .
Hotschke

Réponses:

13

Il existe un plugin pour cela: dragvisuals.vim .

Il ne lie aucune clé par défaut, vous devrez donc le faire vous-même. J'aime les mapper sur Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Il est également livré avec une clé bonus pour dupliquer la sélection actuelle:

xmap <expr> D DVB_Duplicate()

Avantages de ce plugin par rapport aux autres réponses:

  • Ne fait disparaître aucun texte si vous essayez de vous déplacer plus haut que la première ligne.
  • Il étendra le fichier si vous passez sous la dernière ligne.
  • Déplacer vers la gauche / droite fonctionne un peu mieux.

Une autre astuce utile pour compléter cela, sont ces raccourcis clavier:

xnoremap > >gv
xnoremap < <gv

Cela sélectionnera à nouveau la dernière sélection visuelle après utilisation >en mode visuel, afin que vous puissiez ajuster l'alignement plus facilement (vous pouvez également utiliser les touches fléchées, mais cela le déplacera d'un caractère et non d'un shiftwidth).

Jay Thompson
la source
1
Il y a un autre plugin pour cela que l'auteur de mon plugin suggéré décrit comme "un remaniement bien amélioré de mon propre dragvisuals.vim": github.com/zirrostig/vim-schlepp
Jay Thompson
8

Pour l'étape 3, vous pouvez utiliser à la gv=place ( =signifie retrait et gvsignifie "resélectionner la dernière sélection visuelle").

Pour le comportement d'Emacs, il serait assez simple d'ajouter des mappages dans votre .vimrc:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Vous pouvez ensuite utiliser les touches fléchées haut et bas pour vous déplacer dans une sélection de ligne visuelle. (Bien sûr, vous pouvez également mapper sur différentes touches si vous détestez les flèches.)

(Vous pouvez le faire avec des sélections visuelles normales et en les déplaçant également vers la gauche et la droite: vnoremap <left> dhPgvhohoet vnoremap <right> dpgvlolo.)

Poignée de porte
la source
gvva à la dernière sélection visuelle, qui dans ce cas serait le paragraphe qui a été supprimé. Qu'est-ce que je rate?
Robert Smith
4

Vous pouvez remapper certaines touches pour déplacer les lignes. Par exemple, des flèches de haut en bas si vous avez l'habitude de vous déplacer hjkl.

Par exemple sur .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, commande normale pour déplacer une ligne

+1ou -2pour indiquer une ligne vers le haut ou vers le bas (-1 maintient la ligne au même endroit)

gvpour sélectionner à nouveau le même texte en VISUALmode

Cette solution n'interfère pas avec les registres, donc tout texte copié sera toujours disponible, ainsi que reformater le code pour définir une indentation appropriée, etc.

Khelben
la source
C'est bien, mais pas pour moi, car je n'aime pas l'utiliser =(cela change souvent trop de mise en forme sans rapport avec moi).
Martin Tournoij
3

Il y a peu de plugins pour cela, mais je préfère vim-unimpaired ( github ) de Tim Pope (Ingo Karkat LineJuggler est similaire).

Vous sélectionnez visuellement votre bloc de texte puis faites ]e(e pour échange) pour déplacer le bloc vers le bas ( [epour l'autre sens). Utilisez .pour répéter l'action (vous avez installé repeat.vim n'est-ce pas). Si vous allez trop loin, annulez simplement via u.

Maintenant, personnellement, je pense pet ce Psont des commandes si courantes qu'il serait préférable de les apprendre avant de créer de mauvaises habitudes. Ensuite, vous pouvez utiliser ]ppour coller au même retrait. Si vous utilisez intact, vous pouvez faire >ppour coller un niveau d'indentation plus profondément ou =ppour coller et reformater.

Si vous avez du mal à vous souvenir p, Pcela peut vous aider à les considérer en termes de commandes oet Oqui est une sorte de symétrie.

Comme d'autres l'ont noté, vous pouvez utiliser gvpour resélectionner une sélection visuelle. Cependant, si vous venez de mettre / coller du texte, vous aurez perdu votre sélection visuelle. Ne vous inquiétez pas parce que tous les changements (et Ricains!) Établira '[et ']autour de la zone modifiée. Vous pouvez donc mettre en retrait via >'](lire: déplacer vers la droite jusqu'à la fin du dernier changement) et utiliser .pour répéter le retrait jusqu'à ce que le texte soit au bon endroit.

Pour plus d'aide, voir:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
Peter Rincker
la source
2

Si vous connaissez le numéro de ligne vers lequel vous souhaitez déplacer le bloc de texte, vous pouvez utiliser une plage ou une sélection visuelle avec la :movecommande pour y déplacer le bloc.

Par exemple, si j'ai le fichier suivant:

1 aaa
2 bbb
3 ccc
4 ddd

et je veux déplacer la ligne de a après la ligne de c, je place le curseur sur la ligne de a et j'entre :m3, puis la ligne est décalée.

Cela fonctionne également avec les décalages +/-. Dans l'exemple ci-dessus, le même résultat pourrait être obtenu avec :m+2pour déplacer la ligne 2 lignes vers le bas.

Pour les blocs de texte, la seule différence consiste à ajouter une plage ou une sélection. Pour déplacer les lignes aaa et bbb à la fin du fichier, utilisez une commande comme :1,2m$($ = dernière ligne) ou sélectionnez visuellement les lignes et :m$.

Caca
la source
1
Pour plus d'astuces, :moveconsultez également vim.wikia.com/wiki/Moving_lines_up_or_down ou les astuces 29 Dupliquer ou déplacer des lignes à l'aide des commandes ': t' et ': m' dans le livre Practical Vim de D. Neil.
Hotschke