Jeśli to pytanie jest tak proste, jak się wydaje, wystarczy directory-files.
Jordon Biondo
@JordonBiondo Dobrze wiedzieć o innej bardziej ogólnej funkcji. Pierwotnie zamierzałem używać with-current-bufferbufora Dired, aby uzyskać listę plików lub oznaczonych plików. Aby wyświetlić listę wszystkich plików, mogę teraz użyć directory-files.
Tu Do
@JordonBiondo Próbowałem jeszcze raz. Twoja metoda działa tylko wtedy, gdy mamy „właściwy” bufor Dired. Jeśli mamy niestandardowy bufor Dired wstawiany z dowolnymi plikami z różnych katalogów, directory-filesnie ma takiej opcji.
Tu Do
Odpowiedzi:
7
Manipulowanie znakami wydaje się niepotrzebne i być może problematyczne.
Oczywiście istnieje funkcjonalność w obrębie dired do robienia takich rzeczy (choć nie jest to dobrze udokumentowane). Oto proste podejście:
;; Silence compile-time warning:
(declare-function dired-map-dired-file-lines "dired-aux")
(defun my-dired-files ()
"Return a list of files (only) in the current dired buffer."
(eval-when-compile (require 'cl-lib))
(require 'dired-aux)
(let (flist)
(cl-flet ((fpush (fname) (push fname flist)))
(dired-map-dired-file-lines #'fpush))
(nreverse flist)))
Edytować:
W komentarzach mówisz, że chcesz, aby powstała lista zawierała ścieżki katalogu, a także ścieżki plików.
dired-map-dired-file-lineswyraźnie wyklucza katalogi i nie ma możliwości ich włączenia; ale łatwo jest zdefiniować funkcję, która działa, po prostu kopiując oryginał i pomijając niechciany test:
(defun my-dired-map-over-files-and-dirs (fun)
"Perform FUN with point at the end of each file or directory line.
FUN takes one argument, the absolute filename."
(save-excursion
(let (file buffer-read-only)
(goto-char (point-min))
(while (not (eobp))
(save-excursion
(and (not (eolp))
(setq file (dired-get-filename nil t)) ; nil on non-file
(progn (end-of-line)
(funcall fun file))))
(forward-line 1)))))
Po prostu użyj tego zamiast dired-map-dired-file-linesfunkcji początkowej. Następnie możesz również wykluczyć declare-functionpołączenie.
Można oczywiście zmodyfikować tę nową funkcję, aby bezpośrednio utworzyć żądaną listę, zamiast wywoływać funkcję, aby to zrobić. Wydaje mi się, że bardziej ogólne podejście jest dobre w praktyce, ale może wolisz pomysł zawinięcia tego w jedną funkcję.
Czy istnieje wersja inna niż CL? Lubię CL, ale nie jestem w stanie używać zależności CL w pocisku.
Tu Do
cl-fletpo prostu definiuje funkcję. Sprawia, że kod jest czystszy, ale wciąż jest tylko funkcją, więc zdefiniuj ją, jednak musisz. Lub nie używaj go dired-map-dired-file-lineswcale, zamiast tego powielaj i modyfikuj jego kod w razie potrzeby.
phils
masz rację. Przełączanie znaków usuwa stare znaki, co jest problematyczne. Uważam, że twoja odpowiedź jest prawidłowa.
Tu Do
Twoje rozwiązanie wydaje się pobierać tylko pliki, ale nie ma katalogu. Zaktualizuj go, jeśli to możliwe.
Tu Do
Tak, właśnie zmodyfikowałem, aby się dired-get-filenamerozstać, (dired-get-filename t t)aby uzyskać wszystko.
Tu Do
6
Nie wiem, czy jest jedna funkcja, która to robi, ale może to działać dla Ciebie:
directory-files
.with-current-buffer
bufora Dired, aby uzyskać listę plików lub oznaczonych plików. Aby wyświetlić listę wszystkich plików, mogę teraz użyćdirectory-files
.directory-files
nie ma takiej opcji.Odpowiedzi:
Manipulowanie znakami wydaje się niepotrzebne i być może problematyczne.
Oczywiście istnieje funkcjonalność w obrębie dired do robienia takich rzeczy (choć nie jest to dobrze udokumentowane). Oto proste podejście:
Edytować:
W komentarzach mówisz, że chcesz, aby powstała lista zawierała ścieżki katalogu, a także ścieżki plików.
dired-map-dired-file-lines
wyraźnie wyklucza katalogi i nie ma możliwości ich włączenia; ale łatwo jest zdefiniować funkcję, która działa, po prostu kopiując oryginał i pomijając niechciany test:Po prostu użyj tego zamiast
dired-map-dired-file-lines
funkcji początkowej. Następnie możesz również wykluczyćdeclare-function
połączenie.Można oczywiście zmodyfikować tę nową funkcję, aby bezpośrednio utworzyć żądaną listę, zamiast wywoływać funkcję, aby to zrobić. Wydaje mi się, że bardziej ogólne podejście jest dobre w praktyce, ale może wolisz pomysł zawinięcia tego w jedną funkcję.
źródło
cl-flet
po prostu definiuje funkcję. Sprawia, że kod jest czystszy, ale wciąż jest tylko funkcją, więc zdefiniuj ją, jednak musisz. Lub nie używaj godired-map-dired-file-lines
wcale, zamiast tego powielaj i modyfikuj jego kod w razie potrzeby.dired-get-filename
rozstać,(dired-get-filename t t)
aby uzyskać wszystko.Nie wiem, czy jest jedna funkcja, która to robi, ale może to działać dla Ciebie:
Czasami możesz to uprościć:
źródło
Oprócz odpowiedzi @ abo-abo, która mówi, jak uzyskać listę nazw plików (i katalogów):
W zależności od tego, czego chcesz, możesz alternatywnie użyć
dired-copy-filename-as-kill
(związany zw
) zamiastdired-get-marked-files
.Umieszcza nazwy plików w jednym ciągu oddzielonym spacjami i przekazuje ten ciąg do pliku
kill-ring
.(Separacja spacji oznacza oczywiście, że nie jest to tak pomocne, gdy niektóre nazwy plików zawierają spacje. ;-))
źródło