Je voudrais coller du texte sur la ligne de commande de Vim. C'est possible?
vim
copy-paste
dan
la source
la source
Réponses:
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 utilisezy
en 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 quec
oud
, 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
àz
pour votre usage personnel (en majusculesA
pourZ
être ajouté aux registres correspondants)._
(agit comme/dev/null
(Unix) ouNUL
(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 viaQ
ou:
, 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 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- 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
0x08
pour revenir en arrière, etc.), vous pouvez utiliser Ctrl- R, Ctrl- O, enregistrer le nom. Voir:help i_CTRL-R
les 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:put
commande, comme de nombreuses commandes Ex, fonctionne uniquement en ligne.cf.
:help :put
Vous auriez aussi pu le faire:
:call setreg('"', @", 'V')
alorsp
. Lasetreg
fonction 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@x
oùx
est le nom du registre dans VimL), et le transforme dans le 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 sontgetreg()
etgetregtype()
.Si vous avez enregistré une macro avec
qa
...q
, alors:echo @a
vous dira ce que vous avez tapé, et@a
rejouera 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
8go
dans 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 étaitdd
en 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'avecp
,P
,: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 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 contiente
mais@:
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 contenantbar
au 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
Q
n'a pas été remappé parmswin.vim
, démarrez le mode Ex avecQ
, enchaînez les «commandes deux-points» qui sont en fait mieux appelées «commandes Ex», et revenez au mode Normal en tapantvisual
.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
foo
avant 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:put
place 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 registrea
, 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 faireuu
pour annuler. Avecp
vous pouvez obtenir la dernière ligne supprimée. Mais vous pouvez réellement également récupérer jusqu'à 9 avec les registres supprime@1
par@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 registrela source
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.
la source
:!rm -rf /<cr>
, cela l'exécuterait. Utilisez plutôt des registres!shift-ins
est plus facile quectrl-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 queshift-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)."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
+enterla source
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.
la source
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
"by
copier dans leb
registre, puis l'exécuter avec@b
.la source
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:
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:
Pour contourner cela, il vous suffit de référencer le contenu de la macro en utilisant
@
:Transmet le contenu du registre sans nom et fonctionne avec mes guillemets doubles et edgecases multilignes.
la source
@
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 quevnoremap
j'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.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
yy
et la coller à l'échelle du système.la source
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-plus
pour 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.
la source
"[a-z]y
: Copier du texte dans le registre [az]Utilisez
:!
pour accéder à la commande d'éditionCtrl+ R: Suivez l'identité du registre pour coller ce que vous copiez.
Il utilisait CentOS 7.
la source
Si vous avez deux valeurs tirées dans deux registres différents (par exemple registre
a
et registreb
), vous pouvez simplement définir une variablec
et effectuer l'opération sur celle-ci.Par exemple,
:set c = str2float(@a) + str2float(@b)
puis vous pouvez coller le contenu dec
n'importe où.Par exemple, en mode INSERT,
CTRL + R
tapez=
pour entrer dans le registre d'expression et tapez simplementc
après le signe égal et appuyez sur ENTREE. Terminé, vous devriez maintenant avoir le total dea
et lesb
registres.Tout cela peut être enregistré dans une macro et répété!
La
str2float
fonction 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.
la source