Como pesquiso e substituo sobre um conjunto de arquivos?

9

Gostaria de definir um conjunto de arquivos no qual posso pesquisar e substituir o texto.

Esclarecer:

Eu gostaria de poder pesquisar, por exemplo, em todos os arquivos xk * .tex em um determinado diretório (e excluindo arquivos de backup). Eu também gostaria de poder alterar a expressão, por exemplo, "incerteza", para "indeterminação" em todos os arquivos dd * .sh e ee * .cls.

Qual é a maneira padrão de fazer isso?

Claudio
fonte
@ Claudio Você pode dar uma olhada em diredcomo encontrar e substituir um subconjunto de arquivos em um determinado diretório.
Lula Lula 23/02
Aqui está um exemplo de "pesquisar / substituir" em vários arquivos em um diretório / projeto usando ag, wgrepe multiple-cursors.
Kaushal Modi

Respostas:

4

Se você estiver trabalhando em um projeto bem definido, poderá usar occure grepinstalações dentro desse projeto via projectile. Cribbing de sua descrição do github, entre os vários bits de funcionalidade oferecidos por projectile, ele pode fazer:

  • substituir no projeto
  • ocorrência múltipla em buffers de projeto
  • grep no projeto
  • visite o projeto em dired
Dan
fonte
4

Se todos os arquivos estiverem no mesmo diretório, você poderá seguir estas etapas. Baseamos isso no segundo exemplo dado nos comentários:

  1. M-xdiredpara abrir o diretório relevante no diredmodo.
  2. %mpara executar dired-mark-files-regexpnesse diretório.
  3. Digite ^dd.*\.sh$, que é o equivalente a regexpdd*.sh . Esses arquivos agora serão marcados com um *e também podem aparecer destacados em uma cor diferente, dependendo do seu esquema de cores.
  4. Repita a etapa 3 quantas vezes for necessário, com a regexp desejada (por exemplo ^ee.*\.cls$), até que todos os arquivos que você deseja editar sejam marcados.
  5. Qpara executar dired-do-query-replace-regexpnos arquivos que você marcou.
  6. Digite uncertaintye indeterminacycomo as cadeias de consulta. (Acho que isso diferencia maiúsculas de minúsculas. Se você precisar fazer distinção entre maiúsculas e minúsculas, isso pode exigir uma regexp, mas não tenho certeza.)

E essa é a ideia. Se você precisar repetir isso algumas vezes em pastas diferentes, poderá gravar as etapas 2 a 6 como uma macro (pressione C-x (após a etapa 1 e C-x )após a etapa 6). E mesmo que você não se sinta muito à vontade com o elisp, você pode converter essa macro em elisp usando insert-kbd-macroe tentar cortá-la em uma função útil.

Brian Z
fonte
1
Por favor, note que em Emacsland, S-qnão significa shift+q, significa super+q. Você deveria apenas escrever Qse quis dizer shift+q. Eu editei seu comentário para refletir isso.
babá
2
Na verdade não, S-qsignifica shift+q; super+qseria escrito s-q.
Sue D. Nymme 23/02
3

Você pode usar M-x find-name-diredpara obter um buffer direcionado contendo links para todos os arquivos que correspondem a um padrão de nome específico.

Use M-x find-grep-diredpara obter um buffer direcionado contendo os arquivos cujo conteúdo corresponde ao padrão grep fornecido.

Existem muitos outros comandos desse tipo; o mais adequado depende dos seus requisitos, por isso, considere atualizar sua pergunta.

Em seguida, você pode percorrer a lista de arquivos usando macros. Dê uma olhada na resposta de Brian para um exemplo: https://emacs.stackexchange.com/a/9497/2005

rekado
fonte
1

Use rgrep e wgrep.

Com o rgrep, você pode procurar todos por uma regexp em arquivos cujo nome de arquivo corresponde a uma regexp e dentro de um diretório (e seus subdiretórios)

Com o wgrep, você pode editar o buffer que contém os resultados da sua pesquisa do rgrep.

PuercoPop
fonte