web-dev-qa-db-fra.com

Comment coller du texte tiré dans la ligne de commande de Vim?

Je voudrais coller le texte tiré dans la ligne de commande de Vim. C'est possible?

548
dan

Oui. Frappé Ctrl-R puis ". Si vous avez des caractères de contrôle littéraux dans ce que vous avez tiré, utilisez Ctrl-RCtrl-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 vous en servir, vous ne pouvez plus vous en passer.

Les registres sont essentiellement des emplacements de stockage pour les chaînes. Vim a 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 transféré y est envoyé ainsi que dans le registre par défaut),
  • 1 à 9 (en déplaçant les registres de suppression, lorsque vous utilisez des commandes telles que cou dname__, 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 non nommé. C’est là que le " entre Ctrl-R"),
  • aà zpour votre propre usage (majuscule Aà Zsont à ajouter aux registres correspondants).
  • _ (agit comme /dev/null (Unix) ou NUL(Windows), vous pouvez y écrire mais c'est ignoré et quand vous le lisez, il est toujours vide),
  • - (petit registre de suppression),
  • / (registre des modèles de recherche, mis à jour lorsque vous recherchez du texte avec, par exemple, /, ?, * ou #; vous pouvez également y écrire pour modifier dynamiquement le modèle de recherche),
  • : (stocke la dernière commande typée VimL via Qou :, en lecture seule),
  • + et * (registres du presse-papiers du système, vous pouvez leur écrire pour définir le presse-papiers et en lire le contenu dans le presse-papiers)

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

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

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

Mais vous pouvez aussi faire ce qui suit (et j’ai probablement oublié beaucoup d’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 yank, delete ou coller. Alors ": sélectionne le registre deux points (mémorisation de la dernière commande). ensuite p 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 maintenant: yj:@"Enter.
    Ici, yj yanks current et next line (c’est parce que j est un mouvement ligne par ligne mais cela n’entre pas dans le cadre de cette réponse) dans le registre par défaut (également appelé registre non nommé). Ensuite, la commande :@ Ex lit les commandes Ex stockées dans le registre indiqué en tant qu'argument, et " désigne comment vous vous référez au registre sans nom. Voir également le haut de cette réponse, qui est liée.

    Ne confondez pas " utilisé ici (qui est un nom de registre) avec le " de 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: conservez votre modèle de recherche mais ajoutez une alternative: / Ctrl-R/ \|alternative.

  • Vous avez sélectionné deux mots au milieu d'une ligne en mode visuel, vous les avez transférés avec yname__, ils sont dans le registre sans nom. Maintenant, vous voulez ouvrir une nouvelle ligne juste en dessous de votre position, avec ces deux mots: :pu. Ceci est un raccourci pour :put ". La commande :put, comme beaucoup de commandes Ex, ne fonctionne que ligne par ligne.

    cf. :help :put

    Vous auriez également pu faire: :call setreg('"', @", 'V') puis pname__. La fonction setregdéfinit le registre dont le nom est donné comme premier argument (sous forme de chaîne), l'initialise avec le contenu du second argument (et vous pouvez utiliser des registres comme variables avec le nom @xxest le nom du registre dans VimL ), et le met dans le mode spécifié dans le troisième argument, Vpour une ligne, rien pour un caractère et littéral ^V pour un bloc.

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

  • Si vous avez enregistré une macro avec qaname __...qname__, alors :echo @a vous dira ce que vous avez tapé et @a va rejouer la macro (probablement que 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 avez 8go dans le presse-papiers, @+ lira le contenu du presse-papiers en tant que macro et passera 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 @. supprimera une ligne (car le registre . contient la dernière chaîne insérée). (La documentation de Vim est fausse à cet égard, car elle indique que les registres #, %, : et . ne fonctionneront qu'avec pname__, Pname__, :put et Ctrl-R).

    cf. :help @

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

    L'exception notable est @:. Le registre de commandes ne contient pas les deux-points initiaux ni le dernier retour chariot. Cependant, en mode normal, @: fera ce que vous attendez, interprétant le registre comme une commande Ex et n'essayant pas de le lire en mode normal. Donc, si votre dernière commande était :e, le registre contient emais @: rechargera le fichier, pas la fin de Word.

    cf. :help @:

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

    cf. :help quote_=

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

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

    cf. :help :let

    Notez que pour cela, vous n'avez pas besoin d'échapper à / dans le modèle. Cependant, vous devez bien sûr doubler tous les guillemets simples.

  • Copiez toutes les lignes commençant par fooname__, et ensuite toutes les lignes contenant barau presse-papiers, chaînez ces commandes: qaq(réinitialise le registre a dans lequel il stocke une macro vide), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    L'utilisation d'un nom de registre capital permet au registre de fonctionner en mode ajout

    Mieux, si Qn’a pas été remappé par mswin.vim, démarrez le mode Ex avec Qname__, chaînez ces "commandes deux-points" qui sont en réalité mieux appelées "Commandes Ex" et revenez au mode normal en tapant visualname__.

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

  • Double-espacez votre fichier: :g/^/put _. Cela met le contenu du registre de trou noir (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 contenant fooavant chaque ligne: :g/^/-put ='foo'. C'est une utilisation intelligente du registre d'expression. Ici, - est un synonyme de .-1 (cf. :help :range). Puisque :put place le texte après la ligne, vous devez lui indiquer explicitement d’agir sur la précédente.

  • Copiez l'intégralité de la mémoire 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 le modifier. Ceci modifiera le contenu de la macro stockée dans le registre aet montrera ici comment utiliser le registre d’expression pour le faire.

  • Si vous avez utilisé ddddname__, vous pouvez éventuellement utiliser uuafin de l'annuler. Avec pname__, vous pouvez obtenir la dernière ligne supprimée. Mais en réalité, vous pouvez également récupérer jusqu'à 9 suppressions avec les registres @1 à @9.

    Encore mieux, si vous 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 du jour en mode Insertion: Ctrl-R=strftime('%y%m%d')Enter.

    cf. :help strftime()

Encore une fois, qu'est-ce qui peut être déroutant?

  • :@ est une commande de ligne de commande qui interprète le contenu d’un registre comme étant vimscript et le source.
  • @ en mode normal commande qui interprète le contenu d'un registre comme une frappe au clavier en mode normal (sauf lorsque vous utilisez le registre :, qui contient la dernière commande lue sans les deux-points initiaux: dans ce cas, il réécrit la commande comme si vous tapiez à nouveau le deux points et la touche de retour final).

  • " 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 non nommé) et peut donc être transmis en tant qu'argument pour les commandes qui attendent des noms de registre.
1086
Benoit

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

Cela fonctionne sous Windows, mais j'imagine que cela fonctionne également sous Linux.

45
skeept

"J'aimerais coller le texte tiré dans la ligne de commande de Vim."

Bien que la réponse votée par le haut soit très complète, je préfère éditer l’historique des commandes.

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

Pour la chose exacte que l'article demande, en collant une ligne tirée (ou n'importe quoi) dans une ligne de commande, écrivez votre texte puis: q:p (entrez dans le mode d'édition de l'historique des commandes, puis (p) utilisez votre texte tiré dans une nouvelle ligne de commande. Modifier à volonté, enter éxécuter.

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

35
Wandspiegel

Pour coller quelque chose du presse-papiers du système dans la ligne de commande vim ("mode de commande"), utilisez Ctrl+R suivi par +. Pour moi, au moins sur Ubuntu, Shift+Ins ne fonctionne pas.

PS: Je ne sais pas pourquoi Ctrl+R suivi par *, qui est théoriquement le même que Ctrl+R suivi par + ne semble pas fonctionner toujours. J'ai cherché et découvert le + version et cela semble fonctionner toujours, au moins sur ma boîte.

14
Proto

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

13
naught101

cette question est assez ancienne, mais vu qu'elle a été vue tellement de fois, elle semble être populaire - je vais la mettre ici pour la postérité. Pour le contexte, cette information provient de prêt à l'emploi, pas de plugins, pas de comportement .vimrc vim 7.4 dans linux neuf avec les options par défaut.

vous pouvez toujours sélectionner du texte avec la souris (ou en utilisant V ou v et en plaçant la sélection dans le "" registre), et le coller dans la ligne de commande avec SHIFT-CTL-v. 

taper CTL-r sur la ligne de commande provoquera une invite pour un nom de registre. Donc, en tapant: CTL-r * placera le registre de contenu * dans la ligne de commande. il va coller tous les registres, pas seulement "*. voir: help c_CTRL-R.

de plus, le bouton central de la souris va coller dans la ligne de commande . voir: help-> quote-plus pour une description de la façon dont x11 gère la sélection. même dans un vim simple et sortant de la boîte (encore une fois, dans vim 7.4 sous linux, de toute façon), 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 permet également de coller le texte sélectionné dans vim dans de nombreuses autres applications x11, même celles gui (par exemple, firefox, Thunderbird). Il est également possible de coller du texte dans la ligne de commande lorsque le texte a été sélectionné à partir d'autres applications. 

voir: help-> x11-selection pour plus d’informations.

tl; dr

essayez d’abord l’approche: CTL-r, puis utilisez SHIFT-CTL-v ou le bouton central de la souris si vous avez besoin d’autre chose.

il est concédé que cela peut être déroutant.

1
wmmso

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

:call VimuxRunCommand("python")

Les docs de ce plugin ne s'affichent qu'en utilisant des littéraux de chaîne. Si vous essayez de sélectionner du texte contenant des guillemets doubles, les choses suivantes se briseront:

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

Pour contourner ce problème, il vous suffit de référencer le contenu de la macro à l'aide de @:

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

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

1
Conrad.Dean

OSX

Si vous utilisez vim sous MAC OSX, il est malheureusement livré avec une version plus ancienne et n'est pas conforme aux options du presse-papiers Heureusement, les homebrews peuvent facilement résoudre ce problème.

installez vim:

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

installez l'interface utilisateur de vim:

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

redémarrez le terminal pour prendre effet. 


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

maintenant, vous pouvez copier la ligne dans vim avec yy et la coller dans tout le système.

1
anonymous
  1. "[a-z]y copier le texte dans le registre [a-z];

  2. utilisez :!go pour éditer la commande;

  3. CTRL+R suivez l'identité du registre pour coller ce que vous copiez.

Il utilisait CentOS7.

0
yang