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
, inc
e lib
, e agora eu quero visitar todos os arquivos com as extensões .c
, .cc
e .h
dentro 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 helm
ou dired+
outras extensões que me permitam navegar mais facilmente no meu sistema de arquivos.
Respostas:
Tente o seguinte:
Isso permite que você insira argumentos sobre como o Dired deve listar arquivos. Por padrão, ele diz
-al
no prompt. AdicioneR
a 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
% m
para 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
.emacs
arquivo):Provavelmente alguém já incluiu isso em algum pacote de aprimoramento Dired, mas também é divertido fazer você mesmo;)
Desfrutar!
fonte
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
, elib
. 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êmhst/
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\|
significaor
. 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
RET
para 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 ounil
se não desejar esse limite.O lado bom do Helm é que você pode selecionar interativamente os arquivos.
fonte
M-a
usandohelm-projectile-find-file
e pressionar RET uma vez para abri-los todos usando o método listado.Aqui estão duas possibilidades (alternativas):
Em Dired, você pode incluir todos os subdiretórios que contêm arquivos nos quais deseja atuar, usando
ls
opções que incluem-R
ou usandoi
para incluir subdiretórios específicos. Se você usar a biblioteca Dired + , poderá usar* .
(vinculado adiredp-mark/unmark-extension
, para marcar todos os arquivos listados que possuem uma determinada extensão (como.h
)). Em seguida, poderá usarF
(vinculado adired-do-find-marked-files
) para abrir todos os arquivos marcados.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á vinculadoicicle-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
,.cc
e.h
nos subdirs marcados (com subdirs marcaram a ser tratados da mesma maneira, de forma recursiva).fonte
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-file
suporta caracteres curinga quando chamados de elisp. Aqui está um trecho útil da documentação para issofind-file
: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-cd
uma chave para que você possa facilmente exibir um prompt do eshell no diretório do buffer que está editando.fonte
find-file
isso 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 comofor d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }
Ou é mais simples do que isso?