Comment remplacer le mot actuel sous le curseur dans Emacs

25

Comment remplacer le mot actuel sous le curseur dans Emacs?

Je sais que je peux utiliser query-replace ou replace-string mais chaque fois que je le fais, je dois taper une chaîne entière à remplacer, c'est juste ennuyeux.

Vi a la commande cword équivalente et je peux utiliser un raccourci pour tirer le mot sous le curseur pour le remplacer:

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

Quelqu'un sait comment le faire avec Emacs?

Pensez Pl
la source

Réponses:

2

Utilisez le copier-coller: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Si vous avez déjà commencé le remplacement, vous pouvez revenir à la mémoire tampon d' origine pour faire le copier-coller avec la fenêtre habituelle ou tampon des commandes de commutation: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Vous pouvez utiliser un argument préfixe sur M-d(par exemple ESC 4 2 M-d) pour remplacer plusieurs mots.

Si vous prévoyez de remplacer un ou plusieurs mots au niveau du curseur, vous pouvez plutôt commencer à partir de la recherche incrémentielle ( C-s), utiliser C-wpour commencer la recherche du mot sous le curseur, puis appuyez sur M-%pour passer à replace-string.

Gilles 'SO- arrête d'être méchant'
la source
26

La recherche incrémentale a cette fonctionnalité, mais pas les fonctions de remplacement. Heureusement, la recherche incrémentielle permet de passer en mode de remplacement une fois que vous avez sélectionné un terme de recherche. Alors:

  • Appuyez C-spour passer en mode de recherche incrémentielle
  • Appuyez C-wpour extraire le mot actuel dans le tampon de recherche Vous pouvez continuer à appuyer dessus pour ajouter plusieurs mots, et vous pouvez également utiliser C-M-ypour extraire des caractères individuels et C-ypour extraire des lignes entières
  • Appuyez M-%pour passer en mode de remplacement en utilisant le tampon de recherche que vous avez déjà construit

Comme vous le savez probablement en utilisant M-%normalement, il s'agit d'un mode de remplacement de requête dans lequel il vous demande quoi faire avec chaque correspondance. Si vous voulez simplement les remplacer tous, appuyez !sur le premier match

Michael Mrozek
la source
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
la source
1
Cette solution fonctionne bien et est beaucoup plus utile que de savoir comment le faire manuellement. Je suis trop paresseux pour être gêné par le copier-coller.
Paul Coccoli
2

Je suis absolument nouveau sur emacs mais je peux suggérer ce qui suit:

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

Vous pouvez maintenant écrire un nouveau mot. Fonctionne presque comme cwdans vim

2r2w
la source
1

Si vous allez dans la recherche et le remplacement en M-S-%appuyant simplement sur M-nremplit le mot sous le curseur, appuyez à nouveau pour l'envelopper dans le "délimiteur de symboles".

dolzenko
la source
1

Je luttais et je voulais la même chose depuis mon passage de Vim à Emacs.

Après quelques recherches et expérimentations, j'ai trouvé la fonction ci-dessous qui vous permet de faire la même chose avec le paquet Evil installé ou en utilisant spacemacs.

Il fonctionne également avec la région active (ou la sélection visuelle en terme de vim) et cela peut être très utile pour remplacer un mot comme 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) "/"))))

puis dans votre init.el, définissez la même liaison de clé:

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

la liaison de touches est légèrement différente de celle de vim qui est "espace z" mais je n'ai pas compris comment mapper cela dans emacs quand le mode diabolique est là. continuez à vous plaindre pas un préfixe etc et je suis relativement nouveau pour emacs. Mais toujours pas trop mal et je suis satisfait de cette solution pour le moment.

xiaoming wu
la source
0

Cela a déjà été répondu et je ne peux pas commenter car je n'ai pas encore assez de réputation. Mais ce que vous cherchez est ciwen vim.

Dans emacs, le plus proche que je suis venu est cette combinaison:

M-b M-d

Cela remonte au début du mot sur lequel se trouve le curseur, puis supprime le mot.

Jamesy Dimmick May
la source