Como substituir a palavra atual sob o cursor no Emacs

25

Como substituo a palavra atual sob o cursor no Emacs?

Eu sei que posso usar query-replace ou replace-string, mas toda vez que faço isso, tenho que digitar toda a string a ser substituída, isso é apenas irritante.

O Vi possui comando equivalente cword e posso usar um atalho para puxar a palavra sob o cursor para substituição:

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

Alguém sabe como fazer isso com o Emacs?

Think Pl
fonte

Respostas:

2

Use copiar e colar: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Se você já começou a substituição, você pode voltar para o tampão original para fazer o copiar e colar com a janela de costume ou buffer comandos de comutação: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Você pode usar um argumento de prefixo em M-d(por exemplo ESC 4 2 M-d) para substituir várias palavras.

Se estiver planejando substituir uma ou mais palavras no cursor, comece com a pesquisa incremental ( C-s), use C-wpara começar a pesquisar a palavra sob o cursor e pressione M-%para alternar para replace-string.

Gilles 'SO- parar de ser mau'
fonte
26

A pesquisa incremental possui esse recurso, mas as funções de substituição não. Felizmente, pesquisa incremental faz tem uma maneira de mudar o modo de substituir uma vez que você selecionou um termo de pesquisa. Tão:

  • Pressione C-spara alternar para o modo de pesquisa incremental
  • Pressione C-wpara puxar a palavra atual no buffer de pesquisa Você pode continuar pressionando-a para acrescentar várias palavras e também pode usar C-M-ypara puxar caracteres individuais e C-ypuxar linhas inteiras
  • Pressione M-%para alternar para substituir o modo usando o buffer de pesquisa que você já construiu

Como você provavelmente sabe do uso M-%normal, esse é um modo de substituição de consulta, em que solicita o que fazer com cada correspondência. Se você quiser apenas substituí-los, bata !na primeira partida

Michael Mrozek
fonte
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
fonte
11
Esta solução funciona bem e é muito mais útil do que ser informado sobre como fazê-lo manualmente. Estou com preguiça de me incomodar com copiar e colar.
Paul Coccoli
2

Sou absolutamente novo no emacs, mas posso sugerir o seguinte:

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

Agora você pode escrever uma nova palavra. Funciona quase como cwno vim

2r2w
fonte
1

Se você pesquisar e substituir, M-S-%basta pressionar a M-npalavra sob o cursor, pressioná-lo novamente e enviá-lo no "delimitador de símbolo".

dolzenko
fonte
1

Eu estava lutando e querendo a mesma coisa desde a mudança do Vim para o Emacs.

Após algumas pesquisas e experiências, criei a função abaixo, que permite que você faça a mesma coisa com o pacote Evil instalado ou usando o spacemacs.

Também funciona com a região ativa (ou seleção visual no termo vim) e pode ser bastante útil para substituir palavras 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) "/"))))

em seu init.el, defina a mesma ligação de chave:

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

keybinding é um pouco diferente do vim, que é o "espaço z", mas não descobri como mapear isso no emacs quando o modo maligno está lá. continue reclamando não é um prefixo etc e eu sou relativamente novo no emacs. Mas ainda não é tão ruim e eu estou feliz com esta solução no momento.

xiaoming wu
fonte
0

Isso já foi respondido e não posso comentar porque ainda não tenho reputação suficiente. Mas o que você está procurando é ciwno vim.

No emacs, o mais próximo que cheguei é dessa combinação:

M-b M-d

Isso volta ao início da palavra em que o cursor está e exclui a palavra.

Jamesy Dimmick May
fonte