L'une des choses qui me manquent dans vim est de pouvoir taper une commande de substitution qui fonctionnera sur plusieurs lignes, par exemple:
:/begin/,/end/s/foo/bar/g
La commande ci-dessus remplace "foo" par "bar" commençant par la première ligne contenant "begin" et se terminant par la ligne suivante après celle contenant "end".
Existe-t-il un moyen de faire quelque chose de similaire dans emacs?
regular-expressions
replace
evil
vim-emulation
Larry Coleman
la source
la source
Voici une façon de le faire qui utilise uniquement des fonctionnalités intégrées:
Avec le point dans la ligne qui contient la première occurrence de
begin
, appuyez sur C-SPC.Passer à l'occurrence suivante de
end
:C-s
end
RETRemplacez
foo
parbar
:M-%
foo
RETbar
RET !Cela utilise le fait que
query-replace
cela fonctionnera sur la région active au lieu du tampon entier s'il y en a un.Bien sûr, vous pouvez également définir une commande personnalisée:
Cette commande recherchera toujours depuis le début du tampon, donc le point peut être après
begin
/foo
/end
lorsque vous l'invoquez.Configurez-lui une liaison de clé via:
la source
En général, c'est quelque chose que vous utiliseriez
narrow-to-region
.Vous déplacez le curseur (par exemple, en recherchant) au début de la région et appuyez sur
C-SPC
, puis vous déplacez à la fin de la région et tapezM-x narrow-to-region
. Vous pouvez maintenant lancer toutes les commandes de recherche et de remplacement que vous souhaitez et elles ne s'appliqueront qu'à une partie restreinte du tampon. Une fois que vous avez terminé, tapezM-x widen
pour restaurer le contenu du tampon.la source
begin
/end
sont des délimiteurs dans un langage de programmation, vous pouvez probablement utiliserC-M-Space
pour exécutermark-sexp
pour sélectionner la région dans une seule commande.C-x n n
(narrow-to-region
) etC-x n w
(widen
).