Rekurencyjnie otwieraj pliki pasujące do wyrażenia regularnego w zaznaczonych katalogach

9

Ogólnie rzecz biorąc, chciałbym móc otwierać wszystkie pliki w ramach danego zestawu katalogów (i ich podkatalogów), w których nazwa pliku odpowiada podanemu wyrażeniu regularnemu.

Na przykład

  /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

Mam zaznaczone katalogi hst, inci lib, i teraz chcę, aby odwiedzić wszystkie pliki z rozszerzeniami .c, .ccoraz .hw ciągu tych trzech katalogów i ich podkatalogów.

Byłoby jeszcze lepiej, gdybym mógł zobaczyć wszystko, co otwieram, zanim je otworzę. Jeśli bufor z diodami został zaktualizowany, aby pokazać mi wszystkie pliki, które pasowały do ​​mojego wyszukiwania, a wszystkie z nich zostały wyróżnione, mógłbym przeprowadzić kontrolę poprawności, aby upewnić się, że moje wyszukiwanie zwróciło to, czego oczekiwałem.

Jestem otwarty na sugestie, aby zrobić to samo przy użyciu helmlub dired+innych rozszerzeń, które pozwolą mi łatwiej nawigować po systemie plików.

nispio
źródło
Czy Mathias lub Drew odpowiedział na twoje questoin? A może szukasz czegoś innego?
Malabarba

Odpowiedzi:

14

Spróbuj tego:

C-u C-x d

Pozwala to wprowadzić argumenty określające, w jaki sposób Dired powinien wyświetlać pliki. Domyślnie napisane jest -alw linii poleceń. Dodaj Rdo tego, kończąc na -alR. Wpisz RET.

Wybierz / wpisz katalog, a następnie naciśnij RET.

Spowoduje to rekurencyjne otwarcie wszystkich katalogów z tego, który wybierzesz i poniżej.

W tym miejscu wpisz, % maby oznaczyć wszystkie pliki pasujące do określonego wzorca nazwy pliku. Często też piszę, ta następnie kzabijam (ukrywam) wszystkie pliki, które mnie nie interesują. Wpisz tponownie, aby zaznaczyć wszystkie pliki.

Jeśli chodzi o faktyczne otwieranie plików, nie sądzę, że istnieje standardowy sposób, aby to zrobić, ale możesz łatwo zdefiniować nowe polecenie, aby to zrobić (umieść go w .emacspliku):

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

Najprawdopodobniej ktoś już to umieścił w jakimś fajnym pakiecie ulepszeń Dired, ale fajnie jest też zrobić to sam;)

Cieszyć się!

Mathias Dahl
źródło
7

Możesz to łatwo zrobić za pomocą pliku steru-znalezienia pocisku . Ponieważ Projectile śledzi każdy plik z jego względną ścieżką, możesz łatwo zawęzić do dowolnego pliku. Użyjmy twojego przykładu. W twoim przypadku, chcesz otwierać pliki w hst, inci lib. Możesz pobrać wszystkie pliki należące do tego katalogu na dwa sposoby:

  • W wierszu polecenia Helm helm-projectile-find-filewprowadź każdy katalog i zaznaczone pliki zawężone do tego katalogu. Na przykład najpierw wpisuję ^hst/(co zawęża do wszystkich plików, które zawierają hst/na początku każdego kandydata). Oznacz wszystkie pliki za pomocąM-a , zrób coś podobnego dla plików w pozostałych dwóch katalogach.

  • Lub można pobierać pliki we wszystkich katalogach za pomocą tego wzoru : ^hst/\|^inc\|^lib. W końcu Helm akceptuje wyrażenia regularne. Wyrażenie regularne \|oznacza or. Zrób to, jeśli chcesz zaznaczyć wszystko za jednym razem.

Za pomocą jednego z nich zaznaczysz wszystkie pliki, które chcesz otworzyć. Następnie wystarczy nacisnąć, RETaby otworzyć je wszystkie.

Pamiętaj, że jeśli masz wiele plików w tych katalogach, musisz zwiększyć helm-candidate-number-limit. W przeciwnym razie, gdy liczba kandydatów przekroczy limit, nie będzie więcej wyświetlanych kandydatów i nie będzie można wybrać niewidocznych kandydatów. Ustaw wyższą liczbę lub ustaw, niljeśli nie chcesz tego limitu.

Zaletą Helm jest to, że możesz interaktywnie wybierać pliki.

Do zrobienia
źródło
Myślę, że chce otworzyć je wszystkie jednocześnie, a nie wybrać jedno z nich.
Malabarba
1
@Malabarba Możesz wybrać wiele plików za M-apomocą helm-projectile-find-filei naciśnij jeden raz RET, aby je wszystkie otworzyć przy użyciu metody, którą wymieniłem.
Tu Do
Oczywiście! Przepraszam, przegapiłem to zdanie. Redagowałem, aby było to bardziej oczywiste dla idiotów takich jak ja. Zapraszam do wycofania, jeśli ci się nie podoba lub jeśli zrobiłem coś złego.
Malabarba
@Malabarba Thanks. Teraz jest lepiej.
Tu Do
4

Oto dwie możliwości (alternatywy):

  1. W Dired możesz dołączyć wszystkie podkatalogi zawierające pliki, na których chcesz działać, albo używając lsprzełączników, które zawierają, -Ralbo używając ido włączenia określonych podkatalogów. Jeśli korzystasz z biblioteki Dired + , możesz użyć * .(powiązana z diredp-mark/unmark-extension, aby zaznaczyć wszystkie wymienione pliki, które mają dane rozszerzenie (takie jak .h). Następnie możesz użyć F(powiązana z dired-do-find-marked-files), aby otworzyć wszystkie zaznaczone pliki.

  2. Dzięki bibliotece Dired + możesz działać na wszystkich zaznaczonych plikach i wszystkich zaznaczonych plikach w zaznaczonych podkatalogach, zdefiniowanych rekurencyjnie, IOW, podkatalogach podkatalogów, ich podkatalogach itp.

    W przypadku dowolnego zaznaczonego katalogu, jeśli żadne pliki nie są zaznaczone w tym katalogu (tj. Oznaczone na liście Dired dla tego podkatalogu), akcja jest wykonywana na wszystkich jego plikach.

    Istnieje spora liczba poleceń do działania na takich plikach na różne sposoby (otwieranie, wyszukiwanie itp.). Ale pliki, na których należy działać, są określane tylko w ten sposób; nie ma również możliwości, powiedzmy, wprowadzenia wzorca globalnego lub wyrażenia regularnego w celu przefiltrowania zestawu.

    Jeśli jednak korzystasz z biblioteki Icicles razem z Dired + , możesz użyć M-+ C-F, tj. M-+ C-S-f(Który jest związany icicle-visit-marked-file-of-content-recursive), aby otworzyć dowolny lub wszystkie pliki właśnie opisane (tj. Te oznaczone lub w zaznaczonych podkatalogach, zdefiniowane rekurencyjnie).

    Możesz użyć wyrażeń regularnych w locie, aby filtrować nazwy plików (i / lub zawartość pliku). Na przykład, można, jak poprosić, otwórz wszystkie pliki, które mają rozszerzenia .c, .ccoraz .hw oznakowanych podkatalogów (z zaznaczonymi subdirs są obsługiwane w ten sam sposób, rekursywnie).

Rysował
źródło
3

eshell obsługuje **/*ekspansję globalną w stylu zsh , więc jednym z podejść jest uruchomienie eshell w odpowiednim katalogu i uruchomieniefor f in **/*cc **/*h { find-file $f}

Alternatywnie funkcja find-fileobsługuje symbole wieloznaczne po wywołaniu z elisp. Oto przydatny fragment z dokumentacji do tego 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.

Nie mogłem wymyślić, jak to zrobić, aby działało z globowaniem w stylu zsh, ale może to być dobra opcja.

Jeśli wszystkie te pliki są w jednym projekcie kontrolowanym przez źródło, pocisk może być innym i lepszym podejściem.

PS. Jeśli korzystasz z eshell, sugerowałbym powiązanie eshell-toggle-cdz kluczem, abyś mógł łatwo wyskakować monit eshell w katalogu edytowanego bufora.

shapr
źródło
Nie sądzę, żeby find-filedziałało rekurencyjnie, co jest główną cechą, o którą zabiegam. Otwieranie powłoki i pisanie polecenia wydaje się zbyt dużym nakładem pracy, ponieważ (tak sądzę) moje polecenie musiałoby wyglądać podobnie. for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Czy to jest prostsze?
nispio