Como substituir a palavra atual sob o cursor no Emacs

24

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 eu tenho que digitar uma string inteira para ser substituída, isso é simplesmente irritante.

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

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

Alguém sabe como fazer isso com o Emacs?

    
por Think Pl 14.10.2012 / 23:19

6 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á iniciou a substituição, pode voltar ao buffer original para copiar e colar com os comandos usuais de troca de janela ou buffer: 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 você estiver planejando substituir uma ou mais palavras no cursor, poderá iniciar a pesquisa incremental ( C-s ), usar C-w para começar a pesquisar a palavra sob o cursor e, em seguida, pressionar M-% para mude para replace-string .

    
por 14.10.2012 / 23:38
23

A pesquisa incremental tem esse recurso, mas as funções de substituição não. Felizmente, a pesquisa incremental tem uma maneira de alternar para o modo de substituição depois que você seleciona um termo de pesquisa. Então:

  • Pressione C-s para alternar para o modo de pesquisa incremental
  • Pressione Cw para puxar a palavra atual para o buffer de busca. Você pode pressioná-la para acrescentar várias palavras e também pode usar CMy para capturar caracteres individuais e < kbd> Cy para arrancar linhas inteiras
  • Pressione M -% para alternar para o modo de substituição usando o buffer de pesquisa que você já construiu

Como você provavelmente sabe de usar o M -% normalmente, este é um modo de substituição de consulta no qual ele pergunta o que fazer com cada correspondência. Se você quiser apenas substituí-los, clique em ! no primeiro jogo

    
por 14.10.2012 / 23:29
8
;; 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) ))
    
por 15.10.2012 / 01:10
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 cw no vim

    
por 19.01.2016 / 11:52
1

Se você pesquisar e substituir com M-S-% apenas pressionando M-n preenchendo a palavra sob cursor, pressione-o novamente para "delimitador de símbolo".

    
por 11.10.2015 / 11:11
0

Eu estava lutando e querendo a mesma coisa desde que mudei do Vim para o Emacs.

Depois de algumas pesquisas e experimentos, eu criei a função abaixo que permite que você faça a mesma coisa com o pacote Evil instalado ou usando spacemacs.

Ele também trabalha com região ativa (ou seleção visual no termo vim) e isso 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 seguida, no seu init.el, defina a mesma ligação de chave:

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

o atalho de teclado é um pouco diferente do vim, que é "espaço z", mas eu 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 essa solução no momento.

    
por 18.10.2015 / 06:19