Como acompanhamento dessa pergunta , ele está tentando descobrir como fazer algo assim que deve ser fácil, o que me impede de me acostumar a usar o Emacs e, em vez disso, iniciar o editor com o qual já estou familiarizado. Eu uso o exemplo aqui com bastante frequência na edição de vários arquivos.
No Ultraedit, eu faria Alt + s e p para exibir uma caixa de diálogo com as opções: Localizar (inclui o uso de expressões regulares em várias linhas), Substituir por, Em Arquivos / Tipos, Diretório, Caixa de correspondência, Corresponder apenas a palavra inteira, Lista Arquivos alterados e subdiretórios de pesquisa. Normalmente, primeiro uso o mouse para clicar e arrastar e selecionar o texto que quero substituir.
Usando apenas em si Emacs (no Windows XP), sem chamar qualquer utilitário externo, como substituir todos foo \ NBAR com bar \ nbaz em *.c
e *.h
arquivos em alguma pasta e todas as pastas abaixo dela. Talvez o Emacs não seja a melhor ferramenta para fazer isso, mas como isso pode ser feito facilmente com um comando mínimo?
C-x s !
para salvar todos os arquivos de uma vez.M-,
para continuar pesquisando e substituindo (por exemplo, após o prompt "reverter arquivo", se o arquivo foi alterado no disco).M-x find-name-dired RET
M->
) até que "find finished
" apareça para garantir que todos tenham sido carregadost
para "marcar / alternar" para todos os arquivos encontradosQ
"Query-Replace in Files ...": você será solicitado a regexps de consulta / substituição.y
para substituir e passar para a próxima correspondência, n para ignorar uma correspondência, etc.N
para pular toda a substituição possível para o restante do arquivo atual. (N
é emacs 23+ apenas)Y
.C-x C-b
se estiver associado a ibuffer, ouM-x ibuffer RET
) para listar todos os arquivos abertos.* u
para marcar todos os arquivos não salvos, digiteS
para salvar todos os arquivos marcados* * RET
para desmarcar todas as marcas ou digiteD
para fechar todos os arquivos marcadosEsta resposta é combinada a partir desta resposta , deste site e de minhas próprias anotações. Usando o Emacs 23+.
fonte
ibuffer
não está vinculadoC-x C-b
por padrão.C-x C-b
paraibuffer
, porque é muito melhor do que a ligação padrão. Basta adicionar(global-set-key (kbd "C-x C-b") 'ibuffer)
ao seu arquivo .emacs. Caso contrário, useM-x ibuffer RET
as instruções acima.bla-bla-bla
é visitado como somente leitura e para a pesquisa. Como evitar / ignorar isso e continuar substituindo? Obrigado.ibuffer
quando você podeC-x s
(save-some-buffers
) e digita!
? Eu não quero ser divertido, apenas curioso. PS vantagem para descrever!
,N
eY
.As respostas fornecidas são ótimas, no entanto, pensei em adicionar uma abordagem um pouco diferente.
É um método mais interativo, e requer
wgrep
,rgrep
eiedit
. Ambosiedit
ewgrep
devem ser instalados via MELPA ou Marmalade (usandoM-x package-list-packages
)Primeira corrida
M-x rgrep
para encontrar a string que você está procurando.Você poderá especificar tipos de arquivo / padrão e a pasta a ser recursiva.
Em seguida, você precisará executar
wgrep
iniciá-loC-s C-p
.Wgrep vai deixar você editar os
rgrep
resultados, para definir uma região na corda para combinar e começariedit-mode
comC-;
(dependendo do seu terminal, você pode precisar de re-ligamento isso)Todas as ocorrências serão editáveis de uma só vez.
C-x C-s
comprometerwgrep
. Em seguida,C-x s !
salve os arquivos alterados.O principal benefício desse método é que você pode usar
iedit-mode
para desativar determinadas correspondênciasM-;
. Você também pode usar os resultadosrgrep
para acessar os arquivos, por exemplo, se houver uma correspondência inesperada.Acho muito útil fazer edições de origem e renomear símbolos (variáveis, nomes de funções etc.) em um projeto.
Se você ainda não conhece / usa o modo iedit, é uma ferramenta muito útil, recomendo fortemente que você dê uma olhada.
fonte
wgrep
éC-c C-p
btw.Projétil é muito bom: Cc pr executa o comando projectile-replace
fonte
Geralmente, uso outras ferramentas para executar esta tarefa, e parece que muitas das abordagens mencionadas no shell de entrada Localizar e Substituir Across de Arquivos do EmacsWiki , mas o pacote Findr parece muito promissor.
Roubando parte do arquivo de origem :
fonte
Fonte de informação: 1
Para usuários do emacs pro:
Guia passo a passo para iniciantes do Emacs
Selecionar arquivos de destino
Inicie o emacs digitando “emacs” no prompt da interface da linha de comandos. (Ou clique duas vezes no ícone Emacs se você estiver em um ambiente de interface gráfica do usuário)
Selecionando arquivos em um diretório
Primeiro, você precisa selecionar os arquivos que deseja fazer a substituição. Use o menu gráfico 〖Arquivo ▸ Abrir diretório〗. O Emacs solicitará um caminho de diretório. Digite o caminho do diretório e pressione Enter.
Agora, você verá a lista de arquivos e agora precisa marcar os arquivos nos quais deseja que a regex encontre / substitua para trabalhar. Você marca um arquivo movendo o cursor para o arquivo desejado e pressione m. Desmarque-o pressionando u. (Para listar subdiretórios, mova o cursor para o diretório e pressione i. O conteúdo do subdiretório será listado na parte inferior.) Para marcar todos os arquivos por uma regex, digite 【% m】 e digite seu padrão de regex. Por exemplo, se você quiser marcar todos os arquivos HTML, digite 【% m】 e .html $. (Você pode encontrar uma lista dos comandos de marcação no menu gráfico “Marca” (este menu aparece quando você está no modo direcionado).)
Selecionando arquivos em um diretório e todos os seus subdiretórios
Se você deseja localizar / substituir arquivos em um diretório, incluindo centenas de subdiretórios, aqui está um método para selecionar todos esses arquivos.
Ligue para a localização. (você chama um comando pressionando 【Alt + x】) Em seguida, digite um nome de diretório, ⁖ / Users / mary / myfiles
Nota: se você estiver usando o emacs em um terminal de texto não gráfico unix, e se 【Alt + x】 não funcionar, o toque equivalente da tecla será 【Esc x】.
O Emacs perguntará com o prompt “Run find (with args):”. Se você precisar fazer a substituição em todos os arquivos HTML, digite -name "* html". Se você não se importa com o tipo de arquivo, mas simplesmente com todos os arquivos nesse diretório, digite "-type f".
Agora, marque os arquivos como descrito acima.
Localizar / substituir interativo
Agora, você está pronto para fazer a busca interativa substituir. Por uma questão de simplicidade, digamos que você queira substituir a palavra "rápido" por "super". Agora, chame dired-do-query-replace-regexp. Ele solicitará a sequência regex e a sequência de substituição. Digite "rápido", digite e depois "super".
Agora, o emacs usará seu padrão e verificará os arquivos, parando e mostrando sempre que uma correspondência ocorrer. Quando isso acontece, o emacs solicitará a você, e você poderá fazer a alteração ou ignorá-la. Para fazer a alteração, digite y. Para pular, digite n. Se você simplesmente deseja que o emacs vá em frente e faça todas essas alterações no arquivo atual, digite!
Se você deseja cancelar toda a operação sem salvar as alterações feitas, digite 【Ctrl + g】 e saia do emacs usando o menu 〖Arquivo ▸ Sair do Emacs〗.
Salvando os arquivos alterados
Agora, depois de passar pela provação acima, há mais uma etapa que você precisa executar, que é salvar os arquivos alterados.
Se você estiver usando o emacs versão 22 ou posterior, chame ibuffer para entrar no modo de listagem de buffer, digite 【* u】 para marcar todos os arquivos não salvos e digite S para salvar todos eles. (isso é turnos)
Se você estiver usando uma versão 21 do emacs, poderá fazer o seguinte: buffers de lista de chamadas, mova o cursor para o arquivo que deseja salvar e digite s. Ele marcará o arquivo para uma ação posterior salva. Digite u para desmarcar. Quando terminar, digite x para executar o salvamento de todos os arquivos marcados para salvar. (no emacs, o arquivo aberto é chamado de "buffer". Desconsidere outras coisas lá.)
Alternativa às opções acima, você também pode chamar save-some-buffers (Ctrl + xs). Em seguida, o emacs exibirá cada arquivo não salvo e perguntará se você deseja que ele seja salvo.
Nota: o regex do emacs não é o mesmo que o Perl ou o Python, mas é semelhante. Para um resumo e padrões comuns, consulte: Emacs Regex.
fonte
Usar o dired para recuar em uma árvore profunda de diretórios será um pouco lento para esta tarefa. Você pode considerar usar tags-query-replace . Isso significa criar uma tabela de tags, mas geralmente é útil de qualquer maneira, e é rápido.
fonte
Para buffers abertos, é isso que eu faço:
fonte
M-X Dired
, et para marcar todos os arquivos eQ
para consultar substituir texto em todos eles. Você pode expandir um subdiretório usando oi
comando antes da substituição da consulta. A principal informação que estou adicionando é que, se você der um prefixo (control-u) ao comando i, ele solicitará o argumento arg e o argumento -R expandirá recursivamente tudosubdirs
nodired
buffer. Então agora você pode pesquisar todos os arquivos em um diretório inteiro.fonte
Outra opção é usar pesquisa Icicles . Esse é um tipo diferente de pesquisa incremental que usa a conclusão da entrada do minibuffer contra ocorrências de pesquisa. Conforme você modifica sua entrada atual, o conjunto de ocorrências correspondentes é atualizado no buffer
*Completions*
.Você pode pesquisar qualquer número de arquivos, buffers ou locais marcados, que você pode escolher usando a correspondência do padrão minibuffer (por exemplo, regexp).
Quando você visita um hit de pesquisa, pode substituir por demanda o hit inteiro ou apenas a parte dele que corresponde à entrada atual do minibuffer. A substituição sob demanda significa que você não é consultado sobre cada ocorrência de pesquisa por vez; você acessa os hits que deseja diretamente, em qualquer ordem. Essa abordagem pode ser mais eficaz do que substituir a consulta se você tiver um número limitado de substituições a fazer: ignore o exaustivo
y/n
solicitação .A pesquisa termina nos contextos de pesquisa que você define - você não está limitado a pesquisar todo o texto nos arquivos de destino (por exemplo, você pode pular comentários ou tipos específicos de seções do programa). Um exemplo simples de um contexto de pesquisa é uma linha, como em
grep
, mas um contexto pode ser qualquer bloco de texto correspondente ao padrão que você desejar. Normalmente, você define os contextos de pesquisa usando uma regexp, mas pode usar uma função. Além de definir os seus próprios, existem comandos predefinidos de busca de sincelos para diferentes tipos de contextos: blocos de propriedades de texto ou propriedades de sobreposição, coisas no momento, etc.Você também pode classificar os resultados da pesquisa em várias ordens de classificação para facilitar o acesso / navegação.
fonte
find-name-dired
está bem, mas:find-dired
é mais flexível a esse respeito, mas também é feito para o uso de regras gerais (mesmo que possam ser arbitrariamente complexas). E, claro,find
tem uma linguagem complexa e própria.find(-name)-dired
buffer, será necessário marcá-los ou excluir / omitir as linhas daqueles em que você não deseja atuar.Uma alternativa é usar comandos Dired + que atuam em (a) os arquivos marcados e (b) todos os arquivos marcados (ou todos os arquivos, se nenhum estiver marcado) nos subdiretórios marcados ... encontrados recursivamente . Isso oferece generalidade e controle fácil sobre a escolha do arquivo. Esses comandos "aqui e abaixo" estão todos na tecla de prefixo
M-+
no modo Dired.Por exemplo,
M-+ Q
é o mesmo queQ
--- query-replace, mas os arquivos de destino são todos aqueles marcados no diretório atual e em todos os subdiretórios marcados, baixo, baixo, baixo ...Sim, uma alternativa ao uso desses comandos aqui e abaixo é inserir todos os subdiretórios e seus subdiretórios, recursivamente, e usar um comando de nível superior, como
Q
. Mas muitas vezes pode ser conveniente não se preocupar com os subdiretórios inseridos.E para fazer isso, você precisa de uma maneira rápida de inserir todos esses subdiretórios recursivamente . Aqui também, Dired + pode ajudar.
M-+ M-i
insere todos os subdiretórios marcados e seus próprios subdiretórios marcados, recursivamente. Ou seja, é comoM-i
(que insere os subdiretórios marcados no Dired + ), mas atua recursivamente nos subdiretórios.(Todos esses comandos Dired + "aqui e abaixo" estão no menu Múltiplos > Marcados aqui e abaixo .)
Você também pode executar operações Dired em um conjunto de arquivos Emacs , que é um conjunto salvo de nomes de arquivos localizados em qualquer lugar. E se você usar Sincelos , poderá abrir um buffer Dired apenas para os arquivos em um conjunto de arquivos ou outros tipos de listas de arquivos salvos.
Você também pode marcar qualquer buffer direcionado, incluindo aquele criado usando
find(-name)-dired
. Isso fornece uma maneira rápida de retornar a esse conjunto (por exemplo, um conjunto de projetos) posteriormente. E se você usar o Bookmark + , os marcadores favoritos de um buffer direcionado (a) suasls
opções, (b) quais arquivos estão marcados, (c) quais subdiretórios são inseridos e (d) quais (sub) diretórios estão ocultos. Tudo isso é restaurado quando você "pula" para o marcador. Marcador + também permite marcar uma árvore inteira de buffers Dired --- saltar para o marcador restaura todos os buffers da árvore.fonte
Gostaria de sugerir mais uma ótima ferramenta que ainda não foi mencionada, a saber, Helm .
É um ótimo substituto para muitas operações padrão do Emacs que envolvem conclusão, pesquisa etc. Em particular,
helm-find-files
permite executar a substituição de consultas (incluindo regexp) em vários arquivos selecionados.Basta abrir
helm-find-files
, marcar os arquivos relevantesM-SPC
e, em seguida, useF6
ouF7
para executar a substituição da consulta ou regexp de substituição da consulta nos arquivos selecionados.fonte
helm-find-files
marcar por regexp em vez deM-SPC
?Não é o Emacs, mas o xxdiff vem com uma ferramenta chamada xx-rename que faz isso para várias seqüências de caracteres de uma vez (por exemplo, de para de para de para), com instruções interativas, salve backups de todos os arquivos modificados e produza uma breve log de alterações feitas com o contexto. É isso que costumo usar quando faço renomeações grandes / globais.
fonte