Comment utiliser les registres vim?

926

Je ne connais qu'une seule instance utilisant des registres via CtrlR*laquelle je colle du texte à partir d'un presse-papiers.

Quelles sont les autres utilisations des registres? Comment les utiliser?

Tout ce que vous savez sur les registres VI (concentrons-nous sur vi 7.2) - partagez avec nous.

vehomzzz
la source
22
J'ai donné une longue réponse là - bas sur l'utilisation des registres
Benoit

Réponses:

1186

Les registres dans Vim vous permettent d'exécuter des actions ou des commandes sur le texte qu'ils contiennent. Pour accéder à un registre, vous tapez "aavant une commande, où aest le nom d'un registre. Si vous souhaitez copier la ligne actuelle dans le registre k, vous pouvez taper

"kyy

Ou vous pouvez ajouter à un registre en utilisant une majuscule

"Kyy

Vous pouvez ensuite parcourir le document et le coller ailleurs en utilisant

"kp

Pour coller à partir du presse-papiers du système sous Linux

"+p

Pour coller depuis le presse-papiers du système sous Windows (ou depuis le presse-papiers "surbrillance de la souris" sous Linux)

"*p

Pour accéder à tous les registres actuellement définis, tapez

:reg
FModa3
la source
165
Et "+est un registre spécial qui fait référence au presse-papiers du système.
Aaron McDaid
17
Sous Windows, le Presse-papiers est accessible avec "*; donc la commande de copier jusqu'à la fin du fichier devient "*yG.
Aditya MP
44
Dans X (Linux, peut-être aussi OS-X), se *trouve le presse-papiers "surbrillance de la souris" et +le presse-papiers Ctrl-XCV.
dotancohen
20
Existe-t-il un moyen d'ajouter au registre du presse-papiers (car il n'y a pas de capital +)?
naitsirhc
8
@dotancohen Techniquement, cela s'appelle la sélection PRIMAIRE, mais je suppose que "la lumière des souris" est plus facile à obtenir pour les gens :)
kyrias
783

J'étais content quand j'ai découvert le 0registre. Si vous tirez du texte sans l'affecter à un registre particulier, il sera affecté au 0registre et enregistré dans le "registre par défaut . La différence entre les registres 0et "est qu'ils 0ne sont remplis qu'avec du texte copié, tandis que le registre par défaut est également rempli avec du texte supprimé à l'aide des commandes d/ D/ x/ X/ c/ C/ s/ S.

Je trouve cela utile lorsque je veux copier du texte, supprimer quelque chose et le remplacer par le texte copié. Les étapes suivantes illustrent un exemple:

  • Copiez le texte avec lequel vous souhaitez copier y[motion]- ce texte est enregistré "et 0enregistré
  • Supprimez le texte que vous souhaitez remplacer d[motion]- ce texte est enregistré dans le "registre
  • Collez le texte retiré avec "0p

"est la commande pour utiliser un registre pour la commande suivante.

À la dernière étape, si vous deviez coller à partir du registre par défaut (avec p), il utiliserait le texte que vous veniez de supprimer (probablement pas ce que vous vouliez).

Notez que pou Pcolle du registre par défaut. L'équivalent à long terme serait ""p(ou ""P) et "0contient le dernier coup sec, "1contient la dernière suppression ou modification.

Pour plus d'informations, voir :help registers.

nelstrom
la source
17
pou des Ppâtes du registre par défaut. L'équivalent à la main serait ""p(ou ""P).
nelstrom
186
Soit dit en passant, de la même manière «0 détient le dernier coup sec», 1 détient le dernier effacement ou modification.
FireAphis
6
"est la commande pour utiliser un registre pour la commande suivante. Donc , ""putiliserait le "registre pour la commande coller et "0putiliserait le 0registre.
Ramon Marco L. Navarro
5
0psignifierait aller au premier caractère de la ligne courante et coller à partir du contenu du registre par défaut ( "). "pserait une commande incomplète car vous devez spécifier pour quelle commande utiliser le registre p.
Ramon Marco L. Navarro
15
De la même manière "1 détient la dernière suppression", 2 détient l'avant-dernière suppression, "3 détient l'avant-dernier, etc. jusqu'à" 9
James
331

Une de mes parties préférées sur les registres est de les utiliser comme macros!

Supposons que vous traitez un fichier de valeurs délimité par des tabulations en tant que tel:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Vous décidez maintenant que vous devez ajouter un signe de pourcentage à la fin du champ% Dev (à partir de la 2e ligne). Nous allons créer une macro simple dans le mregistre (sélectionné arbitrairement) comme suit:

  1. Appuyez sur:: qmpour démarrer l'enregistrement de la macro sous le mregistre.

  2. EE: Allez à la fin de la 3e colonne.

  3. a: Mode d'insertion à ajouter à la fin de cette colonne.

  4. %: Saisissez le signe de pourcentage que nous voulons ajouter.

  5. <ESC>: Revenez en mode commande.

  6. j0: Aller au début de la ligne suivante.

  7. q: Arrêter l'enregistrement de la macro

Nous pouvons maintenant simplement taper @mpour exécuter cette macro sur la ligne actuelle. De plus, nous pouvons taper @@pour répéter, ou 100@mpour le faire 100 fois! La vie semble plutôt belle.

À ce stade, vous devriez dire: " MAIS ATTENDRE, QU'EST-CE QUE LE HECK DOIT FAIRE AVEC LES REGISTRES ?"

Excellent point. Examinons ce qu'il y a dans le contenu du mregistre en tapant "mp. Nous obtenons ensuite les éléments suivants:

EEa%<ESC>j0

Au début, cela ressemble à vous avez accidentellement ouvert un fichier binaire dans le bloc-notes, mais au deuxième coup d'œil, c'est la séquence exacte de caractères dans notre macro!

Vous êtes une personne curieuse, alors faisons quelque chose d'intéressant et modifions cette ligne de texte pour insérer un !ancien au lieu d'être ennuyeux %.

EEa!<ESC>j0

Ensuite, tirons ceci dans le nregistre en tapant B"nyE. Ensuite, juste pour les coups de pied, exécutons la nmacro sur une ligne de nos données en utilisant @n....

OMG, IL A AJOUTÉ UN !

Essentiellement, exécuter une macro revient à appuyer sur la séquence exacte de touches dans le registre de cette macro. Si ce n'est pas un truc de registre sympa, je vais manger mon chapeau.

Francisco
la source
65
C'est tout à fait essentiel. Je n'ai pas remarqué jusqu'à présent que les registres sont les mêmes que les tampons de macro. Cela signifie que vous pouvez simplement stocker toutes vos macros dans du texte, les extraire et les exécuter. Assez cool et un peu bizarre. Très Vim.
naught101
1
C'est une petite note éditoriale, mais cette majuscule avec du gras ... Cela aurait pu être corrigé. C'est assez désagréable pour le moment.
ashrasmun
1
Vous pouvez utiliser +au lieu de j0pour passer au premier caractère non vide sur la ligne suivante.
Gokul
100

Autres registres utiles:

"*ou "+- le contenu du presse-papiers du système

"/ - dernière commande de recherche

": - dernière commande.

Remarque avec les macros vim, vous pouvez les modifier, car elles ne sont qu'une liste des frappes utilisées lors de l'enregistrement de la macro. Vous pouvez donc écrire dans un fichier texte la macro (en utilisant "appour écrire la macro a ) et les modifier, et les charger dans un registre avec "ay$. Belle façon de stocker des macros utiles.

Anthony Roy
la source
6
Vim par défaut sur OSX n'inclut pas l'intégration "*. Vous pouvez installer une version de homebrew-alt qui le fait. Vérifiez avec vim --version- -clipboardsignifie que vous ne l'avez pas, +clipboardsignifie que vous le faites.
Xavier Shay
15
Dans X11, "*et "+sont encore plus cool: "+colle le dernier texte copié avec ctrl+c(tampon de copie), ou quel raccourci que vous utilisez (ou right-click>copy). "*colle le dernier texte surligné à la souris (tampon de sélection). Donc, si vous copiez quelque chose avec ctrl+c, puis mettez en surbrillance autre chose avec la souris, vous pouvez choisir lequel coller. Cela ne fonctionne pas sous Windows, où ces deux registres sont synonymes.
naught101
1
Que Dieu vous bénisse, je l' ai cherché "*et "+depuis des années! Je pensais que seul Gvim avait accès aux presse-papiers du système, mais apparemment, Vim le fait aussi!
Tarrasch
@Tarrasch Si vous utilisez la console vim au lieu de gvim, vous découvrirez beaucoup plus de choses. Je pense. visitez aussi #vim sur freenode!
trusktr
1
Comment activer si l' on a -xterm_clipboardsur vim --version. Un package simple à installer? (debian / apt-get). Merci.
Dr Beco du
77

Le registre du trou noir _ est celui /dev/nulldes registres.

Je l'utilise dans mon vimrc pour permettre la suppression de caractères uniques sans mettre à jour le registre par défaut:

noremap x "_x

et pour coller en mode visuel sans mettre à jour le registre par défaut:

vnoremap p "_dP
mrucci
la source
La deuxième cartographie est également très utile. Voir ici pour une explication: marcorucci.com/blog/#visualModePaste
mrucci
21
le mappage de xdevient moins pratique pour transposer les caractères.
skeept
Appuyer sur x n'efface pas la dernière chose que vous avez tirée, que vous trouverez dans le registre 0. Appuyez plusieurs fois sur xa, puis sur "0p pour coller les choses que vous avez tirées.
trusktr
2
Pour développer la remarque de skeept ci-dessus: avec ce xmappage, vous ne pouvez plus faire la xp"commande" pour commuter le courant avec le caractère suivant. Très utile pour les corrections de faute de frappe. Nous devons également Xpcommuter le courant avec le caractère précédent.
Daniel Andersson
56

Si jamais vous souhaitez coller le contenu du registre dans une commande ex-mode, appuyez sur <C-r><registerletter>.

Pourquoi utiliseriez-vous cela? Je voulais faire une recherche et remplacer une chaîne assez longue, alors je l'ai sélectionnée en mode visuel, j'ai commencé à taper l'expression de recherche / remplacement :%s/[PASTE YANKED PHRASE]//get j'ai continué ma journée.

Si vous ne souhaitez coller qu'un seul mot en mode ex, assurez-vous que le curseur est dessus avant de passer en mode ex, puis appuyez <C-r><C-w>en mode ex pour coller le mot.

agscala
la source
6
Coller du texte dans la :ligne de commande est la meilleure chose que j'ai apprise aujourd'hui
Shahbaz
1
Vous pouvez également utiliser <CR> <registerletter> en mode insertion
Floegipoky
1
J'aime d'abord écrire des expressions rationnelles de recherche / remplacement par juste /[write out your regex]<cr>, puis remplacer juste s/<C-R>//replacement/. De cette façon, vous bénéficiez de commentaires en direct sur votre expression régulière avant d'exécuter le remplacement.
GabeIsman
44

Je pense que le registre du gourou secret est l'expression = registre. Il peut être utilisé pour des mappages créatifs.

:inoremap  \d The current date <c-r>=system("date")<cr>

Vous pouvez l'utiliser en conjonction avec votre système comme ci-dessus ou obtenir des réponses de fonctions VimL personnalisées, etc.

ou juste des trucs ad hoc comme

<c-r>=35+7<cr>
michael
la source
3
Consultez la [vidéo sur l'utilisation du registre d'expression] de Derek Wyatt ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim
1
Le lien de @JeromyAnglim est maintenant ici: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus
39

Une astuce sympa est d'utiliser "1p coller la dernière suppression / modification (, puis .à répéter pour coller les suppressions suivantes. En d'autres termes, "1p...est fondamentalement équivalent à "1p"2p"3p"4p.

Vous pouvez l'utiliser pour inverser l'ordre d'une poignée de lignes: dddddddddd"1p....

rien101
la source
aha c'est fantastique. Ce que je veux vraiment, c'est le même comportement pour les yanks
RyanM
18

Depuis la page d'aide de vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>
Brian
la source
17
  • q5 enregistre les modifications dans le registre 5 (le q suivant arrête l'enregistrement)
  • : reg affiche tous les registres et leur contenu
  • @ 5 exécuter la macro du registre 5 (modifications enregistrées)
fpmurphy
la source
15
Je n'aime pas la touche @ pour lancer les macros (trois frappes). J'ai donc mappé F2 pour lancer la macro stockée dans le registre q: nmap <F2> @q J'utilise le registre q, car pour enregistrer une macro pour F2 à lire, je viens de frapper qq. enregistrement et relecture rapides des macros.
Andrej Panjkov
16

J'utilise le registre par défaut pour chercher du texte dans ma fenêtre vim sans avoir à toucher la souris.

  1. texte de tirage
  2. :!grep "<CTRL-R>0"<CR>
Matt Mendell
la source
12

Utilisez des registres dans les commandes avec @. Par exemple:

echo @a
echo @0
echo @+

Définissez-les dans la commande:

let @a = 'abc'

Maintenant "apva coller abc.

Ciro Santilli
la source
8

Une grande source de confusion est le registre par défaut ". Il est important de savoir comment cela fonctionne. Il est préférable que le registre par défaut soit évité la plupart du temps. L'explication de la documentation Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Ainsi, le registre par défaut est en fait un pointeur vers le dernier registre utilisé. Lorsque vous supprimez ou tirez quelque chose, ce registre va pointer vers d'autres registres. Vous pouvez le tester en vérifiant les registres. Il existe toujours un autre registre qui est exactement le même que le registre par défaut: le registre yank ( "0), le premier registre de suppression ( "1), le petit registre de suppression ("- ) ou tout autre registre qui a été utilisé pour supprimer ou yank.

La seule exception est le registre des trous noirs. Vim doc dit:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

En général , vous êtes beaucoup mieux en utilisant directement: "0, "-et "1-"9registres par défaut ou les registres nommés.

Catalin Ciurea
la source
8

Un registre négligé est le '.' registre de points qui contient le dernier texte inséré, quelle que soit la façon dont il a été inséré, par exemple ct] (changer jusqu'à]). Ensuite, vous réalisez que vous devez l'insérer ailleurs mais que vous ne pouvez pas utiliser la méthode de répétition de points.

 :reg .
 :%s/fred/<C-R>./
zzapper
la source
7

Mon registre préféré est le ':'registre. L'exécution @:en mode normal me permet de répéter la commande ex précédemment exécutée.

siu
la source