Question Comment coller du texte saisi dans la ligne de commande Vim?


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


523
2017-10-22 13:08


origine


Réponses:


Oui. Frappé Ctrl-R puis ". Si vous avez des caractères de contrôle littéraux dans ce que vous avez saisi, 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 comment les utiliser, vous ne pouvez pas vivre sans eux.

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 (yank register: quand vous utilisez y en mode normal, sans spécifier de registre, le texte yanked y va et aussi le registre par défaut),
  • 1 à 9 (suppression des registres de suppression, lorsque vous utilisez des commandes telles que c ou 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 connu sous le nom de registre sans nom. " entre Ctrl-R, "),
  • a à z pour votre propre usage (capitalisé A à Z sont à ajouter aux registres correspondants).
  • _ (Agit comme /dev/null (Unix) ou NUL (Windows), vous pouvez y écrire mais il est défaussé et quand vous le lisez, il est toujours vide),
  • - (petit registre de suppression),
  • / (registre de motifs de recherche, mis à jour lorsque vous recherchez du texte avec /, ?, * ou # par exemple; vous pouvez également écrire dessus pour changer dynamiquement le motif de recherche),
  • : (stocke la dernière commande tapée VimL via Q ou :, lecture seulement),
  • + et * (registres du presse-papiers système, vous pouvez leur écrire pour définir le presse-papiers et lire le contenu du presse-papiers à partir d'eux)

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 pour cette commande sont :display, :reg et :di.

En mode Insérer 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 retour arrière, etc.), vous pouvez utiliser Ctrl-R, Ctrl-O, inscrivez le nom. Voir :help i_CTRL-R et 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-nous: " est une commande en mode Normal qui vous permet de sélectionner le registre à utiliser lors de la prochaine opération de suppression, de suppression ou de collage. Alors ": sélectionne le registre deux-points (en mémorisant la dernière commande). alors 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 voudrait exécuter quelques lignes consécutives en ce moment: yj:@"Entrer.
    Ici, yj supprime la ligne courante et la ligne suivante (car j est un mouvement par ligne mais cela sort du cadre de cette réponse) dans le registre par défaut (également connu sous le nom de registre sans nom). Puis le :@La commande Ex joue les commandes Ex stockées dans le registre donné en argument, et " est comment vous vous référez au registre sans nom. Voir aussi 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 motif 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 saisis avec y, ils sont dans le registre sans nom. Maintenant, vous voulez ouvrir une nouvelle ligne juste en dessous de l'endroit où vous êtes, avec ces deux mots: :pu. C'est un raccourci pour :put ". le :put commande, comme beaucoup de commandes Ex, ne fonctionne que par ligne.

    cf. :help :put

    Vous auriez aussi pu faire: :call setreg('"', @", 'V') puis p. le setreg function définit le registre dont le nom est donné comme premier argument (sous la forme d'une chaîne), l'initialise avec le contenu du second argument (et vous pouvez utiliser des registres comme variables avec le nom @x où x est le nom du registre dans VimL), et le transforme en mode spécifié dans le troisième argument, V pour linewise, rien pour characterwise et littéral ^V pour blockwise.

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

  • Si vous avez enregistré une macro avec qa...q, puis :echo @a vous dira ce que vous avez tapé, et @a va rejouer la macro (probablement vous le saviez, 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, puis @+ va lire le contenu du presse-papiers en tant que macro, et donc aller 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 dd en mode Insertion, puis @. sera (parce que le . register contient la dernière chaîne insérée) supprime une ligne. (La documentation de Vim est erronée à cet égard, car elle indique que les registres #, %, : et . ne fonctionnera qu'avec p, P, :put et Ctrl-R).

    cf. :help @

    Ne pas confondre :@ (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 commande ne contient pas le deux-points initial et ne contient pas non plus le retour chariot final. Cependant en mode Normal, @: fera ce que vous attendez en interprétant le registre comme une commande Ex, sans essayer de le jouer en mode Normal. Donc, si votre dernière commande était :e, le registre contient e mais @: va recharger le fichier, pas aller à la fin du mot.

    cf. :help @:

  • Montrez ce que vous ferez en mode Normal avant de l'exécuter: @='dd'  Entrer. Dès que vous frappez le = clé, Vim passe à l'évaluation d'expression: lorsque vous entrez une expression et appuyez sur Entrer, Vim le calcule et le résultat agit comme un contenu de registre. Bien sûr le registre = est en lecture seule et one-shot. Chaque fois que vous commencez à l'utiliser, vous devrez entrer une nouvelle expression.

    cf. :help quote_=

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

  • Définir un motif de recherche manuellement: :let @/ = 'foo'

    cf. :help :let

    Notez que faire cela, vous ne devez pas échapper / dans le motif. Cependant, vous devez bien sûr doubler tous les guillemets simples.

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

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

    Mieux, si Q n'a pas été remappé par mswin.vim, lancez le mode Ex avec Q, enchaînez ces "commandes du colon" qui sont mieux appelées "commandes Ex", et revenez en mode normal en tapant visual.

    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 comporter comme /dev/null) par ligne, après chaque ligne (parce que chaque ligne a un début!).

  • Ajouter une ligne contenant foo avant chaque ligne: :g/^/-put ='foo'. C'est une utilisation intelligente du registre d'expression. Ici, - est synonyme de .-1 (cf. :help :range). Depuis :put met le texte après la ligne, vous devez lui dire explicitement d'agir sur le précédent.

  • Copiez le tampon entier dans le presse-papiers du système: :%y+.

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

  • Si vous avez mal enregistré une macro, vous pouvez taper :let @a='  Ctrl-R  =replace(@a,"'","''",'g')  Entrer  ' et éditez-le. Cela va modifier 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 faire uu afin de défaire. Avec p vous pourriez obtenir la dernière ligne supprimée. Mais en réalité, vous pouvez également récupérer jusqu'à 9 suppressions avec les registres @1 par @9.

    Encore mieux, si vous le faites "1P, puis . en mode normal jouera "2P, etc.

    cf. :help . et :help quote_number

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

    cf. :help strftime()

Encore une fois, ce qui peut être déroutant:

  • :@ est une commande de ligne de commande qui interprète le contenu d'un registre en tant que vimscript
  • @  en mode normal commande qui interprète le contenu d'un registre en tant que frappes en mode normal (sauf si vous utilisez : register, qui contient la dernière commande jouée sans le signe deux-points initial: dans ce cas, elle relit la commande comme si vous aviez également re-tapé 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é en tant qu'argument pour les commandes qui attendent des noms de registre

1016
2018-06-20 15:40



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

Cela fonctionne sous Windows, mais je suppose que cela fonctionne également sous Linux.


42
2017-07-26 14:30



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

Bien que la réponse la mieux 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 de commandes récentes, modifiables et consultables avec les commandes vim normales. Vous allez commencer sur une ligne de commande vide en bas.

Pour la chose exacte que l'article demande, en collant une ligne tirée (ou tiré n'importe quoi) dans une ligne de commande, tirez votre texte et puis: q:p (Entrez dans le mode d'édition de l'historique des commandes, puis (p) tapez votre texte saisi dans une nouvelle ligne de commande. entrer éxécuter.

Pour sortir du mode histoire de la commande, c'est le contraire. En mode normal dans l'historique des commandes, tapez: :q + entrer


33
2018-04-11 06:39



Il est à noter que les registres yank sont les mêmes que les buffers de macro. En d'autres termes, vous pouvez simplement écrire toute votre commande dans votre document (y compris votre extrait collé), puis "by pour le tirer vers le b s'inscrire, puis l'exécuter avec @b.


13
2018-04-01 04:47



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, Décalage+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 il semble fonctionner toujours, au moins sur ma boîte.


11
2017-07-28 04:12



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

:call VimuxRunCommand("python")

Les documents pour ce plugin ne montrent que l'utilisation de littéraux de chaîne. Ce qui suit va casser si vous essayez de sélectionner du texte qui contient des doubles quotes:

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 multilignes.


1
2017-08-16 08:03



OSX

Si vous utilisez vim dans MAC OSX, il est malheureusement accompagné d'une version antérieure et n'est pas compatible avec les options du presse-papier. Heureusement, homebrew peut facilement résoudre ce problème.

installez vim:

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

installez gui verion de vim:

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

redémarrez le terminal pour prendre effet.


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

maintenant vous pouvez copier la ligne dans vim avec yy et collez-le à l'échelle du système.


1
2018-03-30 18:28



cette question est assez ancienne, mais comme elle a été vue maintes fois, elle semble être populaire - je la mettrai ici pour la postérité. pour le contexte, cette information vient de out-of-the-box, 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 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 dans 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 n'importe quel registre, 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 manière dont x11 traite de la sélection. même dans un vim ordinaire, out-the-box vim (encore, dans vim 7.4 dans linux mint, de toute façon), toute sélection faite 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 du texte sélectionné dans vim dans de nombreuses applications x11, même les interfaces graphiques (par exemple, firefox, thunderbird) et le collage de texte dans la ligne de commande.

voir: help-> x11-selection pour les infos addl.

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.

on admet que cela peut prêter à confusion.


1