Comment dupliquer une ligne entière dans Vim chez Eclipse?

1624

Comment dupliquer une ligne entière dans Vim d'une manière similaire à Ctrl+ Ddans IntelliJ IDEA / Resharper ou Ctrl+ Alt+ / dans Eclipse ?

sumek
la source
49
Les gens n'exécutent-ils plus vimtutor? C'est probablement dans les cinq premières minutes de l'apprentissage de l'utilisation de Vim.
dash-tom-bang
131
Souhaitez-vous dupliquer cette ligne? Yes Pbail. :)
Stavr00
3
FWIW J'ai fait vimtutor une douzaine de fois au cours des 2 derniers mois et ce concept n'est pas couvert. Il indique comment faire "dd" et "v - naviguer - y" suivi de "p". Il ne dit pas comment copier une seule ligne sans la supprimer comme cela est demandé ici.
danielson317

Réponses:

2768

yyou Yde copier la ligne (Mnémonique: y ANK )
ou
ddà d élete la ligne (copie ce que vous Vim dans un presse - papiers supprimés comme « registre », comme une coupure opération)

puis

pà p Aste le texte copié ou supprimé après la ligne en cours
ou
Pà p Aste le texte copié ou supprimé avant la ligne en cours

Mark Biek
la source
129
Un excellent point. Pour une raison quelconque, je trouve que frapper y deux fois est plus rapide pour moi que SHIFT-y
Mark Biek
25
@camflan Je pense que le Y devrait être "copier du curseur jusqu'à la fin"
Dzung Nguyen
42
et 2yy peuvent être utilisés pour copier 2 lignes (et pour tout autre n)
Amir Ali Akbari
5
@nXqd: Oui, un grand pourcentage d'utilisateurs des cartes Yà y$. (Cohérent avec Det C; (mais pas compatible avec Vi (personne ne s'en soucie.))) C'est même proposé dans :help Y.
Aaron Thoma
11
Pour copier deux lignes, c'est encore plus rapide juste pour aller yjou yk, d'autant plus que vous ne doublez pas sur un caractère. De plus, ykc'est une version en arrière qui 2yyne peut pas faire, et vous pouvez mettre le nombre de lignes à atteindre en arrière dans y9jou y2k, etc. La seule différence est que votre compte doit être n-1pour un total de nlignes, mais votre tête peut apprendre que en tous cas.
zelk
406

Mode normal: voir les autres réponses.

La voie Ex :

  • :t. va dupliquer la ligne,
  • :t 7 le copiera après la ligne 7,
  • :,+t0copiera la ligne actuelle et la ligne suivante au début du fichier ( ,+est un synonyme de la plage .,.+1),
  • :1,t$copiera les lignes du début jusqu'à la position du curseur jusqu'à la fin ( 1,est un synonyme de la plage 1,.).

Si vous devez déplacer au lieu de copier, utilisez :mplutôt que :t.

Cela peut être vraiment puissant si vous le combinez avec :gou :v:

  • :v/foo/m$ déplacera toutes les lignes ne correspondant pas au motif «foo» à la fin du fichier.
  • :+,$g/^\s*class\s\+\i\+/t.copiera toutes les lignes suivantes du formulaire class xxxjuste après le curseur.

Référence: :help range, :help :t, :help :g, :help :met:help :v

Benoit
la source
1
Lorsque vous appuyez sur :en mode visuel, il est transformé en '<,'>afin de présélectionner la plage de lignes sur laquelle la sélection visuelle s'étend. Ainsi, en mode visuel, :t0copiera les lignes au début.
Benoit
1
Pour mémoire: lorsque vous tapez deux points (:), vous passez en mode ligne de commande où vous pouvez entrer des commandes Ex. vimdoc.sourceforge.net/htmldoc/cmdline.html Les commandes Ex peuvent être vraiment puissantes et concises. Les solutions yyp sont des commandes "Mode normal". Si vous souhaitez copier / déplacer / supprimer une ligne ou une plage de lignes éloignées, une commande Ex peut être beaucoup plus rapide.
Niels Bom
7
Les votes négatifs ne sont pas dus à un problème avec la réponse en tant que telle (bien que cela ne fonctionnerait pas dans ma situation, je n'ai aucune idée du numéro de ligne vers lequel je veux dupliquer) mais parce que ce ne devrait VRAIMENT pas être la première réponse / acceptée pour cela question fréquemment recherchée.
mjaggard
9
@mjaggard: les réponses acceptées sont toujours en tête, quel que soit leur score. Oui, j'ai ajouté cette réponse en complément, et il semble qu'elle convenait bien à l'OP.
Benoit
7
:t.est la réponse exacte à la question.
Burak Erdem
294

YPou Ypou yyp.

Linuline
la source
Yest généralement remappé à y$(yank (copie) jusqu'à la fin de la ligne (à partir de la position actuelle du curseur, pas au début de la ligne)). Avec cette ligne en .vimrc::nnoremap Y y$
Aaron Thoma
1
N'oubliez pas le pauvre vieuxyyP
icc97
253

copier et coller dans vim

Ce n'est pas plus simple que ça! Du mode normal:

yy

puis déplacez-vous sur la ligne à laquelle vous souhaitez coller et

p
Adam
la source
34
Qu'avez-vous utilisé pour faire le gif?
Zoltán
4
@ Zoltán, vous pouvez utiliser LiceCap, qui est de petite taille
onmyway133
53

yy

tirera sur la ligne actuelle sans la supprimer

dd

supprimera la ligne actuelle

p

sera putune ligne saisie par l'une des méthodes précédentes

pjz
la source
3
Celui-ci est arrivé en premier mais son double est accepté: stackoverflow.com/a/73357/1438029
Geoffrey Hale
44

Faites ceci:

Tout d'abord, yypour copier la ligne actuelle, puis ppour coller.

Eric Z Beard
la source
20
Ne tapez pas l'espace.
Niels Bom
1
Oui, si le curseur est à la fin de la ligne et que vous tapez l'espace comme indiqué, vous dupliquerez la ligne que vous avez tirée 2 lignes en dessous de la ligne que vous avez tirée.
44

Si vous voulez une autre façon:

"ayy: Cela stockera la ligne dans le tampon a.

"ap: Cela mettra le contenu du tampon asur le curseur.

Il existe de nombreuses variantes à ce sujet.

"a5yy: Cela stockera les 5 lignes dans le tampon a.

Voir " Fichiers d'aide Vim pour plus de plaisir.

Kwondri
la source
Merci, j'ai utilisé ceci comme un lien: map <Leader> d "ayy" ap
frbl
39

yyp - souviens-toi avec "yippee!"

Plusieurs lignes avec un nombre entre:

y7yp

theschmitzer
la source
17
7yy est équivalent à y7y et il est probablement plus facile de se rappeler comment faire.
graywh
10
y7yp (ou 7yyp) est rarement utile; le curseur reste sur la première ligne copiée pour que p colle les lignes copiées entre la première et la deuxième ligne de la source. Pour dupliquer un bloc de lignes, utilisez 7yyP
Nefrubyr
@Nefrubyr ou :.,.+7 copy .+7: P
DarkWiiPlayer
23

yyp - coller après

yyP - coller avant

yemu
la source
6
Étant donné que la ligne est dupliquée, le résultat final du contenu est le même.
Acumenus
4
@ABB Cependant, il y a une différence miniature ici - sur quelle ligne votre curseur atterrira-t-il.
Mikk
12

J'aime: Shift+ v(pour sélectionner immédiatement toute la ligne et vous permettre de sélectionner d'autres lignes si vous le souhaitez), y, p

Xavier Guihot
la source
11

Vous pouvez également essayer <Cx> <Cl> qui répétera la dernière ligne du mode insertion et vous apportera une fenêtre de complétion avec toutes les lignes. Cela fonctionne presque comme <Cp>


la source
C'est très utile, mais pour éviter d'avoir à appuyer sur plusieurs touches, je l'ai mappé à CTRL-L, voici ma carte: inoremap ^ L ^ X ^ L
Jorge Gajon
11

Une autre option serait d’aller avec:

nmap <C-d> mzyyp`z

vous donne l'avantage de conserver la position du curseur.

Tour
la source
10

Pour quelqu'un qui ne connaît pas vi, certaines réponses ci-dessus peuvent l'induire en erreur avec des phrases comme "coller ... après / avant la ligne actuelle ".
C'est en fait "coller ... après / avant le curseur ".

yyou Ypour copier la ligne
ou
ddpour supprimer la ligne

puis

ppour coller le texte copié ou supprimé après le curseur
ou
Ppour coller le texte copié ou supprimé avant le curseur


Pour plus de raccourcis clavier, vous pouvez visiter ce site: vi Liste complète des raccourcis clavier

Michael
la source
3

1 gotcha: lorsque vous utilisez "p" pour mettre la ligne, il la place après la ligne sur laquelle se trouve votre curseur, donc si vous voulez ajouter la ligne après la ligne sur laquelle vous tirez, ne déplacez pas le curseur sur une ligne avant de mettre la nouvelle ligne.

cori
la source
4
ou utilisez le capital P - mis avant
Ghoti
3

La valeur par défaut est yyp, mais j'utilise cette reliure depuis environ un an et j'adore:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv

Chris Penner
la source
3

Je sais que je suis en retard à la fête, mais peu importe; J'ai ceci dans mon .vimrc:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

la :copycommande copie simplement la ligne ou la plage sélectionnée (toujours des lignes entières) en dessous du numéro de ligne donné comme argument.

En mode normal, cela copy . copie la ligne juste en dessous de cette ligne .

Et en mode visuel, il se transforme en '<,'> copy '> copie du début de la sélection à la fin de la sélection jusqu'à la ligne en dessous de la fin de la sélection .

DarkWiiPlayer
la source
1
↑↑ meilleure réponse ici!
2

Pour ceux qui commencent à apprendre vi, voici une bonne introduction à vi en listant côte à côte les commandes vi au mouvement de curseur et aux touches de raccourci typiques de l'éditeur GUI Windows. Il répertorie toutes les commandes de base, y compris yy(ligne de copie) et p(coller après) ou P(coller avant).

vi (Vim) pour les utilisateurs Windows

ap-osd
la source
1

Si vous souhaitez dupliquer une ligne et la coller immédiatement en dessous du courant comme, comme dans Sublime Ctrl+ Shift+ D, vous pouvez l'ajouter à votre .vimrcfichier.

nmap <S-C-d> <Esc>Yp

Ou, pour le mode Insertion:

imap <S-C-d> <Esc>Ypa

jedi
la source
Cela laisse le mode d'insertion cependant, et l'ajout ià la fin pour le ressaisir se brise undo, donc la solution pour dupliquer des lignes en mode d'insertion n'est pas aussi triviale qu'il y paraît.
DarkWiiPlayer
Cela fonctionne parfaitement bien pour moi: imap <S-C-d> <Esc>Ypi mode insertion et nmap <S-C-d> <Esc>Ypen mode normal
jedi
0

J'aime utiliser cette cartographie:

:nnoremap yp Yp

car il est cohérent à utiliser avec la YPcommande native .

yolenoyer
la source