Elisp ile mevcut Dired arabellekteki tüm dosya adlarını alın


10

Başlıktan da anlaşılacağı gibi, Elisp kullanarak bir Dired buffer içindeki tüm dosya girişlerini nasıl alabilirim?


1
Bu soru göründüğü kadar basitse, tek ihtiyacınız olan şey directory-files.
Jordon Biondo

@JordonBiondo Başka bir genel fonksiyon bilmek güzel. Başlangıçta with-current-bufferdosyaların veya işaretli dosyaların bir listesini almak için bir Dired buffer kullanmak istedim. Tüm dosyaların bir listesi için artık kullanabilirim directory-files.
Tu Do

@JordonBiondo Tekrar denedim. Metodunuz sadece "uygun" Dired buffer'ımız olduğunda çalışır. Farklı dizinlerden rastgele dosyalar ile eklenen özel Dired buffer'ımız varsa directory-files, bu bir seçenek değildir.
Tu Do

Yanıtlar:


7

İşaretleri değiştirmek gereksiz ve belki de sorunlu görünüyor.

Açıkçası bu tür bir şey yapmak için yönetilen işlevsellik vardır (iyi belgelenmiş olmasa da). İşte basit bir yaklaşım:

;; 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)))

Düzenle:

Yorumlarda, sonuç listesinin dosya yollarının yanı sıra dizin yollarını da içermesini istediğinizi söylersiniz.

dired-map-dired-file-linesdizinleri açıkça hariç tutar ve bunları dahil etme seçeneği yoktur; ancak orijinali kopyalayarak ve istenmeyen testi atlayarak bir işlevi tanımlamak kolaydır:

(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)))))

Bunu dired-map-dired-file-linesilk işlev yerine kullanın. Daha sonra declare-functionaramayı da hariç tutabilirsiniz .

Elbette, bunu yapmak için bir işlev çağırmak yerine, istenen listeyi doğrudan oluşturmak için bu yeni işlevi daha fazla değiştirebilirsiniz. Uygulamada daha genel yaklaşımın iyi olduğunu düşünüyorum, ancak hepsini tek bir işleve sarma fikrini tercih edebilirsiniz.


CL olmayan sürüm var mı? CL'yi seviyorum, ancak Projectile'da CL bağımlılığını kullanamıyorum.
Tu Do

cl-fletsadece bir işlevi tanımlar. Kodu daha temiz hale getirir, ancak yine de sadece bir işlevdir, bu yüzden ihtiyacınız olanı tanımlayın. Ya da hiç kullanmayın dired-map-dired-file-linesve bunun yerine kodunu gerektiği gibi çoğaltın ve değiştirin.
phils

Haklısın. İşaretleri değiştirmek, sorunlu olan eski işaretleri temizler. Cevabınızı doğru buluyorum.
Tu Do

çözümünüz sadece dosyaları alıyor gibi görünüyor, dizin yok. Lütfen mümkün olduğunda güncelleyin.
Tu Do

Evet, sadece modifiye ettik dired-get-filenamekısmen (dired-get-filename t t)şeyi almak için.
Tu Do

6

Bunu yapan tek bir işlev olup olmadığını bilmiyorum, ama bu sizin için işe yarayabilir:

(let (r)
  (dired-unmark-all-files ?\r nil)
  (dired-toggle-marks)
  (setq r (dired-get-marked-files))
  (dired-toggle-marks)
  r)

Bazen aşağıdakileri basitleştirebilirsiniz:

(progn (dired-toggle-marks)
       (dired-get-marked-files))

3

@ Abo-abo'nin yanı sıra , dosya (& dir) adlarının bir listesini nasıl alacağınızı anlatan cevaba ek olarak :

Ne istediğinize bağlı olarak, alternatif olarak dired-copy-filename-as-kill(bağlı w) kullanabilirsiniz dired-get-marked-files.

Dosya adlarını boşlukla ayrılmış tek bir dizeye koyar ve bu dizeyi kill-ring.

(Alan ayırma, elbette, bazı dosya adlarının kendileri boşluk karakterleri içerdiğinde çok yararlı olmadığı anlamına gelir. ;-))

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.