O @Malabarba mencionou o uso do wgrep
pacote para editar os resultados do grep / ack / ag.
Eu gostaria de escrever uma explicação detalhada de como uso o ag
pacote e os wgrep-ag
pacotes para obter a edição de resultados 'agregados' usando o multiple-cursors
pacote.
Esses pacotes estão disponíveis no Melpa. Você também precisa ter o ag
aka the_silver_searcher instalado no seu sistema.
Este passo a passo se aplica aos casos em que você está procurando uma maneira de fazer edições de linha única em todos os locais selecionados ag
encontrados.
Instale ag
no seu sistema e nos pacotes emacs mencionados acima.
ag
suporta pesquisa de arquivos com conteúdo que corresponde ao seu regex especificado. A maneira mais simples de saber ag
onde a raiz do projeto é colocar uma .git
pasta vazia lá. Em seguida, faça a pesquisa usando M-x ag-project-regexp
.
O buffer de resultados da pesquisa ag não é editável por padrão. Para torná-lo editável, M-x wgrep-change-to-wgrep-mode
use ou use a wgrep
ligação -default C-c C-p
.
Agora, se você precisar alterar 'abcdef' para 'ghijkl' em todos os seus arquivos, pesquise 'abcdef' e o buffer de resultados ag exibirá todas as linhas que contêm essa sequência. Em seguida, você torna esse buffer editável e altera essas cadeias manualmente e essas alterações serão refletidas nos buffers de arquivo reais ao executar M-x wgrep-finish-edit
ou usar a ligação padrão C-c C-e
. Você também pode usar query-replace-regexp
para fazer essa pesquisa substituir.
Prefiro usar multiple-cursors
a refatoração rápida para que eu possa ver um feedback em tempo real de onde minhas várias edições estão acontecendo simultaneamente. Destaque a string que deseja substituir no buffer de resultados e ligue M-x mc/mark-all-like-this
e edite-a com admiração ao ver as coisas sendo editadas em vários pontos ao mesmo tempo.
Quando estiver satisfeito com as edições, como mencionei acima, faça C-c C-e
para "refletir" as alterações nos buffers reais. Os buffers ainda não estão salvos.
Para salvar todos os buffers, costumo fazer isso de uma só vez, usando a C-x s !
ligação padrão do emacs .
Aqui está um exemplo de caso de uso com capturas de tela:
Ele mostra o processo de substituição de todas as instâncias de bind-to-modi-map
para bind-to-my-map
no meu ~/.emacs.d/
.
Quando procuro bind-to-modi-map
na minha pasta de configuração do emacs, recebo o resultado 'ag'ged abaixo:
Este buffer é somente leitura.
Depois M-x wgrep-change-to-wgrep-mode
, realcei, -modi-map
selecione todas as instâncias dessa seleção usando M-x mc/mark-all-like-this
e depois de editar essas seleções para -my-map
, fica abaixo:
O destaque azul mostra quais linhas serão modificadas quando eu pressionar C-c C-e
.
Ao bater C-c C-e
, você pode ver a alteração refletida no arquivo real nesta captura de tela:
Eu salvaria todos os arquivos modificados usando C-x s !
.
Você não precisa converter o buffer de resultados grep em nada, já existe um modo específico para editar a saída grep (e refletir as alterações nos arquivos, é claro).
(require 'wgrep)
no seu arquivo init.C-c C-p
e edite!C-c C-e
Até funciona com ack e ag também.
fonte
Essa funcionalidade existe no projétil (
projectile-replace
). Ele usará ag / ack / git grep / grep, se disponível (nessa ordem) para encontrar ocorrências etags-query-replace
executar a substituição da consulta.fonte
M-g n C-x e
(ou seja, usenext-error
para rolar as ocorrências).Aqui está outra abordagem, usando Sincelos .
No seu
*grep*
buffer de saída do Emacs , pressione Cc `(que é Cc), que no modo Icicle é vinculado no buffer*grep*
ao comandoicicle-compilation-search
. Isso permite navegar rapidamente entre qualquer um dos hits da pesquisa (osgrep
hits) que você escolher, em qualquer ordem.A entrada digitada no minibuffer filtra dinamicamente (restringe) o conjunto de ocorrências de pesquisa e você pode usar a conclusão progressiva para restringir, combinando sucessivamente vários padrões (por exemplo, substrings, regexps).
Ao navegar entre os hits da pesquisa, você pode substituir qualquer um deles sob demanda - o hit inteiro (linha) ou apenas a parte correspondente à entrada atual do minibuffer.
Consulte Pesquisa de sincelos - Compilar ou Grep . Uma introdução à pesquisa de sincelos está aqui e informações sobre a substituição de correspondências durante a pesquisa de sincelos estão aqui .
fonte
Eu uso este utilitário que escrevi xah_find.el
Eu escrevi porque:
Este utilitário elisp é talvez 5 a 10 vezes mais lento do que chamar o unix grep no emacs, mas funcionou bem para mim.
fonte