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
, inc
i lib
, i teraz chcę, aby odwiedzić wszystkie pliki z rozszerzeniami .c
, .cc
oraz .h
w 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 helm
lub dired+
innych rozszerzeń, które pozwolą mi łatwiej nawigować po systemie plików.
Odpowiedzi:
Spróbuj tego:
Pozwala to wprowadzić argumenty określające, w jaki sposób Dired powinien wyświetlać pliki. Domyślnie napisane jest
-al
w linii poleceń. DodajR
do 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,
% m
aby 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
.emacs
pliku):Najprawdopodobniej ktoś już to umieścił w jakimś fajnym pakiecie ulepszeń Dired, ale fajnie jest też zrobić to sam;)
Cieszyć się!
źródło
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
,inc
ilib
. Możesz pobrać wszystkie pliki należące do tego katalogu na dwa sposoby:W wierszu polecenia Helm
helm-projectile-find-file
wprowadź 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\|
oznaczaor
. 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ąć,
RET
aby 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,nil
jeśli nie chcesz tego limitu.Zaletą Helm jest to, że możesz interaktywnie wybierać pliki.
źródło
M-a
pomocąhelm-projectile-find-file
i naciśnij jeden raz RET, aby je wszystkie otworzyć przy użyciu metody, którą wymieniłem.Oto dwie możliwości (alternatywy):
W Dired możesz dołączyć wszystkie podkatalogi zawierające pliki, na których chcesz działać, albo używając
ls
przełączników, które zawierają,-R
albo używająci
do włączenia określonych podkatalogów. Jeśli korzystasz z biblioteki Dired + , możesz użyć* .
(powiązana zdiredp-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 zdired-do-find-marked-files
), aby otworzyć wszystkie zaznaczone pliki.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ązanyicicle-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
,.cc
oraz.h
w oznakowanych podkatalogów (z zaznaczonymi subdirs są obsługiwane w ten sam sposób, rekursywnie).źródło
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-file
obsługuje symbole wieloznaczne po wywołaniu z elisp. Oto przydatny fragment z dokumentacji do tegofind-file
: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-cd
z kluczem, abyś mógł łatwo wyskakować monit eshell w katalogu edytowanego bufora.źródło
find-file
dział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?