รับชื่อไฟล์ทั้งหมดในบัฟเฟอร์ Dired ปัจจุบันด้วย Elisp


10

ตามที่ชื่อแนะนำฉันจะรับรายการไฟล์ทั้งหมดในบัฟเฟอร์ Dired โดยใช้ Elisp ได้อย่างไร


1
directory-filesถ้าคำถามนี้เป็นง่ายๆเป็นลักษณะทั้งหมดที่คุณต้องการก็คือ
Jordon Biondo

@JordonBiondo ดีใจที่ได้รู้จักฟังก์ชั่นทั่วไปอื่น ๆ อีกมากมาย เดิมทีฉันตั้งใจจะใช้with-current-bufferกับบัฟเฟอร์ Dired เพื่อรับรายการไฟล์หรือไฟล์ที่ทำเครื่องหมายไว้ สำหรับรายการไฟล์ทั้งหมดฉันสามารถใช้งานdirectory-filesได้แล้ว
Tu Do

@JordonBiondo ฉันลองอีกครั้ง วิธีการของคุณจะทำงานได้ก็ต่อเมื่อเรามีบัฟเฟอร์ Dired ที่ "เหมาะสม" หากเรามีบัฟเฟอร์ 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โทรออกได้เช่นกัน

แน่นอนคุณสามารถปรับเปลี่ยนฟังก์ชันใหม่นี้เพื่อสร้างรายการที่ต้องการโดยตรงแทนที่จะเรียกใช้ฟังก์ชันเพื่อทำ ฉันรู้สึกว่าวิธีการทั่วไปที่มากขึ้นนั้นใช้ได้ในทางปฏิบัติ แต่คุณอาจชอบความคิดในการห่อมันทั้งหมดไว้ในฟังก์ชั่นเดียว


มีรุ่นที่ไม่ใช่ CL หรือไม่ ฉันชอบ CL แต่ฉันไม่สามารถใช้การอ้างอิง CL ใน Projectile ได้
Tu Do

cl-fletเพียงกำหนดฟังก์ชั่น มันทำให้โค้ดสะอาดขึ้น แต่มันก็ยังเป็นเพียงฟังก์ชั่นดังนั้นให้กำหนดหนึ่งอันตามที่คุณต้องการ หรืออย่าใช้dired-map-dired-file-linesเลยและทำซ้ำและแก้ไขรหัสตามต้องการ
phils

คุณพูดถูก เครื่องหมาย Toggling จะเป็นการล้างเครื่องหมายเก่าซึ่งเป็นปัญหา ฉันคิดว่าคำตอบของคุณถูกต้อง
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และผลักดันสตริงที่

(การแยกช่องว่างหมายถึงแน่นอนว่ามันไม่เป็นประโยชน์เมื่อชื่อไฟล์บางตัวมีอักขระเว้นวรรค ;-))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.