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 !
.