Comment coller du texte retiré dans la ligne de commande Vim

Réponses:

1157

Oui. Frappez Ctrl- Ralors ". Si vous avez des caractères de contrôle littéral dans ce que vous avez yanked, utilisez Ctrl- R, Ctrl- O, ".

Voici une explication de ce que vous pouvez faire avec les registres. Ce que vous pouvez faire avec les registres est extraordinaire, et une fois que vous savez les utiliser, vous ne pouvez plus vous en passer.

Les registres sont essentiellement des emplacements de stockage pour les chaînes. Vim possède de nombreux registres qui fonctionnent de différentes manières:

  • 0(registre yank: lorsque vous utilisez yen mode normal, sans spécifier de registre, le texte yanké y va et aussi dans le registre par défaut),
  • 1à 9(décalage des registres de suppression, lorsque vous utilisez des commandes telles que cou d, ce qui a été supprimé va au registre 1, ce qui était dans le registre 1 va au registre 2, etc. ),
  • "(registre par défaut, également appelé registre sans nom. C'est là "qu'intervient Ctrl- R, "),
  • aà zpour votre usage personnel (en majuscules Apour Zêtre ajouté aux registres correspondants).
  • _(agit comme /dev/null(Unix) ou NUL(Windows), vous pouvez y écrire mais il est jeté et lorsque vous le lisez, il est toujours vide),
  • - (petit registre d'effacement),
  • /(recherche registre de motif, mis à jour lorsque vous cherchez texte /, ?, *ou , #par exemple, vous pouvez également écrire à modifier dynamiquement le modèle de recherche),
  • :(stocke la dernière commande typée VimL via Qou :, en lecture seule),
  • +et *(les registres du presse-papiers du système, vous pouvez leur écrire pour définir le presse-papiers et en lire le contenu)

Voir :help registerspour la référence complète.

Vous pouvez, à tout moment, utiliser :registerspour afficher le contenu de tous les registres. Les synonymes et raccourcis de cette commande sont :display, :reget :di.

En mode Insertion ou Ligne de commande, Ctrl- Rplus un nom de registre, insère le contenu de ce registre. Si vous souhaitez les insérer littéralement (pas d'indentation automatique, pas de conversion de caractères de contrôle comme 0x08pour revenir en arrière, etc.), vous pouvez utiliser Ctrl- R, Ctrl- O, enregistrer le nom. Voir :help i_CTRL-Rles paragraphes suivants pour plus de référence.

Mais vous pouvez également faire ce qui suit (et j'ai probablement oublié de nombreuses utilisations pour les registres).

  • En mode normal, appuyez sur ":p. La dernière commande que vous avez utilisée dans vim est collée dans votre tampon.
    Décomposons: "est une commande en mode Normal qui vous permet de sélectionner le registre à utiliser lors de la prochaine opération de coupure, de suppression ou de collage. ":Sélectionne donc le registre deux-points (stockant la dernière commande). Alors pc'est une commande que vous connaissez déjà, elle colle le contenu du registre.

    cf. :help ",:help quote_:

  • Vous éditez un fichier VIML (par exemple votre .vimrc) et souhaitez exécuter quelques lignes consécutives en ce moment: yj:@"Enter.
    Ici, yjplace la ligne courante et la ligne suivante (c'est parce que j est un mouvement linéaire mais cela est hors de portée de cette réponse) dans le registre par défaut (également connu sous le nom de registre sans nom). Ensuite, la :@commande Ex lit les commandes Ex stockées dans le registre donné en argument, et "c'est ainsi que vous vous référez au registre sans nom. Voir également le haut de cette réponse, qui est lié.

    Ne confondez pas "utilisé ici (qui est un nom de registre) avec l' "exemple précédent, qui était une commande en mode normal.

    cf. :help :@et:help quote_quote

  • Insérez le dernier motif de recherche dans votre fichier en mode Insertion, ou dans la ligne de commande, avec Ctrl- R, /.

    cf. :help quote_/,help i_CTRL-R

    Corollaire: Gardez votre modèle de recherche , mais ajouter une alternative: / Ctrl- R, / \|alternative.

  • Vous avez sélectionné deux mots au milieu d'une ligne en mode visuel, les avez tirés avec y, ils sont dans le registre sans nom. Maintenant , vous voulez ouvrir une nouvelle ligne juste au- dessous où vous êtes, avec ces deux mots: :pu. C'est un raccourci pour :put ". La :putcommande, comme de nombreuses commandes Ex, fonctionne uniquement en ligne.

    cf. :help :put

    Vous auriez aussi pu le faire: :call setreg('"', @", 'V')alors p. La setregfonction définit le registre dont le nom est donné comme premier argument (sous forme de chaîne), l'initialise avec le contenu du deuxième argument (et vous pouvez utiliser les registres comme variables avec le nom @xxest le nom du registre dans VimL), et le transforme dans le mode spécifié dans le troisième argument, Vpour linewise, rien pour characterwise et littéral ^Vpour blockwise.

    cf. :help setreg(). Les fonctions inverses sont getreg()et getregtype().

  • Si vous avez enregistré une macro avec qa... q, alors :echo @avous dira ce que vous avez tapé, et @arejouera la macro (probablement vous la connaissiez, très utile pour éviter les tâches répétitives)

    cf. :help q,help @

    Corollaire de l'exemple précédent: Si vous en avez 8godans le presse-papiers, alors @+le contenu du presse-papiers sera lu comme une macro, et ira ainsi au 8ème octet de votre fichier. En fait, cela fonctionnera avec presque tous les registres. Si votre dernière chaîne insérée était dden mode Insertion, alors @.(car le .registre contient la dernière chaîne insérée) supprimera une ligne. (Documentation Vim est mal à cet égard, car elle indique que les registres #, %, :et .ne fonctionne qu'avec p, P, :putet Ctrl- R).

    cf. :help @

    Ne confondez pas :@(commande qui lit les commandes Vim à partir d'un registre) et @(commande en mode normal qui lit les commandes en mode normal à partir d'un registre).

    Une exception notable est @:. Le registre de commandes ne contient pas les deux points initiaux ni le retour chariot final. Cependant en mode Normal, @:fera ce que vous attendez, interprétant le registre comme une commande Ex, n'essayant pas de le jouer en mode Normal. Donc si votre dernière commande était :e, le registre contient emais @:rechargera le fichier, pas aller en fin de mot.

    cf. :help @:

  • Montrez ce que vous allez faire en mode normal avant de l' exécuter: @='dd' Enter. Dès que vous appuyez sur la =touche, Vim passe à l'évaluation des expressions: lorsque vous entrez une expression et appuyez sur Enter, Vim la calcule et le résultat agit comme un contenu de registre. Bien sûr, le registre =est en lecture seule et ponctuel. Chaque fois que vous commencez à l'utiliser, vous devrez saisir une nouvelle expression.

    cf. :help quote_=

    Corollaire: si vous éditez une commande et que vous vous rendez compte que vous devez insérer dans votre ligne de commande une ligne de votre tampon actuel: n'appuyez pas sur Esc! Utilisez Ctrl- R =getline(58) Enter. Après cela, vous serez de retour à l'édition de ligne de commande, mais il a inséré le contenu de la 58e ligne.

  • Définissez un modèle de recherche manuellement: :let @/ = 'foo'

    cf. :help :let

    Notez qu'en faisant cela, vous n'avez pas besoin de vous échapper /dans le motif. Cependant, vous devez bien sûr doubler tous les guillemets simples.

  • Copier toutes les lignes commençant par foo, et ensuite toutes les lignes contenant barau presse - papiers, la chaîne de ces commandes: qaq(remet à zéro le un registre stockant une macro vide à l' intérieur de celui - ci), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    L'utilisation d'un nom de registre majuscule fait fonctionner le registre en mode ajout

    Mieux, s'il Qn'a pas été remappé par mswin.vim, démarrez le mode Ex avec Q, enchaînez les «commandes deux-points» qui sont en fait mieux appelées «commandes Ex», et revenez au mode Normal en tapant visual.

    cf. :help :g, :help :y,:help Q

  • Double-espace fichier: :g/^/put _. Cela place le contenu du registre des trous noirs (vide lors de la lecture, mais inscriptible, se comportant comme /dev/null) ligne par ligne, après chaque ligne (car chaque ligne a un début!).

  • Ajoutez une ligne fooavant chaque ligne: :g/^/-put ='foo'. Il s'agit d'une utilisation intelligente du registre d'expression. Ici, -est synonyme de .-1(cf. :help :range). Puisque :putplace le texte après la ligne, vous devez lui dire explicitement d'agir sur la précédente.

  • Copiez l'intégralité du tampon dans le presse - papiers du système: :%y+.

    cf. :help :range(pour la %partie) et :help :y.

  • Si vous avez mal enregistré une macro, vous pouvez taper :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter 'et la modifier. Cela modifiera le contenu de la macro stockée dans le registre a, et il est montré ici comment vous pouvez utiliser le registre d'expression pour le faire.

  • Si vous l'avez fait dddd, vous pourriez le faire uupour annuler. Avec pvous pouvez obtenir la dernière ligne supprimée. Mais vous pouvez réellement également récupérer jusqu'à 9 avec les registres supprime @1par @9.

    Encore mieux, si vous le faites "1P, alors .en mode Normal jouera "2P, et ainsi de suite.

    cf. :help .et:help quote_number

  • Si vous souhaitez insérer la date actuelle en mode Insertion: Ctrl- R=strftime('%y%m%d')Enter.

    cf. :help strftime()

Encore une fois, ce qui peut prêter à confusion:

  • :@ est une commande en ligne de commande qui interprète le contenu d'un registre comme vimscript et le source
  • @ en mode normal, qui interprète le contenu d'un registre comme des frappes en mode normal (sauf lorsque vous utilisez :register, qui contient la dernière commande jouée sans les deux points initiaux: dans ce cas, il rejoue la commande comme si vous aviez également retapé les deux points et la touche de retour finale).

  • " en mode normal commande qui vous aide à sélectionner un registre pour yank, coller, supprimer, corriger, etc.

  • " est également un nom de registre valide (le registre par défaut ou sans nom) et peut donc être passé comme argument pour les commandes qui attendent des noms de registre
Benoit
la source
205
N'y a-t-il pas un badge «rapport de longueur 100/1 entre la réponse et la question?» :)
Benoit
8
C'est une excellente réponse, mais il manque environ 900 mots pour 1400. :)
19
Cette réponse a changé la façon dont j'utilise vim. Merci Benoit
P. Myer Nore
11
N'oubliez pas: reg qui répertoriera tous les registres ainsi que leur contenu
eugenevd
3
Dans les versions récentes de vim, les suppressions inférieures à une ligne entrent dans le "registre des petites suppressions" au lieu d'entrer dans les registres numérotés. Références: Vi et Vim , Vi et Vim , Reddit
Christian Long
48

Pour coller quelque chose qui est le presse-papiers du système, vous pouvez simplement utiliser SHIFT- INS.

Cela fonctionne sous Windows, mais je suppose que cela fonctionne aussi bien sous Linux.

skeept
la source
7
Ouaip, fonctionne aussi sous Linux. Testé sous GNOME dans Vim et GVim.
Teoulas
3
Cela alimente en fait la table de montage vers Vim en tant qu'entrée clavier, donc si vous êtes en mode normal et collez :!rm -rf /<cr>, cela l'exécuterait. Utilisez plutôt des registres!
lericson
4
@lericson N'ai-je pas dit dans ma réponse que cela était utile pour quelque chose qui se trouve dans le clavier du système? Je ne comprends pas le downvote. Et pour vous par exemple, sérieusement? Vous avez vraiment ça dans le presse-papiers? Et vous ne pensez pas que la frappe shift-insest plus facile que ctrl-R+*? C'est bien sûr si vous êtes dans gvim. Si vous êtes dans le terminal connecté à une autre machine et que vous souhaitez coller quelque chose depuis votre presse-papiers, savez-vous mieux que shift-ins? parce que les registres ne fonctionnent pas dans cette situation. Réfléchissez bien avant de commenter et de faire autre chose (comme voter en aval).
skeept
Je pense que c'est de la désinformation et j'ai donné suite à ce jugement.
lericson
1
Ça ne marche pas pour moi. Je viens d'ajouter «<S-Insert>» à ma ligne de commande. Peut-être que je manque quelque chose. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Max Waterman du
39

"Je voudrais coller du texte sur la ligne de commande Vim."

Bien que la réponse la plus votée soit très complète, je préfère modifier l'historique des commandes.

En mode normal, tapez: q:. Cela vous donnera une liste des commandes récentes, modifiables et consultables avec les commandes vim normales. Vous commencerez sur une ligne de commande vierge en bas.

Pour la chose exacte que l'article demande, en collant une ligne tirée (ou quoi que ce soit tirée) dans une ligne de commande, tirez votre texte puis: q:p(passez en mode d'édition de l'historique des commandes, puis (p) mettez votre texte tiré dans une nouvelle commande Modifier à volonté, enterpour exécuter.

Pour sortir du mode historique de commande, c'est l'inverse. En mode normal dans l'historique des commandes, tapez: :q+enter

Wandspiegel
la source
1
si vous modifiez déjà une commande existante et que vous n'avez pas appuyé sur 'q:' appuyez sur ctrl + f et cela vous permettra de modifier l'historique des commandes.
Clay
14

Pour coller quelque chose du presse-papiers du système dans la ligne de commande Vim ("mode de commande"), utilisez Ctrl+ Rsuivi de +. Pour moi, au moins sur Ubuntu, Shift+ Insne fonctionne pas.

PS: Je ne sais pas pourquoi Ctrl+ Rsuivi *, qui est théoriquement le même que Ctrl+ Rsuivi +ne semble pas toujours fonctionner. J'ai cherché et découvert la +version et elle semble toujours fonctionner, au moins sur ma box.

Proto
la source
2
La différence entre Ctrl-r + et Ctrl-r * est que le premier est le presse-papiers normal, mais sous Linux, il existe un deuxième type de presse-papiers appelé "principal" qui représente le texte le plus récemment sélectionné (le bouton du milieu de la souris le colle) . Ce n'est cependant pas disponible sous Windows ou MAC
Matias Thayer
13

Il convient également de noter que les registres yank sont les mêmes que les tampons macro. En d'autres termes, vous pouvez simplement écrire l'intégralité de votre commande dans votre document (y compris votre extrait collé), puis la "bycopier dans le bregistre, puis l'exécuter avec @b.

rien101
la source
1

J'avais un problème similaire. Je voulais que le texte sélectionné se retrouve dans une commande, mais ne comptez pas sur le coller. Voici la commande pour laquelle j'essayais d'écrire un mappage:

:call VimuxRunCommand("python")

Les documents de ce plugin ne montrent que l'utilisation de littéraux de chaîne. Ce qui suit se cassera si vous essayez de sélectionner du texte contenant des guillemets doubles:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Pour contourner cela, il vous suffit de référencer le contenu de la macro en utilisant @:

vnoremap y:call VimuxRunCommand(@")<cr>

Transmet le contenu du registre sans nom et fonctionne avec mes guillemets doubles et edgecases multilignes.

Conrad.Dean
la source
Je pense que votre dernier exemple manque un ". Peut-être que vous vouliez dire VimuxRunCommand (" @ ").
kd8azz
Cela enverrait le @personnage à la commande vimux. pensez @à échapper à la double citation suivante et à la traiter comme un registre plutôt que comme un caractère régulier. Le que vnoremapj'ai défini est actif en mode visuel, il tire donc le texte sélectionné, puis le colle dans la commande vimux, en l'envoyant à un interpréteur en cours d'exécution dans un volet adjacent. vraiment génial pour travailler sur un script et tester de petites portions avec quelques touches.
Conrad.Dean
1

OS X

Si vous utilisez Vim dans Mac OS X, malheureusement, il est livré avec une version plus ancienne et non conforme aux options du presse-papiers. Heureusement, Homebrew peut facilement résoudre ce problème.

Installez Vim:

brew install vim --with-lua --with-override-system-vi

Installez la version GUI de Vim:

brew install macvim --with-lua --with-override-system-vi

Redémarrez le terminal pour qu'il prenne effet.


Ajoutez la ligne suivante à ~/.vimrc
set clipboard=unnamed

Vous pouvez maintenant copier la ligne dans Vim avec yyet la coller à l'échelle du système.

anonyme
la source
1

Pour le contexte, ces informations proviennent d'emblée, pas de plugins, pas de comportement .vimrc Vim 7.4 dans Linux Mint avec les options par défaut.

Vous pouvez toujours sélectionner du texte avec la souris (ou en utilisant Vou vet en plaçant la sélection dans le registre "*), et le coller dans la ligne de commande avec Shift+ Ctrl+ v.

Taper Ctrl+ rdans la ligne de commande provoquera une invite pour un nom de registre. donc la saisie :CTRL-r*placera le registre de contenu * dans la ligne de commande. Il va coller n'importe quel registre, pas seulement "*. Voir :help c_CTRL-R.

De plus, le bouton central de la souris sera collé dans la ligne de commande.

Voir :help->quote-pluspour une description de la façon dont X Window gère la sélection. Même dans un Vim simple et prêt à l'emploi (encore une fois, dans Vim 7.4 dans Linux Mint), toute sélection effectuée avec le bouton gauche de la souris peut être collée dans la ligne de commande avec le bouton central de la souris.

En outre, le bouton central de la souris collera également le texte sélectionné dans Vim dans de nombreuses autres applications X Window, même celles de l'interface graphique (par exemple, Firefox et Thunderbird ) et le collage de texte dans la ligne de commande est également possible lorsque le texte a été sélectionné à partir d'autres applications. .

Voir: help-> x11-selection pour des informations supplémentaires.

tl; dr

Essayez d'abord l'approche: CTRL-r, puis utilisez Shift+ Ctrl+ vou le bouton central de la souris si vous avez besoin d'autre chose.

Il est admis que cela peut prêter à confusion.

wmmso
la source
0
  1. "[a-z]y: Copier du texte dans le registre [az]

  2. Utilisez :!pour accéder à la commande d'édition

  3. Ctrl+ R: Suivez l'identité du registre pour coller ce que vous copiez.

Il utilisait CentOS 7.

Yang
la source
Qu'entend-on par «Il utilisait CentOS 7.» ?
Peter Mortensen
0

Si vous avez deux valeurs tirées dans deux registres différents (par exemple registre aet registre b), vous pouvez simplement définir une variable cet effectuer l'opération sur celle-ci.

Par exemple, :set c = str2float(@a) + str2float(@b)puis vous pouvez coller le contenu de cn'importe où.

Par exemple, en mode INSERT, CTRL + Rtapez =pour entrer dans le registre d'expression et tapez simplement caprès le signe égal et appuyez sur ENTREE. Terminé, vous devriez maintenant avoir le total de aet les bregistres.

Tout cela peut être enregistré dans une macro et répété!

La str2floatfonction est utilisée si vous travaillez avec des flottants, sinon, vous obtiendrez des entiers à la place.

Je ne sais pas si c'est idiomatique mais cela a fonctionné pour mon cas où j'avais besoin d'ajouter 2 numéros d'affilée et de le répéter pour 500 lignes supplémentaires.

Rafael
la source