Elisp के साथ वर्तमान डेयर बफर में सभी फ़ाइल नाम प्राप्त करें


10

जैसा कि शीर्षक से पता चलता है, कैसे मैं एलिस्ट का उपयोग करके एक डैड बफर में सभी फ़ाइल प्रविष्टियां प्राप्त कर सकता हूं?


1
यदि यह प्रश्न जितना सरल दिखता है, उतना ही आपको इसकी आवश्यकता है directory-files
जॉर्डन बियोन्डो

@JordonBiondo एक और सामान्य कार्य को जानने के लिए अच्छा है। मूल रूप से मैं with-current-bufferफ़ाइलों या चिह्नित फ़ाइलों की एक सूची प्राप्त करने के लिए एक डैड बफ़र पर उपयोग करने का इरादा रखता था । सभी फ़ाइलों की सूची के लिए, मैं अब उपयोग कर सकता हूं directory-files
तु डू

@JordonBiondo मैंने इसे फिर से आज़माया है। आपकी विधि केवल तभी काम करती है जब हमारे पास "उचित" Dired बफर हो। अगर हमारे पास कस्टम डाइर्ड बफर है जो विभिन्न निर्देशिकाओं से मनमानी फाइलों के साथ डाला गया है, तो directory-filesविकल्प नहीं है।
Tu Do

जवाबों:


7

हेर-फेर के निशान अनावश्यक और शायद समस्याग्रस्त लगते हैं।

जाहिर है कि इस तरह की चीज़ करने की हिम्मत के भीतर कार्यक्षमता है (यद्यपि अच्छी तरह से प्रलेखित नहीं है)। यहाँ एक सरल तरीका है:

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

संपादित करें:

टिप्पणियों में आप कहते हैं कि आप निर्देशिका पथ के साथ-साथ फ़ाइल पथ को शामिल करने के लिए परिणामी सूची चाहेंगे।

dired-map-dired-file-linesस्पष्ट रूप से निर्देशिकाओं को बाहर करता है, और उन्हें शामिल करने का कोई विकल्प नहीं है; लेकिन एक फ़ंक्शन को परिभाषित करना आसान है, जो मूल को कॉपी करके और अवांछित परीक्षण को छोड़ देता है:

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

dired-map-dired-file-linesप्रारंभिक फ़ंक्शन में बस इसका उपयोग करें । फिर आप declare-functionकॉल को भी बाहर कर सकते हैं ।

आप निश्चित रूप से, इस नए फ़ंक्शन को संशोधित कर सकते हैं कि ऐसा करने के लिए फ़ंक्शन को कॉल करने के बजाय, सीधे वांछित सूची का निर्माण करें। मुझे लगता है कि अभ्यास में अधिक सामान्य दृष्टिकोण ठीक है, लेकिन आप इसे एक ही फ़ंक्शन में लपेटने के विचार को पसंद कर सकते हैं।


क्या गैर-सीएल संस्करण है? मुझे सीएल पसंद है, लेकिन मैं प्रोजेक्टाइल में सीएल निर्भरता का उपयोग करने में सक्षम नहीं हूं।
Tu Do

cl-fletबस एक फ़ंक्शन को परिभाषित करता है। यह कोड को क्लीनर बनाता है, लेकिन यह अभी भी एक फ़ंक्शन है, इसलिए किसी एक को परिभाषित करें जो आपको करने की आवश्यकता है। या बिल्कुल भी उपयोग न करें dired-map-dired-file-lines, और इसके कोड को डुप्लिकेट करें और आवश्यकतानुसार संशोधित करें।
फिल्स

तुम सही हो। टॉगल करने के निशान पुराने निशान को साफ करते हैं, जो समस्याग्रस्त है। मैं आपके उत्तर को सही मानता हूं।
Tu Do

आपका समाधान केवल फ़ाइलों को पुनर्प्राप्त करने के लिए लगता है, लेकिन कोई निर्देशिका नहीं। कृपया इसे अद्यतन करें जब संभव हो।
Tu Do

हाँ, मैं बस सब कुछ पाने के लिए dired-get-filenameभाग में बदल गया हूँ (dired-get-filename t t)
Tu Do

6

मुझे नहीं पता कि क्या कोई एकल कार्य है जो ऐसा करता है, लेकिन यह आपके लिए काम कर सकता है:

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

कभी-कभी आप इसे सरल बना सकते हैं:

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

3

@ Abo-abo के उत्तर के अलावा, जो आपको बताता है कि फ़ाइल की सूची कैसे प्राप्त करें (& dir) नाम:

आप जो चाहते हैं उसके आधार पर, आप वैकल्पिक रूप dired-copy-filename-as-killसे wइसके बजाय (बाध्य ) का उपयोग कर सकते हैं dired-get-marked-files

यह फ़ाइल नामों को एक सिंगल, स्पेस-सेपरेटेड स्ट्रिंग में डालता है , और उस स्ट्रिंग को पुश करता है kill-ring

(अंतरिक्ष पृथक्करण का अर्थ है, निश्चित रूप से, यह इतना उपयोगी नहीं है, जब कुछ फ़ाइल नामों में स्वयं में अंतरिक्ष वर्ण हों; ;-))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.