Cómo reemplazar la palabra actual debajo del cursor en Emacs

25

¿Cómo reemplazo la palabra actual debajo del cursor en Emacs?

Sé que puedo usar query-replace o replace-string pero cada vez que lo hago tengo que escribir la cadena completa para ser reemplazado, esto es molesto.

Vi tiene una contraseña de comando equivalente y puedo usar un atajo para colocar la palabra debajo del cursor para reemplazarla:

nmap <leader>z :%s#\<<C-r>=expand("<cword>")<CR>\>#

¿Alguien sabe cómo hacerlo con Emacs?

Pensar pl
fuente
Echa un vistazo a stackoverflow.com/questions/8257009/…
Emanuel Berg

Respuestas:

2

El uso de copiar y pegar: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Si ya ha comenzado la sustitución, se puede volver a utilizar el búfer original de hacer la copia y pegar con la ventana habitual o tampón órdenes de conmutación: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Puede usar un argumento prefijo en M-d(por ejemplo ESC 4 2 M-d) para reemplazar varias palabras.

Si planea reemplazar una o más palabras en el cursor, puede comenzar desde una búsqueda incremental ( C-s), use C-wpara comenzar a buscar la palabra debajo del cursor y luego presione M-%para cambiar a replace-string.

Gilles 'SO- deja de ser malvado'
fuente
26

La búsqueda incremental tiene esta característica, pero las funciones de reemplazo no. Afortunadamente, la búsqueda incremental hace tener una manera de cambiar al modo de reemplazar una vez que haya seleccionado un término de búsqueda. Asi que:

  • Presione C-spara cambiar al modo de búsqueda incremental
  • Presione C-wpara tirar la palabra actual en el búfer de búsqueda Puede seguir presionándola para agregar varias palabras, y también puede usarla C-M-ypara tirar caracteres individuales y C-ypara tirar líneas enteras
  • Presione M-%para cambiar al modo de reemplazo usando el búfer de búsqueda que ya ha construido

Como probablemente sepa por usar M-%normalmente, este es un modo de reemplazo de consulta en el que le pregunta qué hacer con cada coincidencia. Si solo quieres reemplazarlos a todos, haz clic !en el primer partido

Michael Mrozek
fuente
9
;; query-replace current word
(defun qrc (replace-str)
   (interactive "sDo query-replace current word with: ")
   (forward-word)
   (let ((end (point)))
      (backward-word)
      (kill-ring-save (point) end)
      (query-replace (current-kill 0) replace-str) ))
Emanuel Berg
fuente
1
Esta solución funciona bien y es mucho más útil que saber cómo hacerlo manualmente. Soy demasiado vago para molestarme con copiar y pegar.
Paul Coccoli
2

Soy completamente nuevo en emacs pero puedo sugerir lo siguiente:

M-b       to move backward over a word
M-d       to kill up to the end of the word

Ahora puedes escribir una nueva palabra. Funciona casi como cwen vim

2r2w
fuente
1

Si va a buscar y reemplazar con M-S-%solo presionar M-nrellena la palabra debajo del cursor, presionarlo nuevamente lo envuelve en "delimitador de símbolo".

dolzenko
fuente
1

Estaba luchando y deseando lo mismo desde que me mudé de Vim a Emacs.

Después de un poco de investigación y experimentación, se me ocurrió la siguiente función que le permite hacer lo mismo con el paquete Evil instalado o usando spacemacs.

También funciona con región activa (o selección visual en término vim) y eso puede ser bastante útil para reemplazar palabras como abc-def-hij:

; replace current word or selection using vim style for evil mode
(defun evil-replace-word-selection()
(interactive)
(if (use-region-p)
    (let (
            (selection (buffer-substring-no-properties (region-beginning) (region-end))))
        (if (= (length selection) 0)
        (message "empty string")
        (evil-ex (concat "'<,'>s/" selection "/"))
        ))
    (evil-ex (concat "%s/" (thing-at-point 'word) "/"))))

luego, en su init.el, defina el mismo enlace de teclas:

(global-set-key (kbd "\C-co") 'evil-replace-word-selection)

la combinación de teclas es ligeramente diferente de vim uno, que es "espacio z", pero no he descubierto cómo mapear eso en emacs cuando el modo malvado está allí. sigo quejándome, no es un prefijo, etc. y soy relativamente nuevo en emacs. Pero todavía no está tan mal y yo mismo estoy contento con esta solución en este momento.

Xiaoming wu
fuente
0

Esto ya ha sido respondido y no puedo comentar porque todavía no tengo suficiente reputación. Pero lo que estás buscando está ciwen vim.

En emacs, lo más cerca que he llegado es esta combinación:

M-b M-d

Esto vuelve al comienzo de la palabra en la que está el cursor y luego elimina la palabra.

Jamesy Dimmick May
fuente