Esiste un equivalente ai comandi di sostituzione in stile sed di Vim?


14

Una delle cose che mi manca di vim è la possibilità di digitare un comando di sostituzione che funzionerà su più righe, ad esempio:

:/begin/,/end/s/foo/bar/g

Il comando precedente sostituisce "pippo" con "barra" che inizia con la prima riga contenente "inizio" e termina con la riga successiva dopo quella contenente "fine".

C'è un modo per fare qualcosa di simile in emacs?

Risposte:


7

evilfornisce una versione ridotta di ex, quindi probabilmente è meglio presumere che non sia un drop-in esatto. Tuttavia, l'esempio fornito funziona immediatamente, a condizione che il punto sia precedente alla prima riga (ovvero la beginriga nell'esempio).


Alla fine anche la ricerca sarebbe iniziata, quindi sembra proprio quello che stavo cercando. Grazie!
Larry Coleman,

8

Ecco un modo per farlo che utilizza solo la funzionalità integrata:

  1. Con il punto nella riga che contiene la prima occorrenza di begin, premere C-SPC.

  2. Passa alla prossima occorrenza di end:

    C-s end RET

  3. Sostituisci foocon bar:

    M-% foo RET bar RET !

Questo sfrutta il fatto che query-replacefunzionerà sulla regione attiva anziché sull'intero buffer se ce n'è uno.


Naturalmente, puoi anche definire un comando personalizzato:

(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))))

Questo comando cercherà sempre dall'inizio del buffer, quindi il punto può essere dopo begin/ foo/ endquando lo invochi.

Imposta un key binding per esso tramite:

(global-set-key (kbd "C-c r") 'replace-from-to)

5

In generale, questo è qualcosa che useresti narrow-to-region.

Si sposta il cursore (ad esempio, cercando) all'inizio della regione e si preme C-SPC, quindi si sposta alla fine della regione e si digita M-x narrow-to-region. Ora puoi eseguire qualsiasi ricerca e sostituire i comandi che desideri e si applicheranno solo alla parte ristretta del buffer. Al termine, digitare M-x widenper ripristinare il contenuto del buffer.


4
Se begin/ endsono delimitatori in un linguaggio di programmazione, è possibile utilizzarlo C-M-Spaceper eseguire la mark-sexpselezione della regione in un comando.
dgtized il

1
Associazioni predefinite: C-x n n( narrow-to-region) e C-x n w( widen).
itsjeyd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.