Effectuer certaines opérations sans effacer le registre

30

Souvent, dans les fichiers de configuration, je peux copier et coller un bloc de lignes, puis je souhaite apporter de petites modifications à ce bloc. Après avoir collé, j'utilise xpour supprimer les caractères que je veux supprimer, puis je continue pour coller le bloc suivant. Sauf xmet les caractères supprimés dans le presse-papiers, donc je dois recopier le bloc de lignes à nouveau.

Existe-t-il un moyen de le faire sans passer en mode insertion?

durron597
la source
Jasper a trouvé des questions similaires sur Stack Overflow : [Est-il possible de supprimer dans vim sans écraser votre dernier coup sec? [duplicate]] ( stackoverflow.com/questions/3638542/… ) et In vim existe-t-il un moyen de supprimer sans mettre de texte dans le registre?
Gilles 'SO- arrête d'être méchant'

Réponses:

35

Vos options sont:

  1. Utilisez le registre des trous noirs _. Par exemple, pour supprimer une ligne que vous tapez "_dd. Cela supprime sans affecter le presse-papiers.
  2. Nommez explicitement un registre pour le tirage d'origine. Par exemple, pour extraire une ligne dans un registre nommé, vous taperiez "ayypuis pour coller vous taperez"ap
  3. Utilisez les registres de tirage pour récupérer le tirage d'origine à la place. Vous pouvez tirer, puis supprimer si nécessaire, puis lorsque vous allez coller le type"0p
  4. Utilisez un plugin tel que vim-easyclip pour fournir un opérateur de coupe distinct de l'opérateur de suppression (divulgation complète: je l'ai écrit)

Courez :help registerspour plus de détails sur les 3 premiers

Steve Vermeulen
la source
4
Alors pour xque j'utilise "_xalors?
durron597
1
C'est correct.
Steve Vermeulen
2
@ durron597 si vous supprimez un caractère à la fois avec x, vous devriez probablement apprendre à déplacer les suppressions comme celles dt)qui sont supprimées jusqu'à la parenthèse d2Wfermante suivante qui supprime les deux jetons séparés par des espaces. Ensuite, vous pourriez faire quelque chose comme à l' "_di{intérieur d'une région contreventée, ce que je fais tout le temps. En mode normal, cela signifie « supprimer tout ce qui se trouve à l' intérieur de cette région contreventée dans le trou noir »
OregonTrail
Ajouté nnoremap x "_xà mon ~/.vimrc(explication ici: stackoverflow.com/questions/54255/… ).
Victoria Stuart
11

xne met pas les choses dans le presse-papiers, il les met dans un registre . Si vous ne lui dites pas dans quel registre le mettre, il le place dans le registre sans nom, qui écrase bien sûr le contenu précédent. Donc, au lieu de cela, dites-lui quel registre utiliser " REGISTER x:, où REGISTRE est une lettre unique. Vous utilisez ensuite le même préfixe de registre de cotation ppour coller à partir de ce registre. (Remarque: les minuscules remplacent leur contenu; les majuscules s'ajoutent).

Il existe également deux registres spéciaux "0et "1. "0est le ytexte le plus récemment extrait ( ), qui restera même si vous supprimez du texte avec une autre commande (comme x). "1est le texte le plus récemment supprimé, tant que ce texte n'est pas petit (une ligne). Le petit texte supprimé entre "-.

Enfin, comme le souligne Steve Vermeulen, vous pouvez dire à vim de ne pas enregistrer le texte supprimé en spécifiant le registre des trous noirs "_.

La commande d'aide appropriée est :help registers.

derobert
la source
3

La :letcommande vous permettra de redéfinir un registre nommé. Dans la ligne de commande de vim, en appuyant deux fois sur Control+ 1 puis sur le nom du registre, le contenu du registre sera collé dans la commande. Ensuite, vous pouvez ensuite modifier ce qu'il a collé et enregistrer le registre avec vos modifications.R

Exemple:

  • En mode normal, sur une ligne contenant le texte "Foo Bar", taper "fyyla ligne entière ( yy) dans le fregistre ( "f).
  • Tapez :let @f=', et Control+ r, Control+ à rnouveau, puis f, et vous devriez le voir coller dans "Foo Bar", donc votre ligne de commande lit maintenant :let @f='Foo Bar, avec le curseur à la toute fin.
  • Vous pouvez maintenant utiliser les flèches et les touches de suppression pour modifier ce que vous venez de coller, comme :let @f='foo bar baz.
  • Terminez la citation: :let @f='foo bar baz'et appuyez sur Enter.

Vous avez maintenant redéfini le contenu du fregistre pour qu'il soit "foo bar baz".

(Cela fonctionne également pour les macros! :help letPour plus d'informations.)


1 Control + rvous permet d'insérer un registre lorsque vous êtes déjà en mode insertion, comme si vous tapiez les caractères. L'utilisation de cette séquence deux fois est importante car "le texte est inséré littéralement, pas comme s'il était tapé. Cela diffère lorsque le registre contient des caractères comme <BS>". - le fichier insert.txt vimdoc,:help i_CTRL-R_CTRL-R

alxndr
la source
0

"_Concernant le registre des trous noirs mentionné par @derobert, vous pouvez trouver un screencast utile dans http://vimcasts.org/episodes/meet-the-yank-register/

Vim utilise les termes supprimer, extraire et mettre à la place de la terminologie plus standard couper, copier et coller. En commençant par la même lettre, le copier-coller est facilement interchangeable. Une fois que vous vous êtes habitué au mot yank, il devient synonyme de copie. Mais l'utilisation par Vim du mot «supprimer» est problématique. Dans la plupart des contextes, le mot supprimer signifie simplement supprimer. Mais l'opération de suppression de Vim copie le texte dans un registre, puis le supprime du document. En d'autres termes, l'opération de suppression de Vim se comporte comme une coupure.

Marlon León
la source
2
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son article - vous pouvez toujours commenter vos propres articles, et une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel article .
jamessan
J'ai essayé de commenter le message d'origine mais je n'ai pas pu. La seule alternative que j'avais était celle que j'avais choisie @jamessan
Marlon León
0

Plugin ReplaceWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Il suggère la cartographie gr.

  1. coup sec
  2. sélectionnez visuellement le texte que vous souhaitez remplacer et appuyez sur gr
  3. passer au bloc suivant que vous souhaitez remplacer

Sinon, utilisez gr<text object>pour le faire sans sélection visuelle. La répétition par points est prise en charge lorsque les plugins repeat.vimde Tim Pope et visualrepeat.vimd'Ingo Karkat sont installés.

Hotschke
la source