web-dev-qa-db-fra.com

Comment utiliser les registres vim?

Je ne connais qu'un exemple d'utilisation de registres via CtrlR* grâce à quoi je colle le texte d'un presse-papiers.

Quels sont les autres usages des registres? Comment les utiliser?

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

887
vehomzzz

Les registres dans Vim vous permettent d'exécuter des actions ou des commandes sur le texte qui y est stocké. Pour accéder à un registre, vous tapez "a avant une commande, où a est le nom d'un registre. Si vous voulez copier la ligne en cours dans le registre k, vous pouvez taper

"kyy

Ou vous pouvez ajouter à un registre en utilisant une lettre majuscule

"Kyy

Vous pouvez ensuite parcourir le document et le coller ailleurs à l'aide de

"kp

Pour coller depuis le presse-papiers du système sous Linux

"+ p

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

"* p

Pour accéder à tous les types de registres actuellement définis

: reg

1123
FModa3

J'ai été heureux lorsque j'ai découvert le registre _0_. Si vous supprimez du texte sans l'affecter à un registre particulier, il sera affecté au registre _0_ et sera également enregistré dans le registre par défaut _"_. La différence entre les registres _0_ et _"_ réside dans le fait que _0_ est uniquement renseigné avec du texte transféré, alors que le registre par défaut contient également du texte supprimé à l'aide de d/D/x/X/c/C/s/S commandes.

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:

  • Utilisez le texte que vous voulez copier avec _y[motion]_ - ce texte est enregistré dans les registres _"_ et _0_
  • Supprimer le texte que vous souhaitez remplacer par _d[motion]_ - ce texte est enregistré dans le registre _"_
  • Collez le texte tiré avec _"0p_

où _"_ est la commande pour utiliser un registre pour la commande suivante.

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

Notez que p ou P est copié à partir du registre par défaut. L'équivalent longhand serait _""p_ (ou _""P_) et _"0_ détient le dernier coup, _"1_ détient le dernier effacement ou modification.

Pour plus d'informations, voir :help registers .

743
nelstrom

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

Supposons que vous traitez avec 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

Maintenant, vous décidez que vous devez ajouter un signe de pourcentage à la fin du champ% Dev (à partir de la 2ème ligne). Nous allons créer une macro simple dans le registre m (sélectionné arbitrairement) comme suit:

  1. Appuyez sur: qm: pour démarrer l’enregistrement de macro sous m register.

  2. EE: Aller à la fin de la 3ème colonne.

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

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

  5. <ESC>: Retournez en mode commande.

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

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

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

À ce stade, vous devriez dire: "MAIS ATTENDRE, CE QUE LE HECK FAIT AVEC LES REGISTRES?"

Excellent point. Examinons le contenu du registre m en tapant "mp. Nous obtenons alors ce qui suit:

EEa%<ESC>j0

Au début, on dirait que vous avez accidentellement ouvert un fichier binaire dans le bloc-notes, mais au deuxième regard, c'est la séquence exacte des 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 ! au lieu d'être ennuyeux à l'ancienne %.

EEa!<ESC>j0

Alors plaçons ceci dans le registre n en tapant B"nyE. Ensuite, juste pour le plaisir, exécutons la macro n sur une ligne de nos données en utilisant @n....

OMG, IL A AJOUTÉ UN !

Exécuter une macro revient à appuyer sur la séquence exacte de clés dans le registre de cette macro. Si ce n'est pas un tour de registre cool, je mangerai mon chapeau.

315
Francisco

Autres registres utiles:

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

"/ - dernière commande de recherche

": - dernière commande.

Notez qu'avec les macros vim, vous pouvez les éditer, car elles ne sont qu'une liste des séquences de touches utilisées lors de l'enregistrement de la macro. Ainsi, vous pouvez écrire la macro dans un fichier texte (en utilisant "ap pour écrire la macro a), les éditer et les charger dans un registre avec "ay$. Belle façon de stocker des macros utiles.

96
Anthony Roy

Le registre de trou noir_ est le /dev/null des registres.

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

noremap x "_x

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

vnoremap p "_dP
72
mrucci

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

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

Si vous voulez seulement coller un seul mot en mode ex, vous pouvez vous assurer que le curseur est dessus avant de passer en mode ex, puis appuyez sur <C-r><C-w> en mode ex pour coller le mot.

51
agscala

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

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

Vous pouvez l’utiliser conjointement avec votre système comme ci-dessus ou obtenir des réponses à partir de fonctions VimL personnalisées, etc.

ou juste des trucs ad hoc comme

<c-r>=35+7<cr>
42
michael

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

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

37
naught101

Sur 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...>
18
Brian
  • q5 enregistre les éditions dans le registre 5 (q suivant arrête l'enregistrement)
  • : reg affiche tous les registres et leur contenu
  • @ 5 exécuter le registre 5 macro (éditions enregistrées)
16
fpmurphy

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

  1. yank texte
  2. :!grep "<CTRL-R>0"<CR>
14
Matt Mendell

tiliser les registres dans les commandes avec @. Par exemple.:

echo @a
echo @0
echo @+

Définissez-les en commande:

let @a = 'abc'

Maintenant, "ap va coller abc.

Le registre par défaut " constitue une source importante de confusion. Il est important de savoir comment cela fonctionne. Il est bien préférable d’éviter le registre par défaut. 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.

Donc, le registre par défaut est en réalité un pointeur sur le dernier registre utilisé. Lorsque vous supprimez ou tirez quelque chose, ce registre va pointer vers d'autres registres. Vous pouvez tester cela en vérifiant les registres. Il existe toujours un autre registre identique au registre par défaut: le registre yank ("0), le premier registre de suppression ("1), le petit registre de suppression ("-) ou autre registre utilisé pour supprimer ou tirer.

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, il vaut mieux utiliser directement: "0, "- et "1-"9 registres par défaut ou nommés.

8
Catalin Ciurea

Un registre oublié est le '.' registre de points qui contient le dernier texte inséré, peu importe la manière 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>./
7
zzapper

Mon registre préféré est le registre ':'. Exécuter @: en mode normal me permet de répéter la commande ex courue précédemment.

4
siu

Mon ami Brian a écrit un article complet à ce sujet. Je pense que c'est une excellente introduction à l'utilisation des sujets. https://www.brianstorti.com/vim-registers/

1
Madis Nõmme