Rekurencyjnie wyświetl listę wszystkich plików i podkatalogów

15

Czy istnieje sposób, ewentualnie za pomocą pakietu, rekurencyjne wyświetlanie wszystkich plików (ze ścieżkami) i podkatalogów (lub przynajmniej pustych podkatalogów, ponieważ ścieżki do niepustych można uzyskać ze ścieżek zawarte w nim pliki) bieżącego katalogu?

Najbliżej, jaką mogłem znaleźć, jest projectile-find-filefunkcja projectilepakietu (alternatywnie helm-projectile-find-filefunkcja helm-projectilepakietu), ale wydaje się, że nie jest w stanie wyświetlić pustych folderów. Ponadto wydaje się, że działa tylko z Git i innymi repozytoriami kontroli wersji, ale może istnieć obejście tego ograniczenia.

Evan Aad
źródło
2
nie jestem pewien, co próbujesz zrobić, ale [ten post na blogu] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) może zawierać to, czego potrzebujesz, lub możesz spróbować [ten] (ergoemacs.org/emacs/elisp_traverse_dir.html) jako starter.
theldoria
Co rozumiesz przez „listę”? Czy chcesz funkcji Emacs Lisp, które zwracają listę ciągów ze ścieżkami? Czy chcesz bufor zawierający ścieżki, powiedzmy, jeden na linię? Czy chcesz buforowany bufor ze wszystkimi plikami? (Ten ostatni jest łatwy, dodaj „-R” do przełączników ls w dired.)
Omar
@Omar: Muszę spełnić idealne wymagania: (1), że będzie to część Emacsa lub część pakietu, (2), że będzie działał z jednym helmlub ivy, tj. Że wyniki będą wyświetlane w buforze helmlub ivy. Jeśli nie można spełnić obu wymagań, to drugie jest dla mnie ważniejsze.
Evan Aad
1
To naprawdę dwa różne pytania. Ale OK, podałem odpowiedź dla każdego.
Drew

Odpowiedzi:

8

Zakładając, że używasz ivy, możesz użyć tej funkcji

    (defun fhd/counsel-everything ()
      "list everything recursively"
      (interactive)
      (let* ((cands (split-string
                     (shell-command-to-string "find .") "\n" t)))
        (ivy-read "File: " cands
                  :action #'find-file
                  :caller 'fhd/counsel-everything)))
fhdhsni
źródło
Dzięki. Co jeśli użyję helm?
Evan Aad
1
Przepraszam, nie wiem o tym helm. ivyjest dość lekki. Daj mu szansę.
fhdhsni
13

pliki-katalogowe-rekurencyjnie

(Myślę, że zostało to dodane w Emacs 25)

oto link do instrukcji: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Zwróć wszystkie pliki w katalogu, których nazwy pasują do wyrażenia regularnego. Ta funkcja rekurencyjnie przeszukuje określony katalog i jego podkatalogi w poszukiwaniu plików, których nazwy basenowe (tj. Bez wiodących katalogów) pasują do określonego wyrażenia regularnego, i zwraca listę bezwzględnych nazw plików pasujących plików (patrz bezwzględne nazwy plików) . Nazwy plików są zwracane w pierwszej kolejności według głębokości, co oznacza, że ​​pliki w niektórych podkatalogach są zwracane przed plikami w katalogu nadrzędnym. Ponadto pasujące pliki znalezione w każdym podkatalogu są sortowane alfabetycznie według ich basename. Domyślnie katalogi, których nazwy pasują do wyrażenia regularnego, są pomijane na liście, ale jeśli opcjonalny argument include-katalogi jest inny niż zero, są one uwzględniane.

Przykład

(directory-files-recursively default-directory "")
wvxvw
źródło
Nie znajduje pustych katalogów
fhdhsni
1
@fhdhsni zrobił spróbować ustawić include-directoriessię t? Pracuję nad Emacsem 24 i nie mogę tego teraz wypróbować, ale mogę to przetestować w domu za kilka godzin.
wvxvw
Mój błąd. Nie zrobiłem tego Możesz dołączyć to do swojej odpowiedzi.
fhdhsni
4

Ta odpowiedź zakłada, że ​​chcesz wyświetlić listę nazw plików i katalogów, zamiast uzyskiwać ich listę.

Nakazuje stosowanie standardowy Emacs find-dired, find-name-diredlub find-grep-dired. Znalezione nazwy plików i katalogów są wyświetlane w buforze trybu Dired. (Możesz wykorzystać całą moc Dired do pracy nad wynikami.)

Jeśli używasz biblioteki find-dired+.el, masz ulepszone wersje tych standardowych poleceń Emacsa, plush masz polecenie find-time-dired, które wyszukuje pliki, które są nowsze lub starsze niż określony znacznik czasu.

Rysował
źródło
find-diredjest dokładnie tym, czego szukam, ale czy jest sposób na wydrukowanie tylko nazwisk? Ponieważ w przeciwnym razie pojedyncza nazwa pliku zajmuje wiele wierszy bez powodu, ponieważ absolutnie nie dbam o rozmiar, datę ani uprawnienia plików. Próbowałem uruchomić (setcar find-ls-option "-printf '%p\n'")wcześniej find-dired, ale z jakiegoś powodu ten sposób nie chce otworzyć pliku po naciśnięciu klawisza Enter na elemencie.
Cześć Anioł
2
@ Hi-Angel: Bufor, w którym wyświetlane są wyniki, znajduje się w trybie Dired. Więc możesz po prostu nacisnąć, (aby włączyć lub wyłączyć wyświetlanie więcej niż nazw plików. Przez większość czasu zostaję wyłączony (brak szczegółów) i po prostu włączam go na krótko, gdy chcę sprawdzić niektóre szczegóły.
Drew
1

Zobacz https://github.com/technomancy/find-file-in-project

Istnieją polecenia do znalezienia pliku lub znalezienia katalogów. Ale nie jedno i drugie.

Jeśli chcesz tylko rekursywnie wyświetlić wszystkie podkatalogi i pliki w jednym buforze, w Emacsie wbudowane są dwa polecenia dla grup wiekowych:

  1. M-x find-dired. To zależy od narzędzia CLI find. W systemie Windows musisz zainstalować Cygwin lub MYSYS, który mafind

  2. M-x find-lisp-find-dired. Tak samo jak find-dirednapisane w Lisp. Więc nie ma zależności od stron trzecich. Poza tym może rozpoznać ustawienia regionalne po wyjęciu z pudełka. Ale jest wolniejszy niżfind-dired

Chen Bin
źródło
Mój przypadek użycia byłby taki sam, jak każdy, kto użyje polecenia powłoki UNIX lslub funkcji Emacsa find-file, z których oba zawierają zarówno pliki, jak i katalogi, w tym puste katalogi.
Evan Aad
Czy find-diredi find-lisp-find-diredrekurencyjnych w tym wykazie nie tylko zawartość bieżącego katalogu, ale również zawartość każdego z jego podkatalogów, Poddziałanie podkatalogów itp?
Evan Aad
Tak, rekurencyjnie
chen bin
1

Ta odpowiedź zakłada, że ​​chcesz uzyskać listę Lisp nazw plików i katalogów, zamiast wyświetlać ich listę.

Jeśli korzystasz z biblioteki Dired + , możesz użyć funkcji diredp-files-within. (Aby go użyć, nie musisz znajdować się w buforze Dired).

Działa to z każdą wersją Emacsa i jest bardziej ogólne niż directory-files-recursively.

  • Możesz przekazać mu listę plików i katalogów, a ona działa rekurencyjnie w każdym z nich.

  • Lub możesz przekazać mu funkcję, która zwraca taką listę.

    • Jeśli istnieje bufor Dired dla katalogu, który jest przetwarzany, wówczas funkcja jest wywoływana w tym buforze, aby zwrócić listę plików do uwzględnienia.

      Na przykład, jeśli funkcja jest, dired-get-marked-files wówczas uwzględniane są tylko zaznaczone pliki i podkatalogi.

  • Możesz przekazać predykat, który każdy plik lub katalog musi spełniać. Dopasowywanie wyrażeń regularnych jest oczywiście jednym z rodzajów orzeczeń.

  • Możesz powiedzieć, aby nie podążał za symbolicznymi linkami.

Rysował
źródło
0
(defun my-dir-list (source)
  ;;
  ;; Wydrukuj listę plików w bieżącym buforze
  ;;
  ;; Nie testowano, typ systemu: gnu
  ;; Testowane, typ systemu: windows-nt
  ;;
  (interaktywny „sDirectory:”)
  (niech ((n 0)
    (l-plik-katalog (i (źródło CD) (katalog-pliki-i-atrybuty „./”)))
    (dir-list '())
    (lista plików '())
    )
    (princ (format „% s \ n” katalog domyślny) (bieżący bufor))
    (podczas gdy l-plik-reż
      (if (nth 1 (car l-file-dir))
      (setq n (1+ n)
        dir-list (minus ((lambda (źródło))
                  (i (nie (string-prefix-p "." (car source))) source))
                (car l-file-dir)) lista dir)
        )
    (princ (format "% s \ n" (katalog domyślny concat
                      (i (ciąg pasujący "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-plik-katalog)))) (bieżący bufor))
    )
      (setq l-file-dir (cdr l-file-dir))
      )
    (while (caar dir-list)
      (setq dir-list (cdr dir-list))
      (Płyta CD "..")
      )
    )
  'dobrze
  )
Joe
źródło