Programowo wstaw pliki do bufora Dired

10

Mam listę nazw plików (z pełną ścieżką) i chcę utworzyć bufor Dired z listą tego zestawu plików. Jak miałbym to zrobić?

Jak utworzyć bufor Dired z listy nazw plików?

Bez korzystania z zewnętrznych zależności.

Do zrobienia
źródło
Proszę o wyjaśnienie. Czy ciągi na liście a) nazwy plików, które chcesz utworzyć, lub b) zawartość pliku (rzecz, dla której masz bezwzględną ścieżkę)?
Dan
@Dan Lista nazw plików ze ścieżkami bezwzględnymi. Tylko nazwy plików.
Tu Do
1
Jeśli dobrze cię rozumiem, możesz po prostu użyć (find-file your-directory-path)odpowiedniego diredbufora (np. (find-file "/tmp/")Otworzy twój tmpkatalog w diredbuforze).
Dan
1
Zredagowałem twoje pytanie na podstawie tego, co powiedziałeś w tych komentarzach. Zapraszam do wycofania, jeśli popełniłem błąd.
Malabarba
3
Jeśli chcesz zapytać o obiekty plików w elisp, jest to zupełnie inne pytanie, z bardzo krótką odpowiedzią: nie ma żadnych. :-)
Malabarba

Odpowiedzi:

20

C-h f diredmówi ci odpowiedź. Po prostu przekaż diredjako DIRNAMEargument listę, która ma jako samochód wybraną nazwę bufora Dired (dowolny ciąg), a jako cdr listę nazw plików, które chcesz umieścić w buforze. Zasadniczo chcesz używać bezwzględnych nazw plików. Na przykład:

(dired (list "My Dired Buffer Name*"     ; The Dired buffer name
             "/usr/foo/file1.el"         ; First file
             "/usr/bar/toto/some-file.c" ; Second file
             "/whatever/directory/"      ; Third is a directory
             "/a/file/somewhere.zzz"))   ; Fourth

W zależności od platformy nazwy wszelkich nieistniejących plików i katalogów, które wprowadzisz, mogą zostać zignorowane (niewymienione na liście) lub spowodować błąd. To pierwsze dzieje się, jeśli używasz ls-lisp.el(np. MS Windows). Możesz wymusić użycie ls-lispna dowolnej platformie, jeśli chcesz (ale ls-lispma mniej lsopcji), wykonując następujące czynności:

(setq ls-lisp-use-insert-directory-program nil)
(require 'ls-lisp)

Jeśli używasz biblioteki Dired + ( dired+.el), możesz interaktywnie wybierać pliki i katalogi do wyświetlenia: po prostu podaj dirednie dodatni argument przedrostka (tj. <= 0). Następnie wielokrotnie pojawia się monit o podanie katalogów i nazw plików, które chcesz umieścić na liście. Możesz użyć symboli wieloznacznych nazwy pliku (tj. *Do globowania), aby dołączyć pasujące pliki i katalogi. Użyj, C-gaby zakończyć wprowadzanie.

Innymi słowy, zamiast wyświetlać pojedynczy katalog, bufor Dired może wyświetlać dowolną liczbę katalogów i nazw plików, które mogą nawet należeć do różnych drzew katalogów.

(Argument nieujemnego prefiksu arg (tj.> = 0) monituje o lsprzełączniki list. Tak więc arg prefiks zero wyświetla monit o podanie zarówno przełączników, jak i plików / katalogów: najpierw lsprzełączniki, a następnie pliki / katalogi.)

Rysował
źródło
Cóż, chcę to zrobić w Elisp, nie używając polecenia. Chcę tylko prostego fragmentu kodu, który zamienia nazwę pliku (z pełną ścieżką) we wpis w buforze Dired, podobnie jak (insert ...)w przypadku wstawiania tekstu do bufora.
Tu Do
1
@tudo: diredto funkcja elisp. Po prostu oceń to: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))i dostajesz bufor buforowy zawierający te pliki, jak napisał @Drew.
rekado
@rekado .Dziękujemy. Teraz ponownie czytam odpowiedź poprawnie, tak jak powiedziałeś. Chcę tylko zobaczyć fragment kodu Elisp, taki jak twój, i pomyślałem, że Drew dał mi odpowiedź użytkownika, gdy ją zobaczyłem.
Tu Do
@Drew Dodaj przykład rekado. Dzięki za odpowiedź.
Tu Do
Początkowo nie sądziłem, że będzie to takie proste, gdy zobaczę zestawy plików . Pomyślałem, że musimy sprawić, by Dired rozpoznał odpowiednie obiekty plików, aby działało poprawnie.
Tu Do
2

Oto polecenie, aby to zrobić, gdy lista plików znajduje się w buforze, z jednym plikiem w wierszu.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
killdash9
źródło