Come sostituire la parola corrente sotto il cursore in Emacs


25

Come posso sostituire la parola corrente sotto il cursore in Emacs?

So che posso usare query-replace o replace-string ma ogni volta che lo faccio devo digitare l'intera stringa da sostituire, questo è solo fastidioso.

Vi ha un comando equivalente cword e posso usare una scorciatoia per tirare la parola sotto il cursore per la sostituzione:

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

Qualcuno sa come farlo con Emacs?


Risposte:


2

Usa copia-incolla: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Se hai già iniziato la sostituzione, è possibile tornare al buffer originale per fare il copia-incolla con la solita finestra o buffer di comandi di commutazione: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. È possibile utilizzare un argomento prefisso su M-d(ad esempio ESC 4 2 M-d) per sostituire più parole.

Se stai pensando di sostituire una o più parole sul cursore, puoi invece iniziare dalla ricerca incrementale ( C-s), utilizzare C-wper iniziare la ricerca della parola sotto il cursore, quindi premere M-%per passare a replace-string.


26

La ricerca incrementale ha questa funzione, ma le funzioni di sostituzione no. Fortunatamente, ricerca incrementale fa avere un modo per passare alla modalità di sostituire una volta che hai selezionato un termine di ricerca. Così:

  • Premere C-sper passare alla modalità di ricerca incrementale
  • Premere C-wper trascinare la parola corrente nel buffer di ricerca È possibile continuare a premerla per aggiungere più parole e si può anche usare C-M-yper strappare singoli caratteri e C-yper strappare intere righe
  • Premi M-%per passare alla modalità di sostituzione usando il buffer di ricerca che hai già creato

Come probabilmente saprai dall'uso M-%normale, questa è una modalità di sostituzione della query in cui ti viene chiesto cosa fare con ogni corrispondenza. Se vuoi solo sostituirli tutti, premi !sulla prima partita


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

1
Questa soluzione funziona bene ed è molto più utile di quanto non gli venga detto come farlo manualmente. Sono troppo pigro per essere disturbato dal copia e incolla.
Paul Coccoli,

2

Sono assolutamente nuovo di Emacs ma posso suggerire quanto segue:

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

Ora puoi scrivere una nuova parola. Funziona quasi come cwin vim


1

Se vai in cerca-e-sostituisci M-S-%semplicemente premendo M-nriempie la parola sotto il cursore, premendolo di nuovo lo avvolge in "delimitatore di simboli".


1

Stavo lottando e volevo la stessa cosa da quando sono passato da Vim a Emacs.

Dopo alcune ricerche e sperimentazioni, ho scoperto la seguente funzione che ti consente di fare la stessa cosa con il pacchetto Evil installato o usando spacemacs.

Funziona anche con la regione attiva (o la selezione visiva in vim term) e che può essere molto utile per sostituire parole come 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) "/"))))

quindi nel tuo init.el, definisci lo stesso key binding:

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

il keybinding è leggermente diverso da quello di vim che è "spazio z" ma non ho capito come mapparlo in emacs quando c'è la modalità malvagia. continuo a lamentarmi non di un prefisso ecc. e sono relativamente nuovo con emacs. Ma non è poi così male e me stesso sono felice con questa soluzione al momento.


0

È già stata data una risposta e non posso commentare perché non ho ancora abbastanza reputazione. Ma quello che stai cercando è ciwin vim.

In emacs il più vicino a cui sono arrivato è questa combinazione:

M-b M-d

Questo risale all'inizio della parola su cui si trova il cursore e quindi cancella la parola.

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.