Déplacer la ligne entière de haut en bas dans Vim

Dans Notepad ++, je peux utiliser Ctrl + Maj + Haut / Bas pour déplacer la ligne actuelle vers le haut et le bas. Y a-t-il une commande similaire dans Vim? J’ai parcouru des guides sans fin, mais je n’ai rien trouvé.

S’il n’y en a pas, comment pourrais-je lier l’action à cette combinaison de touches?

Edit: La réponse de Mykola fonctionne pour toutes les lignes, sauf celles au début et à la fin du tampon. En déplaçant la première ligne ou la ligne du bas, vous supprimez la ligne et lorsque vous déplacez la ligne du bas, vous sautez deux espaces au départ, comme un pion! Quelqu’un peut-il offrir des améliorations?

Mettez ce qui suit à votre .vimrc pour faire le travail

noremap  :call feedkeys( line('.')==1 ? '' : 'ddkP' ) noremap  ddp 

La disparition de la ligne ressemble à un bug de Vim. Je mets un hack pour l’éviter. Il existe probablement une solution plus précise.

Mettre à jour

Il y a beaucoup de difficultés inexpliquées avec l’utilisation des combinaisons Vim. Ce sont des lignes manquantes et des sauts de ligne supplémentaires.

Voici donc la solution de script qui peut être placée dans .vimrc ou ~ / .vim / plugin / swap_lines.vim

 function! s:swap_lines(n1, n2) let line1 = getline(a:n1) let line2 = getline(a:n2) call setline(a:n1, line2) call setline(a:n2, line1) endfunction function! s:swap_up() let n = line('.') if n == 1 return endif call s:swap_lines(n, n - 1) exec n - 1 endfunction function! s:swap_down() let n = line('.') if n == line('$') return endif call s:swap_lines(n, n + 1) exec n + 1 endfunction noremap   :call swap_up() noremap   :call swap_down() 

Si je veux échanger une ligne avec la ligne ci-dessus, je fais généralement les choses suivantes:

 ddkP 

Explication

  • dd va supprimer la ligne et l’append au registre par défaut.
  • k montera d’une ligne (j descendrait d’une ligne)
  • P va coller au dessus de la ligne courante

En supposant que le curseur est sur la ligne que vous souhaitez déplacer.

Déplacement de haut en bas :m pour bouger

:m +1 – descend d’une ligne

:m -2 – monter de 1 lignes

(Notez que vous pouvez remplacer +1 par un nombre quelconque selon le nombre de lignes que vous souhaitez déplacer vers le haut ou le bas, c.-à-d. Que +2 le déplacerait de 2 lignes, -3 le déplacerait de 2 lignes)

Pour passer à une ligne spécifique

:set number – affiche les lignes de chiffres (plus facile de voir où vous le déplacez)

:m 3 – déplace la ligne après la 3ème ligne (remplace 3 par n’importe quelle ligne)

Déplacement de plusieurs lignes:

V (c.-à-d. ShiftV ) et déplacez le curseur vers le haut et le bas pour sélectionner plusieurs lignes dans VIM

une fois sélectionné, appuyez sur : et exécutez les commandes ci-dessus, m +1 etc.

Déplacer une ligne: ddkP

Déplacer une ligne vers le bas: ddp

Cela a fonctionné pour moi:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

BTW, si vous voulez utiliser ALT + some_key et votre terminal (urxvt fait cela) refuse de se conformer, vous devriez entrer quelque chose comme ceci dans votre .vimrc:

 " For moving lines (^] is a special character; use  and  if it works) nnoremap ^]k mz:m-2`z== inoremap ^]j :m+==gi inoremap ^]k :m-2==gi vnoremap ^]j :m'>+gv=`mzgv`yo`z nnoremap ^]j mz:m+`z== vnoremap ^]k :m'< -2gv=`>my` 

où ^] est un caractère unique qui représente la touche ALT. Pour saisir ce caractère, utilisez C + v, Esc dans Vim ( C + q, Esc sous Windows).

En mode commande, positionnez le curseur sur la ligne que vous souhaitez déplacer, puis

 ddp 

Explication: dd supprime la ligne en cours dans le tampon général p la remet après la position du curseur, ou en cas de lignes entières, une ligne plus bas.

Il existe une certaine confusion en ce qui concerne les commandes p et P dans de nombreux documents. En réalité, p colle le curseur AFTER et le curseur P AT.

ajoutez ce qui suit au fichier ~ / .vimrc (assurez-vous de ne pas avoir de mappage pour n, m)

 nmap n :m +1 nmap m :m -2 

maintenant, appuyer sur la touche n déplace une ligne vers le bas et m déplace une ligne.

Ajoutez simplement ce code à .vimrc (ou .gvimrc)

 nnoremap  :m+== nnoremap  :m-2== inoremap  :m+==gi inoremap  :m-2==gi vnoremap  :m'>+gv=gv vnoremap  :m-2gv=gv 

Exactement ce que vous cherchez dans ce plugin génial: https://github.com/vim-scripts/upAndDown

Une solution simple consiste à mettre dans votre .vimrc ces lignes:

 nmap  :m-2 nmap  :m+1 

Je mets le texte suivant à la fin de mon fichier .vimrc:

 noremap H ddkkp noremap N ddp 

Donc maintenant ‘H’ et ‘N’ déplacent la ligne actuelle vers le haut et vers le bas respectivement.

Voici une version simplifiée, pour MacVim, à l’aide des exemples d’articles Wikia (cf. le lien du commentaire de gun ).

 " Move selection up/down (add =gv to reindent after move) :vmap  :m-2gv :vmap  :m'>+gv 

J’utilise uniquement la variante de sélection de bloc, car il suffit de sélectionner Shift-V pour sélectionner la ligne actuelle, et éventuellement de déplacer le curseur vers le haut ou le bas pour sélectionner d’autres lignes.

Selon les raccourcis ci-dessus, appuyez sur Cmd-Shift-Up / Down pour décaler la sélection de blocs vers le haut / bas. “D” est la touche de commande dans MacVim, pour Windows, essayez “C” (Control) ou “A” (Alt) (par exemple, serait Control Alt f).

L’article de Wikia ajoute “= gv” à ceux-ci, ce qui a pour effet d’ajuster l’indentation du bloc après le déplacement, en fonction du texte environnant. Ceci est déroutant alors je l’ai enlevé, et ajouté des raccourcis pour mettre rapidement en retrait la sélection.

 " Indent selection left/right (Cmd Shift Left/Right is used for Tab switching) :vmap   >gv 

Attention, la même chose peut être faite avec < < et >> mais la sélection serait perdue, donc ces raccourcis ci-dessus permettent de mettre plusieurs fois en retrait et de déplacer le bloc car la sélection est maintenue.

Mon MacVim est configuré pour commuter les tabs avec Cmd-Shift-Left / Right, donc j’ai utilisé Cmd-Alt-Left / Right.

Voici le changement d’onglet pour MacVim (mis en .gvimrc avec le rest ci-dessus):

 :macm Window.Select\ Previous\ Tab key= :macm Window.Select\ Next\ Tab key= 

Lorsque vous appuyez sur la commande :help move in vim , voici le résultat:

:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.

Ex: Déplacer la ligne actuelle d’une ligne vers le bas => :m+1 .

Par exemple: déplacer la ligne avec le numéro 100 sous la ligne portant le numéro 80 => :100 m 80 .

Par exemple: déplacer la ligne avec le numéro 100 sous la ligne portant le numéro 200 => :100 m 200 .

Par exemple, déplacez les lignes dont le numéro est compris entre [100, 120] sous la ligne portant le numéro 200 => :100,120 m 200 .

vim plugin unimpaired.vim [e et] e

: m. + 1 ou: m.-2 si vous déplacez une seule ligne. Voici mon script pour déplacer plusieurs lignes. En mode visuel, Alt-Haut / Alt-Bas déplacera les lignes contenant la sélection visuelle vers le haut / bas d’une ligne. En mode insertion ou en mode normal, Alt-Alt / Alt-bas déplacera la ligne en cours si aucun préfixe de comptage n’est donné. S’il y a un préfixe de comptage, Alt-haut / Alt-bas déplacera de nombreuses lignes commençant par la ligne actuelle vers le haut / bas d’une ligne.

 function! MoveLines(offset) range let l:col = virtcol('.') let l:offset = str2nr(a:offset) exe 'silent! :' . a:firstline . ',' . a:lastline . 'm' \ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset) exe 'normal ' . l:col . '|' endf imap   :call MoveLines('-2') imap   :call MoveLines('+1') nmap   :call MoveLines('-2') nmap   :call MoveLines('+1') vmap   :call MoveLines('-2')gv vmap   :call MoveLines('+1')gv 

Si vous souhaitez le faire sur plusieurs lignes correspondant à une recherche spécifique:

  • En haut:: :g/Your query/ normal ddp ou :g/Your query/ m -1
  • Bas :g/Your query/ normal ddp ou :g/Your query/ m +1

Voici une solution qui fonctionne sur ma machine : MacBook Pro sous VIM 8.1

Ces commandes ne suppriment pas vos lignes en haut ou en bas de votre tampon.

L’utilisation des symboles réels générés par Alt-J et Alt-K est une solution de contournement pour leurs codes-clés ne mappant pas correctement dans mon environnement.

Jetez ceci dans l’ancien .vimrc et voyez si cela fonctionne pour vous.

 " Maps Alt-J and Alt-K to macros for moving lines up and down " Works for modes: Normal, Insert and Visual nnoremap ∆ :m .+1== nnoremap ˚ :m .-2== inoremap ∆ :m .+1==gi inoremap ˚ :m .-2==gi vnoremap ∆ :m '>+1gv=gv vnoremap ˚ :m '< -2gv=gv