Existe-t-il un équivalent aux commandes de substitution de style sed de vim?

14

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?

Larry Coleman
la source

Réponses:

7

evilfournit une version allégée de ex, il est donc probablement préférable de présumer que ce n'est pas un drop-in exact. Cependant, l'exemple que vous avez fourni fonctionne dès le départ, à condition que ce point soit antérieur à la première ligne (c'est-à-dire la beginligne dans votre exemple).

Dan
la source
Dans vim, la recherche commencerait également au point, ce qui ressemble à ce que je cherchais. Merci!
Larry Coleman
8

Voici une façon de le faire qui utilise uniquement des fonctionnalités intégrées:

  1. Avec le point dans la ligne qui contient la première occurrence de begin, appuyez sur C-SPC.

  2. Passer à l'occurrence suivante de end:

    C-s end RET

  3. Remplacez foopar bar:

    M-% foo RET bar RET !

Cela utilise le fait que query-replacecela 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:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

Cette commande recherchera toujours depuis le début du tampon, donc le point peut être après begin/ foo/ endlorsque vous l'invoquez.

Configurez-lui une liaison de clé via:

(global-set-key (kbd "C-c r") 'replace-from-to)
itsjeyd
la source
5

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 tapez M-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é, tapez M-x widenpour restaurer le contenu du tampon.

Elias Mårtenson
la source
4
Si begin/ endsont des délimiteurs dans un langage de programmation, vous pouvez probablement utiliser C-M-Spacepour exécuter mark-sexppour sélectionner la région dans une seule commande.
organisé
1
Liaisons par défaut: C-x n n( narrow-to-region) et C-x n w( widen).
itsjeyd