Programlı olarak Dired buffer'a dosya ekle


10

Dosya adlarının (tam yol ile) bir listesi var ve bu dosya kümesini listeleyen bir Dired buffer oluşturmak istiyorum. Bunu nasıl yapabilirim?

Dosya adları listesinden bir Dired buffer'ı nasıl oluştururum?

Harici bağımlılıklar kullanmadan.


Lütfen açıkla. Listenizdeki dizeler a) oluşturmak istediğiniz dosyaların adları mı, yoksa b) dosyanın içeriği mi (mutlak bir yola sahip olduğunuz şey)?
Dan

@Dan Mutlak yolları olan dosya adlarının listesi. Sadece dosya isimleri.
Tu Do

1
Sizi doğru anlarsam, sadece (find-file your-directory-path)ilgili diredarabelleği almak için kullanabilirsiniz (örn., Dizininizi bir tamponda (find-file "/tmp/")açar ). tmpdired
Dan

1
Sorunuzu bu yorumlarda söylediklerinize dayanarak düzenledim. Eğer yanlış anladıysam geri dönmekten çekinmeyin.
Malabarba

3
Eğer elisp dosya nesneleri hakkında çok kısa bir cevap ile, tamamen farklı bir soru sormak istiyorsanız: herhangi bir yoktur. :-)
Malabarba

Yanıtlar:


20

C-h f diredsize cevabı söyler. Sadece geçmek diredgibi DIRNAME, argüman onun arabası gibi istediğiniz dired tampon adı (herhangi bir dize) vardır ve dosya adları listesinden cdr gibi tampon listelenen istediğiniz bir liste. Genellikle, mutlak dosya adları kullanmak istersiniz. Örneğin:

(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

Platformunuza bağlı olarak, mevcut olmayan dosya ve dizinlerin adları yok sayılabilir (listelenmez) veya bir hata oluşturabilir. İlki, ls-lisp.el(örneğin MS Windows) kullanıyorsanız oluşur. İsterseniz ls-lispherhangi bir platformda kullanımını zorlayabilirsiniz (ancak ls-lispdaha az lsseçeneğe sahiptir), bunu yaparak:

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

Dired + ( dired+.el) kütüphanesini kullanıyorsanız , listelenecek dosyaları ve dizinleri etkileşimli olarak seçebilirsiniz: sadece diredpozitif olmayan bir önek argümanı verin (yani, <= 0). Ardından, listelenmesini istediğiniz dizinler ve dosya adları için art arda istenir. *Eşleşen dosyaları ve dizinleri dahil etmek için dosya adı joker karakterlerini (örn . Globbing için) kullanabilirsiniz. C-gGirişi sonlandırmak için kullanın .

Başka bir deyişle, Dired buffer tek bir dizini listelemek yerine, farklı dizin ağaçlarına ait olabilecek herhangi bir sayıda dizin ve dosya adını listeleyebilir.

(Negatif olmayan bir önek arg (yani, = = 0) sizden lslisteleme anahtarlarını ister . Böylece sıfır önek argümanı hem anahtarları hem de dosyaları / dizinleri listelemek için sizi uyarır: önce lsanahtarları ve sonra dosyaları / dizinleri.)


Bunu komut kullanarak değil, Elisp'te yapmak istiyorum. Ben sadece (insert ...)bir arabellek metin eklemek için nasıl benzer, bir dosya adı (tam yol ile) Dired arabellek girişine çevirmek basit bir kod snippet'i istiyorum .
Tu Do

1
@tudo: diredbir elisp işlevidir. Sadece bunu değerlendirin: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))@Drew'un yazdığı gibi bu dosyaları içeren bir direkli tampon alırsınız.
rekado

@rekado. teşekkürler. Şimdi cevabı doğru bir şekilde tekrar okuyorum. Sadece senin gibi bir Elisp kod snippet'i görmek istiyorum ve Drew bana göz attığımda bana bir kullanıcı komutu cevabı verdiğini düşündüm.
Tu Do

@Drew Lütfen rekado örneğini ekleyin. Cevabınız için teşekkürler.
Tu Do

Başlangıçta dosya setlerini gördüğümde bu kadar basit olacağını düşünmemiştim . Dired'in düzgün çalışması için uygun dosya nesnelerini tanımasını sağlamamız gerektiğini düşündüm.
Tu Do

2

Burada, dosya listesi arabellekte bir satır olacak şekilde bir arabellek içindeyse bunu yapmak için bir komut verilmiştir.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.