¿Hay un equivalente a los comandos de sustitución de estilo sed de vim?

14

Una de las cosas que extraño de vim es poder escribir un comando de sustitución que funcione en varias líneas, por ejemplo:

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

El comando anterior sustituye "foo" por "bar" que comienza con la primera línea que contiene "begin" y termina con la siguiente línea que contiene "end".

¿Hay alguna manera de hacer algo similar en emacs?

Larry Coleman
fuente

Respuestas:

7

evilproporciona una versión simplificada de ex, por lo que probablemente sea mejor presumir que no es un drop-in exacto. Sin embargo, el ejemplo que proporcionó funciona de forma inmediata, siempre que ese punto sea anterior a la primera línea (es decir, la beginlínea de su ejemplo).

Dan
fuente
En vim, la búsqueda también comenzaría en el punto, por lo que suena como lo que estaba buscando. ¡Gracias!
Larry Coleman
8

Aquí hay una forma de hacerlo que usa solo la funcionalidad incorporada:

  1. Con el punto en la línea que contiene la primera aparición de begin, presione C-SPC.

  2. Pasar a la siguiente aparición de end:

    C-s end RET

  3. Reemplazar foocon bar:

    M-% foo RET bar RET !

Esto hace uso del hecho de que query-replacefuncionará en la región activa en lugar de todo el búfer si hay uno.


Por supuesto, también puede definir un comando personalizado:

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

Este comando siempre buscará desde el principio del búfer, por lo que el punto puede estar después begin/ foo/ endcuando lo invocas.

Configure una combinación de teclas para ello a través de:

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

En general, esto es algo que usarías narrow-to-region.

Mueve el cursor (por ejemplo, buscando) al comienzo de la región y presiona C-SPC, luego mueve al final de la región y escribe M-x narrow-to-region. Ahora puede emitir cualquier comando de búsqueda y reemplazo que desee y solo se aplicarán a una parte reducida del búfer. Una vez que haya terminado, escriba M-x widenpara restaurar el contenido del búfer.

Elias Mårtenson
fuente
44
Si begin / endson delimitadores en un lenguaje de programación, es probable que pueda usar C-M-Spacepara ejecutar mark-sexppara seleccionar la región en un comando.
Dgtized
1
Enlaces predeterminados: C-x n n ( narrow-to-region) y C-x n w( widen).
itsjeyd