Je voudrais coller du texte arraché dans la ligne de commande de Vim. Est-ce possible ?
Oui. Appuyez sur Ctrl-R puis ". Si vous avez des caractères de contrôle littéraux dans ce que vous avez arraché, 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 plus vous en passer. Les registres sont essentiellement des emplacements de stockage pour les chaînes de caractères. Vim possède de nombreux registres qui fonctionnent de différentes manières :
0
(registre de branchement : lorsque vous utilisez y
en mode normal, sans spécifier de registre, le texte branché va là et aussi dans le registre par défaut),1
à 9
(déplacement des registres de suppression, lorsque vous utilisez des commandes telles que c
ou d
, ce qui a été supprimé va dans le registre 1, ce qui était dans le registre 1 va dans le registre 2, etc.),"
(registre par défaut, également connu sous le nom de registre sans nom. C'est là que les " interviennent Ctrl-R, "),a
à z
pour votre propre usage (les A
à Z
en majuscules sont à ajouter 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 de suppression),/
(registre de modèle de recherche, mis à jour lorsque vous recherchez du texte avec /
, ?
, *
ou #
par exemple ; vous pouvez également y écrire pour changer dynamiquement le modèle de recherche),:
(stocke la dernière commande VimL tapée via Q
ou :
, en lecture seule),+
et *
(registres du presse-papiers du système, vous pouvez y écrire pour définir le presse-papiers et y lire le contenu du 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 l'insérer littéralement (pas d'auto-indentation, pas de conversion des caractères de contrôle comme 0x08
en espacement arrière, etc), vous pouvez utiliser Ctrl-R, Ctrl-O, nom de registre.
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é de nombreuses utilisations des registres)."
est une commande en mode Normal qui vous permet de sélectionner le registre qui sera utilisé lors de la prochaine opération d'arrachage, de suppression ou de collage. Donc ": sélectionne le registre deux-points (stockage de la dernière commande). Puis p est une commande que vous connaissez déjà, elle colle le contenu du registre.
cf. :help "
, :help quote_:
.vimrc
) et vous souhaitez exécuter quelques lignes consécutives en ce moment même : yj :@"Enter.:@
joue les commandes Ex stockées dans le registre donné en argument, et "
est la façon dont vous vous référez au registre sans nom. Voir aussi le début de cette réponse, qui est liée.
Ne confondez pas le "
utilisé ici (qui est un nom de registre) avec le "
de l'exemple précédent, qui était une commande en mode Normal.
Voir :help :@
et :help quote_quote
.:help quote_/
, help i_CTRL-R
Corollaire : Conservez votre modèle de recherche mais ajoutez une alternative : /
Ctrl-R, / |alternative
.y
, ils sont dans le registre sans nom. Vous voulez maintenant ouvrir une nouvelle ligne juste en dessous de là où vous êtes, avec ces deux mots : :pu
. C'est un raccourci pour :put "
. La commande :put
, comme beaucoup de commandes Ex, ne fonctionne que dans le sens de la ligne.
cf. :help :put
Vous auriez pu aussi faire : :call setreg('"' ;, @" ;, 'V' ;)
alors p
. La fonction setreg
définit le registre dont le nom est donné en premier argument (sous forme de chaîne de caractères), l'initialise avec le contenu du deuxième argument (vous pouvez utiliser les registres comme des 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 le sens de la ligne, rien pour le sens du caractère et ^V
littéral pour le sens du bloc.
cf. :help setreg()
. Les fonctions inverses sont getreg()
et getregtype()
.qa
...q
, alors :echo @a
vous dira ce que vous avez tapé, et @a
rejouera la macro (vous la connaissiez probablement, 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, alors @+
jouera le contenu du presse-papiers comme une macro, et ira donc 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, alors @.
va (parce que le registre .
contient la dernière chaîne insérée) supprimer une ligne. (La documentation de Vim est erronée à ce sujet, puisqu'elle indique que les registres #
, %
, :
et .
ne fonctionnent qu'avec p
, P
, :put
et Ctrl-R).
cf. :help @
Ne confondez pas :@
(commande qui joue les commandes Vim depuis un registre) et @
(commande en mode normal qui joue les commandes en mode normal depuis un registre).
L'exception notable est @:
. Le registre de commande ne contient pas les deux-points initiaux ni 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 la lire en mode normal. Ainsi, si votre dernière commande était :e
, le registre contient e
mais @:
rechargera le fichier, sans aller à la fin du mot.
cf. :help @:
@='dd'
Enter. Dès que vous appuyez sur la touche =
, Vim passe à l'évaluation de l'expression : 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 à usage unique. Chaque fois que vous l'utiliserez, vous devrez entrer une nouvelle expression.
cf. :help quote_=
Corollaire : Si vous êtes en train d’éditer 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 la ligne de commande, mais elle a inséré le contenu de la 58ème ligne.:let @/ = 'foo'
cf. :help :let
Notez qu'en faisant cela, vous n'avez pas besoin d'échapper /
dans le motif. Cependant, vous devez bien sûr doubler tous les guillemets simples.foo
, et ensuite toutes les lignes contenant bar
dans le presse-papiers, enchaînez ces commandes : qaq
(réinitialise le registre a en y stockant une macro vide), :g/^foo/y A
, :g/bar/y A
, :let @+ = @a
.
L'utilisation d'un nom de registre en majuscule fait fonctionner le registre en mode append.
Mieux, si Q
n'a pas été remappé par mswin.vim
, lancez le mode Ex avec Q
, enchaînez ces "commandes colon" qui sont en fait mieux appelées "commandes Ex", et revenez au mode Normal en tapant visual
.
cf. :help :g
, :help :y
, :help Q
.:g/^/put _
. Cela met le contenu du registre du trou noir (vide en lecture, mais accessible en écriture, se comportant comme /dev/null
) en ligne, après chaque ligne (car chaque ligne a un début !).foo
avant chaque ligne : :g/^/-put ='foo'
. C'est une utilisation astucieuse du registre d'expression. Ici, -
est un synonyme de .-1
(cf. :help :range
). Puisque :put
met le texte après la ligne, vous devez lui dire explicitement d'agir sur la ligne précédente.:%y+
.
cf. :help :range
(pour la partie %
) et :help :y
.: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.dddd
, vous pouvez faire uu
pour annuler. Avec p
, vous pourriez récupérer la dernière ligne supprimée. Mais en fait, vous pouvez aussi récupérer jusqu'à 9 suppressions avec les registres @1
à @9
.
Encore mieux, si vous faites "1P
, alors .
en mode Normal fera "2P
, et ainsi de suite.
cf. :help .
et :help quote_number
=strftime('%y%m%d' ;)
Enter.
cf. :help strftime()
Encore une fois, ce qui peut prêter à confusion ::@
est une commande en ligne qui interprète le contenu d'un registre comme du vimscript et le met en source.@
est une commande en mode normal qui interprète le contenu d'un registre comme des frappes de touches en mode normal (sauf lorsque vous utilisez le registre :
, 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, paste, delete, correct, 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.Pour coller quelque chose qui se trouve dans le presse-papiers du système, vous pouvez simplement utiliser SHIFT - INS.
Cela fonctionne sous Windows, mais je suppose que cela fonctionne bien sous Linux également.
Pour coller quelque chose du presse-papiers du système dans la ligne de commande vim ("command mode" ;), utilisez Ctrl+R suivi de +. Pour moi, au moins sur Ubuntu, Shift+Ins ne fonctionne pas.
PS : Je ne sais pas pourquoi Ctrl+R suivi de *, qui est théoriquement le même que Ctrl+R suivi de + ne semble pas toujours fonctionner. J'ai cherché et découvert la version + et elle semble toujours fonctionner, du moins sur ma boîte.