Sugiro alterar o título para "pesquisar e substituir o buffer inteiro". Globalmente, também pode estar se referindo a projetos inteiros.
Malabarba 25/09
1
Esta é uma área em que é difícil vencer o Vim / Evil::%s/foo/bar
shosti
@shosti: Na verdade, acho que seu método exige mais pressionamentos de tecla. Apenas sayin ;-)
nispio
Respostas:
14
Não vejo isso apoiado enquanto ainda retendo sua posição inicial. (Não vejo uma maneira de avançar para o início do buffer quando a pesquisa chegar ao fim.)
Sua melhor aposta é usar M-<para ir para o início do buffer e query-replace, quando terminar, pressione C-uC-spaceC-uC-spacepara voltar ao ponto de partida.
Você pode adicionar isso ao seu init.elarquivo para atualizar o comportamento de M-%para substituir a palavra no buffer inteiro por padrão:
(defun my/query-replace (from-string to-string &optional delimited start end)
"Replace some occurrences of FROM-STRING with TO-STRING. As each match is
found, the user must type a character saying what to do with it. This is a
modified version of the standard `query-replace' function in `replace.el',
This modified version defaults to operating on the entire buffer instead of
working only from POINT to the end of the buffer. For more information, see
the documentation of `query-replace'"
(interactive
(let ((common
(query-replace-read-args
(concat "Query replace"
(if current-prefix-arg " word" "")
(if (and transient-mark-mode mark-active) " in region" ""))
nil)))
(list (nth 0 common) (nth 1 common) (nth 2 common)
(if (and transient-mark-mode mark-active)
(region-beginning)
(buffer-end -1))
(if (and transient-mark-mode mark-active)
(region-end)
(buffer-end 1)))))
(perform-replace from-string to-string t nil delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map "%" 'my/query-replace)
E para obter o mesmo comportamento de query-replace-regexp:
(defun my/query-replace-regexp (regexp to-string &optional delimited start end)
"Replace some things after point matching REGEXP with TO-STRING. As each
match is found, the user must type a character saying what to do with
it. This is a modified version of the standard `query-replace-regexp'
function in `replace.el', This modified version defaults to operating on the
entire buffer instead of working only from POINT to the end of the
buffer. For more information, see the documentation of `query-replace-regexp'"
(interactive
(let ((common
(query-replace-read-args
(concat "Query replace"
(if current-prefix-arg " word" "")
" regexp"
(if (and transient-mark-mode mark-active) " in region" ""))
t)))
(list (nth 0 common) (nth 1 common) (nth 2 common)
(if (and transient-mark-mode mark-active)
(region-beginning)
(buffer-end -1))
(if (and transient-mark-mode mark-active)
(region-end)
(buffer-end 1)))))
(perform-replace regexp to-string t t delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map [?\C-%] 'my/query-replace-regexp)
:%s/foo/bar
Respostas:
Não vejo isso apoiado enquanto ainda retendo sua posição inicial. (Não vejo uma maneira de avançar para o início do buffer quando a pesquisa chegar ao fim.)
Sua melhor aposta é usar M-<para ir para o início do buffer e
query-replace
, quando terminar, pressione C-uC-spaceC-uC-spacepara voltar ao ponto de partida.fonte
transient-mark-mode
está ativado. Caso contrário,C-SPC C-SPC
será ativado temporariamentetransient-mark-mode
Você pode adicionar o seguinte comando ao seu arquivo de inicialização do emacs e vinculá-lo ao pressionamento de tecla de sua escolha.
fonte
Você pode seguir as seguintes etapas:
C-x h
- Selecione o buffer inteiro ouM-<
- Vá para o topo do bufferM-%
- Iniciadoquery-replace
!
- Forçar substituir tudoC-u C-SPC C-u C-SPC
- Volte para a sua posição inicialfonte
Você pode adicionar isso ao seu
init.el
arquivo para atualizar o comportamento deM-%
para substituir a palavra no buffer inteiro por padrão:E para obter o mesmo comportamento de
query-replace-regexp
:fonte
Se você usar Sincelos , poderá pesquisar e substituir todo o buffer (ou vários buffers, arquivos ou destinos de favoritos).
E ao contrário
query-replace
(por exemploC-x h M-%
):Você pode navegar pelas correspondências em qualquer ordem .
A substituição está sob demanda: você não precisa visitar cada partida e responder se deve ou não substituí-la.
fonte
Esta é a solução que estou usando atualmente, que começa do início do buffer e voltará ao ponto antigo após a substituição.
fonte