Existe-t-il un raccourci pour réutiliser le terme de recherche de la recherche et du remplacement?

8

Je pense qu'il y a une possibilité distincte que cette question a déjà été posée, mais je ne la trouve pas.

Si je fais quelque chose comme :s/foo/bar/get que je veux rappeler à la ligne suivante, mais avec bazau lieu de bar, y a-t-il un moyen plus rapide de le faire? Je pense que ça &bazdevrait marcher, mais ça ne marche pas.

Eli Sadoff
la source

Réponses:

11

Pas exactement ce que vous demandez, mais vous pouvez le faire:

:s/foo/bar/g

Et alors:

:s//baz/g

Vous pouvez l'utiliser car lorsque vous utilisez :sle modèle recherché est enregistré dans le registre de recherche. Que vous pouvez voir avec :reg /.


Travail en cours: vous pouvez accélérer votre flux de travail avec:

nnoremap && :s<UP><C-F>F/cT/

Et utilisez-le comme ceci:

:s/foo/bar/g

et alors

&&baz<CR>

Décomposition:

nnoremap &&         " define a new mapping
:s<UP>              " get the last :s command in the history
<C-F>               " use this command in the cmdline window
F/                  " go back to the last /
cT/                 " change back up to the last /

Quelques notes:

  • Cela ne fonctionnera pas si vous n'avez pas de drapeau
  • Cela ne fonctionnera pas si vous n'avez pas de chaîne de substitution
  • Cela devrait fonctionner autrement

(faites-moi savoir si je peux l'améliorer).

Quelques lectures:

  • :h cmdline-window
  • :h c_CTRL-F
nobe4
la source
2
C'est certainement mieux que ce que je faisais avant. Je
suppose
Pas AFAIK, et j'essaie de créer un mappage qui fait ce que vous voulez, mais hors de la boîte, je suis presque sûr que vous êtes limité à taper à nouveau l'expression de substitution
nobe4
5

En plus de la réponse de @ nobe4, Damian Conway a deux mappages assez intéressants pour accélérer les actions de recherche et de remplacement. Ils viennent de cette façon dont je vim interview qui vaut vraiment la peine d'être lu complètement.

Pour le citer:

[...] J'ai trouvé que je faisais pour toujours des recherches et remplacements globaux (ie :%s/X/Y/g<CR>), j'ai donc éliminé la frappe répétitive en volant la commande jamais utilisée (par moi) S:

nmap  S  :%s//g<LEFT><LEFT>

Maintenant, je dois juste taper: SX / Y

Mais ensuite, j'ai commencé à remarquer la fréquence à laquelle j'ai fait une recherche / / pour un motif et, après avoir parcouru les correspondances, j'ai ensuite voulu les remplacer globalement. Même avec le mappage S qui était une répétition plus ennuyeuse: faites d'abord la recherche: / motif puis faites le remplacement: Spattern / remplacement J'ai donc volé la commande M (également jamais utilisée par moi) pour cela:

nmap <expr>  M  ':%s/' . @/ . '//g<LEFT><LEFT>'

Maintenant c'est juste: faites la recherche: / pattern puis remplacez toutes les correspondances: Mreplacement


Pour répondre à votre question, je suppose que vous pouvez légèrement modifier le premier mappage pour quelque chose comme ceci:

nmap  S  :s///g<LEFT><LEFT>

De cette façon, vous pouvez d'abord effectuer votre substitution :s/foo/bar/g, passer à la ligne suivante, appuyer Set vous obtiendrez: :s//|/g|est le curseur, vous pouvez maintenant taper votre nouvelle substitution.

statox
la source