Arquivos recursivamente abertos que correspondem a regexp em diretórios marcados

9

De um modo geral, gostaria de poder abrir todos os arquivos em um determinado conjunto de diretórios (e seus subdiretórios) em que o nome do arquivo corresponde a um determinado regexp.

Por exemplo

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

Tenho marcado os diretórios hst, ince lib, e agora eu quero visitar todos os arquivos com as extensões .c, .cce .hdentro desses três diretórios e seus subdiretórios.

Seria ainda melhor se eu pudesse ver tudo o que estou abrindo antes de abri-lo. Se o buffer direcionado foi atualizado para mostrar todos os arquivos que correspondiam à minha pesquisa e todos foram destacados, eu poderia fazer uma verificação de integridade para garantir que minha pesquisa retornasse o que eu esperava.

Estou aberto a sugestões para fazer a mesma coisa usando helmou dired+outras extensões que me permitam navegar mais facilmente no meu sistema de arquivos.

nispio
fonte
Mathias ou Drew responderam à sua pergunta? Ou você estava procurando algo diferente?
Malabarba 15/10

Respostas:

14

Tente o seguinte:

C-u C-x d

Isso permite que você insira argumentos sobre como o Dired deve listar arquivos. Por padrão, ele diz -alno prompt. Adicione Ra isso, terminando com -alR. Digite RET.

Selecione / digite um diretório e pressione RET.

Isso abrirá recursivamente todos os diretórios daquele que você selecionar e abaixo.

A partir daqui, digite % mpara marcar todos os arquivos que correspondem a um determinado padrão de nome de arquivo. Também costumo digitar te depois kmatar (ocultar) todos os arquivos nos quais não estou interessado. Digite tnovamente para marcar todos os arquivos.

No que diz respeito à abertura dos arquivos, não acho que exista uma maneira padrão de fazê-lo, mas você pode definir facilmente um novo comando para fazê-lo (coloque-o no seu .emacsarquivo):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

Provavelmente alguém já incluiu isso em algum pacote de aprimoramento Dired, mas também é divertido fazer você mesmo;)

Desfrutar!

Mathias Dahl
fonte
7

Você pode fazer isso facilmente com helm-projectile-find-file . Como o Projectile controla todos os arquivos com seu caminho relativo, você pode facilmente restringir-se a qualquer coisa. Vamos usar o seu exemplo. No seu caso, você quer abrir arquivos em hst, inc, e lib. Você pode recuperar todos os arquivos pertencentes a este diretório de duas maneiras:

  • No prompt do Helm helm-projectile-find-file, insira cada diretório e os arquivos marcados restritos a esse diretório. Por exemplo, primeiro eu entro ^hst/(que se restringe a todos os arquivos que contêm hst/no início de cada candidato). Marque todos os arquivos comM-a , faça algo semelhante nos arquivos dos outros dois diretórios.

  • Ou, você pode recuperar arquivos em todos os diretórios que utilizam este padrão : ^hst/\|^inc\|^lib. Helm aceita regex depois de tudo. O regex \|significa or. Faça isso se desejar selecionar tudo de uma só vez.

Com qualquer um desses itens, você terá marcado todos os arquivos que deseja abrir. Em seguida, basta pressionar RETpara abrir todos eles.

Observe que se você tiver muitos arquivos nesses diretórios, precisará aumentar helm-candidate-number-limit. Caso contrário, quando o número de candidatos atingir o limite, nenhum candidato será exibido e você não poderá selecionar candidatos invisíveis. Defina-o como número mais alto ou nilse não desejar esse limite.

O lado bom do Helm é que você pode selecionar interativamente os arquivos.

Tu Do
fonte
Eu acho que ele quer abri-los todos simultaneamente, não selecionar um deles.
Malabarba 15/10
11
@ Malabarba Você pode selecionar vários arquivos M-ausando helm-projectile-find-filee pressionar RET uma vez para abri-los todos usando o método listado.
Tu Do
Claro! Desculpe, perdi essa frase. Eu editei para tornar um pouco mais óbvio para idiotas como eu. Sinta-se livre para reverter se você não gosta ou se eu fiz algo errado.
Malabarba 15/10
@ Malabarba Thanks. Está mais claro agora.
Tu Do
4

Aqui estão duas possibilidades (alternativas):

  1. Em Dired, você pode incluir todos os subdiretórios que contêm arquivos nos quais deseja atuar, usando lsopções que incluem -Rou usando ipara incluir subdiretórios específicos. Se você usar a biblioteca Dired + , poderá usar * .(vinculado a diredp-mark/unmark-extension, para marcar todos os arquivos listados que possuem uma determinada extensão (como .h)). Em seguida, poderá usar F(vinculado a dired-do-find-marked-files) para abrir todos os arquivos marcados.

  2. Com a biblioteca Dired +, você pode atuar em todos os arquivos marcados e em todos os arquivos marcados nos subdiretórios marcados, definidos recursivamente, IOW, subdiretórios de subdiretórios, seus subdiretórios, etc.

    Para qualquer diretório marcado, se nenhum arquivo estiver marcado nesse diretório (ou seja, marcado em uma lista Dired para esse subdir), a ação estará em todos os seus arquivos.

    Há um número razoável de comandos para atuar em tais arquivos de diferentes maneiras (abertura, pesquisa etc.). Mas os arquivos para agir são determinados apenas dessa maneira; não há também a possibilidade de, digamos, inserir um padrão glob ou uma regexp para filtrar o conjunto.

    No entanto, se você usar os Sincelos da biblioteca junto com o Dired + , poderá usar M-+ C-F, ou seja, M-+ C-S-f(ao qual está vinculado icicle-visit-marked-file-of-content-recursive), para abrir um ou todos os arquivos que acabamos de descrever (ou seja, aqueles marcados ou em subdiretórios marcados, definidos recursivamente).

    Você pode usar regexps dinamicamente para filtrar os nomes dos arquivos (e / ou o conteúdo). Por exemplo, você pode, como você pede, abrir todos os arquivos que têm extensões .c, .cce .hnos subdirs marcados (com subdirs marcaram a ser tratados da mesma maneira, de forma recursiva).

Desenhou
fonte
3

O eshell lida com **/*a expansão glob no estilo zsh , portanto, uma abordagem é ativar o eshell no diretório correto e executarfor f in **/*cc **/*h { find-file $f}

Como alternativa, a função find-filesuporta caracteres curinga quando chamados de elisp. Aqui está um trecho útil da documentação para isso find-file:

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

Eu não conseguia descobrir como fazer isso funcionar com globbing no estilo zsh, mas pode ser uma boa opção.

Se todos esses arquivos estiverem em um projeto controlado por uma única fonte, o projétil pode ser uma abordagem diferente e melhor.

PS. Se você optar pelo eshell, sugiro vincular eshell-toggle-cduma chave para que você possa facilmente exibir um prompt do eshell no diretório do buffer que está editando.

shapr
fonte
Eu não acho que find-fileisso funcione recursivamente, que é a principal característica que eu estou procurando. Abrir um shell e digitar um comando parece muito trabalhoso, porque (eu acho) meu comando teria que ser algo como for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Ou é mais simples do que isso?
Nispio