İşaretli dizinlerde normal ifade ile eşleşen dosyaları yinelemeli olarak açma


9

Genel olarak, dosya adının verilen bir normal ifadeyle eşleştiği belirli bir dizinler dizisi (ve alt dizinleri) içindeki tüm dosyaları açabilmek istiyorum.

Örneğin

  /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

Ben dizinleri işaretlediyseniz hst, incve lib, ve şimdi uzantılı tüm dosyaları ziyaret etmek istiyorum .c, .ccve .ho üç dizinleri ve bunların alt dizinleri içinde.

Açmadan önce açtığım her şeyi görebilseydim daha iyi olurdu. Dired buffer aramamla eşleşen tüm dosyaları gösterecek şekilde güncellenmişse ve bunların hepsi vurgulanmışsa, aramamın beklediğimden döndüğünden emin olmak için bir sağlık kontrolü yapabilirim.

Aynı şeyi kullanarak helmveya dired+dosya sistemimde daha kolay gezinmemi sağlayacak başka uzantıları kullanarak önerilere açığım .


Mathias ya da Drew questoin'inizi yanıtladı mı? Yoksa farklı bir şey mi arıyorsunuz?
Malabarba

Yanıtlar:


14

Bunu dene:

C-u C-x d

Bu, Dired'in dosyaları nasıl listelemesi gerektiğine ilişkin argümanlar girelim. Varsayılan -alolarak istemde söyler . Buna ek Rolarak, ile biten -alR. Tür RET.

Bir dizin seçin / yazın ve düğmesine basın RET.

Bu, seçtiğiniz dizinden ve altındaki tüm dizinleri özyinelemeli olarak açacaktır.

Buradan, % mbelirli bir dosya adı deseniyle eşleşen tüm dosyaları işaretlemek için yazın . Ben de sık sık sonra ilgilendiğim tüm dosyaları öldürmek (gizlemek) için yazın tve sonra k. tTüm dosyaları işaretlemek için tekrar yazın.

Bildiğim kadarıyla dosyaları açarken, bunu yapmanın standart bir yolu olduğunu düşünmüyorum, ancak bunu yapmak için kolayca yeni bir komut tanımlayabilirsiniz ( .emacsdosyanıza yerleştirin):

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

Büyük olasılıkla birileri bunu bazı güzel Dired geliştirme paketine ekledi, ancak bunu kendiniz de yapmak eğlenceli;)

Zevk almak!


7

Bunu helm-projectile-find-file ile kolayca yapabilirsiniz . Mermi, göreli yolu ile her dosyayı izlediğinden, her şeye kolayca daraltabilirsiniz. Örneğinizi kullanalım. Senin durumda, açık dosyalar istiyorum hst, incve lib. Bu dizine ait tüm dosyaları iki yolla alabilirsiniz:

  • Helm istemi alanına helm-projectile-find-file, her dizini ve o dizine daraltılmış işaretli dosyaları girin. Örneğin, önce giriyorum ^hst/( hst/her adayın başlangıcında bulunan tüm dosyaları daraltır ). Tüm dosyaları işaretleM-a , diğer iki dizindeki dosyalar için benzer bir şey yap.

  • Veya, olabilir bu modeli kullanarak tüm dizinleri dosyaları almak : ^hst/\|^inc\|^lib. Sonuçta Helm regex'i kabul ediyor. Normal \|ifade anlamına gelir or. Her şeyi tek seferde seçmek istiyorsanız bunu yapın.

Bunlardan herhangi biriyle, açmak istediğiniz tüm dosyaları işaretlediniz. Sonra REThepsini açmak için tuşuna basın .

Bu dizinlerde çok sayıda dosyanız varsa, artırmanız gerektiğini lütfen unutmayın helm-candidate-number-limit. Aksi takdirde, aday sayısı sınıra ulaştığında, başka aday gösterilmez ve görünmez adayları seçemezsiniz. Daha yüksek bir sayıya ayarlayın veya nilbu sınırı istemiyorsanız olarak ayarlayın .

Helm ile ilgili iyi bir şey, dosyaları etkileşimli olarak seçebilmenizdir.


Bence hepsini aynı anda açmak istiyor, birini seçmiyor.
Malabarba

1
@Malabarba düğmesini M-akullanarak birden fazla dosya seçebilir helm-projectile-find-fileve listelediğim yöntemi kullanarak tümünü açmak için RET düğmesine bir kez basabilirsiniz.
Tu Do

Elbette! Üzgünüm, bu cümleyi kaçırdım. Benim gibi aptallar için biraz daha açık hale getirmek için düzenledim. Eğer beğenmezsen ya da yanlış bir şey yaptıysam geri dönebilirsin.
Malabarba

@Malabarba Teşekkürler. Şimdi daha açık.
Tu Do

4

İşte iki olasılık (alternatifler):

  1. Dired'de, üzerinde işlem yapmak istediğiniz dosyaları içeren tüm alt dizinleri, ya lsdahil anahtarları kullanarak -Rveya ibelirli alt dizinleri dahil etmek için kullanabilirsiniz. Eğer kütüphane kullanırsanız dired + o zaman kullanabilirsiniz * .bağlı ( diredp-mark/unmark-extensionörneğin belirli bir uzantıya (var listelenen tüm dosyaları işaretlemek için, .h). Sonra kullanabilirsiniz F(bağlı dired-do-find-marked-filesişaretlenmiş tüm dosyaları açmak için).

  2. Dired + kitaplığıyla , yinelenen, IOW, alt dizinlerin alt dizinleri, alt dizinleri, vb. Olarak tanımlanan işaretli alt dizinlerdeki tüm işaretli dosyalar ve işaretli dosyaların tümü üzerinde işlem yapabilirsiniz.

    İşaretli herhangi bir dizin için, o dizinde hiçbir dosya işaretlenmezse (yani, bu alt dizin için bir Dired listesinde işaretlenmişse), eylem tüm dosyalarında olur.

    Bu tür dosyalar üzerinde farklı şekillerde (açma, arama vb.) İşlem yapmak için çok sayıda komut vardır. Ancak üzerinde işlem yapılacak dosyalar sadece bu şekilde belirlenir; ayrıca, kümeyi filtrelemek için bir glob paterni veya regexp girme olasılığı da yoktur.

    Eğer kütüphane kullanma Ancak, Icicles birlikte dired + o zaman kullanabilirsiniz M-+ C-F, yani M-+ C-S-f(bağlı olduğu icicle-visit-marked-file-of-content-recursive), sadece açıklanan dosyaların herhangi birini veya tümünü açmak için (yani o işaretli veya işaretli subdirs içinde, yinelemeli tanımlanmıştır).

    Dosya adlarını (ve / veya dosya içeriğini) filtrelemek için anında regexps kullanabilirsiniz. Örneğin, Sen, sen istemek gibi uzantılara sahip dosyaların hepsi açabilir .c, .ccve .hişaretli subdirs içinde (işaretli subdirs ile yinelemeli, aynı şekilde yürütüyor).


3

eshell zsh tarzı **/*glob genişlemesini işler , bu yüzden bir yaklaşım eshell'i doğru dizinde çalıştırmak ve çalıştırmaktırfor f in **/*cc **/*h { find-file $f}

Alternatif olarak, işlev find-fileelisp'den çağrıldığında joker karakterleri destekler. Bunun için belgelerden yararlı bir snippet 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.

Bunu zsh tarzı globbing ile nasıl çalıştıracağımı anlayamadım, ancak iyi bir seçenek olabilir.

Tüm bu dosyalar tek bir kaynak kontrollü projedeyse, mermi farklı ve daha iyi bir yaklaşım olabilir.

PS. Eğer eshell ile giderseniz, eshell-toggle-cdbir tuşa bağlanmanızı öneririm, böylece düzenlediğiniz arabellek dizininde bir eshell istemini kolayca açabilirsiniz.


Bunun find-fileözyineli olarak çalışacağını düşünmüyorum , bu benim peşim olduğum ana özellik. Bir kabuk açmak ve bir komut yazmak çok fazla iş gibi görünüyor, çünkü (sanırım) komutumun böyle bir şey olması gerekirdi for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Veya bundan daha basit mi?
nispio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.