แสดงรายการไฟล์และไดเร็กทอรีย่อยทั้งหมดซ้ำ ๆ


15

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

ที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือprojectile-find-fileฟังก์ชั่นของprojectileแพ็กเกจ (หรืออีกวิธีหนึ่งคือhelm-projectile-find-fileฟังก์ชั่นของhelm-projectileแพ็กเกจ) แต่ดูเหมือนจะไม่สามารถแสดงรายการโฟลเดอร์ว่าง นอกจากนี้ดูเหมือนว่าจะใช้งานได้เฉพาะกับ Git และที่เก็บข้อมูลการควบคุมเวอร์ชันอื่น ๆ แต่อาจมีวิธีแก้ไขสำหรับข้อ จำกัด นี้


2
ยังไม่แน่ใจในสิ่งที่คุณพยายามทำ แต่ [โพสต์บล็อกนี้] (www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html) อาจมีสิ่งที่คุณต้องการ หรือคุณอาจลอง [อันนี้] (ergoemacs.org/emacs/elisp_traverse_dir.html) เป็นผู้เริ่มต้น
theldoria

"รายการ" คุณหมายถึงอะไร คุณต้องการฟังก์ชั่น Emacs Lisp ที่ส่งคืนรายการสตริงพร้อมพา ธ หรือไม่? คุณต้องการบัฟเฟอร์ที่มีพา ธ ในนั้นพูดหนึ่งรายการต่อบรรทัดหรือไม่? คุณต้องการบัฟเฟอร์ที่ dired กับไฟล์ทั้งหมดหรือไม่? (อันสุดท้ายนั้นง่ายเพิ่ม "-R" ไปยังสวิตช์ ls ใน dire)
โอมาร์


@ Omar: ฉันต้องมีความต้องการที่สมบูรณ์แบบ: (1) มันจะเป็นส่วนหนึ่งของ Emacs หรือส่วนหนึ่งของแพคเกจ (2) ว่ามันจะทำงานร่วมกับอย่างใดอย่างหนึ่งhelmหรือivyนั่นคือผลลัพธ์ที่จะแสดงในบัฟเฟอร์helmหรือ ivyหากเป็นไปไม่ได้ที่จะสนองความต้องการทั้งสองข้อข้อที่สองนั้นสำคัญกว่าสำหรับฉัน
Evan Aad

1
นั่นเป็นคำถามสองข้อที่แตกต่างกันจริงๆ แต่ตกลงฉันให้คำตอบสำหรับแต่ละคน
Drew

คำตอบ:


8

สมมติว่าคุณใช้ivyคุณสามารถใช้ฟังก์ชั่นนี้

    (defun fhd/counsel-everything ()
      "list everything recursively"
      (interactive)
      (let* ((cands (split-string
                     (shell-command-to-string "find .") "\n" t)))
        (ivy-read "File: " cands
                  :action #'find-file
                  :caller 'fhd/counsel-everything)))

ขอบคุณ หากฉันใช้helm?
Evan Aad

1
helmขอโทษนะฉันไม่ทราบเกี่ยวกับ ivyค่อนข้างเบา ให้มันยิง
fhdhsni

13

ไดเรกทอรีไฟล์ซ้ำ

(ฉันคิดว่านี่ถูกเพิ่มเข้ามาใน Emacs 25)

นี่คือลิงค์ไปยังคู่มือ: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

ส่งคืนไฟล์ทั้งหมดภายใต้ไดเรกทอรีที่มีชื่อตรงกับ regexp ฟังก์ชั่นนี้ค้นหาไดเรกทอรีที่ระบุและไดเรกทอรีย่อยซ้ำสำหรับไฟล์ที่มีชื่อฐาน (เช่นไม่มีไดเรกทอรีชั้นนำ) ตรงกับ regexp ที่ระบุและส่งกลับรายการของชื่อไฟล์แน่นอนของไฟล์ที่ตรงกัน (ดูชื่อไฟล์แน่นอน) . ชื่อไฟล์จะถูกส่งคืนตามลำดับความลึกก่อนซึ่งหมายความว่าไฟล์ในบางไดเร็กทอรีย่อยจะถูกส่งคืนก่อนไฟล์ในไดเร็กทอรีพาเรนต์ นอกจากนี้ไฟล์จับคู่ที่พบในแต่ละไดเรกทอรีย่อยจะถูกจัดเรียงตามตัวอักษรตามชื่อไฟล์พื้นฐาน โดยค่าเริ่มต้นไดเรกทอรีที่มีชื่อตรงกับ regexp จะถูกตัดออกจากรายการ แต่ถ้าอาร์กิวเมนต์ตัวเลือก include-directory นั้นไม่ใช่ non-nil ก็จะถูกรวมไว้ด้วย

ตัวอย่าง

(directory-files-recursively default-directory "")

ไม่พบไดเรกทอรีว่าง
fhdhsni

1
@fhdhsni คุณลองตั้งค่าinclude-directoriesเพื่อt? ฉันทำงานที่ Emacs 24 และไม่สามารถลองได้ในตอนนี้ แต่ฉันสามารถทดสอบได้ที่บ้านภายในไม่กี่ชั่วโมง
wvxvw

ความผิดฉันเอง. ฉันไม่ได้ทำอย่างนั้น คุณอาจต้องการรวมไว้ในคำตอบของคุณ
fhdhsni

4

คำตอบนี้อนุมานว่าคุณต้องการแสดงรายการไฟล์และชื่อ dir แทนที่จะได้รับรายการ Lisp

ใช้คำสั่งมาตรฐาน Emacs find-dired, หรือfind-name-dired find-grep-diredชื่อไฟล์และ dir ที่พบจะแสดงในบัฟเฟอร์โหมด Dired (คุณสามารถใช้พลังทั้งหมดของ Dired ในการทำงานกับผลลัพธ์)

หากคุณใช้find-dired+.elไลบรารี่คุณจะมีคำสั่ง Emacs มาตรฐานเวอร์ชันเพิ่มเติมคุณมีคำสั่งfind-time-diredซึ่งจะค้นหาไฟล์ที่ใหม่กว่าหรือเก่ากว่าการประทับเวลาที่กำหนด


find-diredเป็นสิ่งที่ฉันกำลังมองหา แต่มีวิธีพิมพ์ชื่อเท่านั้นหรือไม่ เพราะชื่อไฟล์เดียวจะมีหลายบรรทัดโดยไม่มีเหตุผลเพราะฉันไม่สนใจขนาดวันที่หรือการอนุญาตของไฟล์อย่างแน่นอน ฉันได้ลองใช้งานมา(setcar find-ls-option "-printf '%p\n'")ก่อนfind-diredแต่ด้วยเหตุผลบางอย่างนี้ไม่ต้องการเปิดไฟล์เมื่อกดEnterผ่านรายการ
Hi-Angel

2
@ Hi-Angel: บัฟเฟอร์ที่แสดงผลลัพธ์อยู่ในโหมด Dired ดังนั้นคุณสามารถกด(เพื่อสลับเพื่อแสดงมากกว่าชื่อไฟล์เปิด / ปิด ฉันทิ้งมันไว้เกือบตลอดเวลา (ไม่มีรายละเอียดใด ๆ ที่แสดง) และเพียงแค่สลับเป็นเวลาสั้น ๆ เมื่อฉันต้องการตรวจสอบรายละเอียดบางอย่าง
ดึง

1

ดูhttps://github.com/technomancy/find-file-in-project

มีคำสั่งให้ค้นหาไฟล์หรือค้นหาไดเรกทอรี แต่ไม่ใช่ทั้งคู่

หากคุณต้องการแสดงรายการไดเรกทอรีย่อยและไฟล์ทั้งหมดซ้ำในบัฟเฟอร์เดียวมีสองคำสั่งที่สร้างขึ้นใน Emacs สำหรับทุกวัย:

  1. M-x find-dired. findมันขึ้นอยู่กับเครื่องมือ CLI ที่ Windows คุณต้องติดตั้ง Cygwin หรือ MYSYS ที่มีfind

  2. M-x find-lisp-find-dired. เหมือนfind-diredแต่เขียนใน Lisp ดังนั้นจึงไม่มีการพึ่งพาบุคคลที่สาม นอกจากนี้ยังสามารถรับรู้สถานที่ออกจากกล่อง แต่มันช้ากว่าfind-dired


กรณีการใช้งานของฉันจะเหมือนกันกับทุกคนที่ใช้คำสั่งเชลล์ UNIX lsหรือฟังก์ชั่น Emacs find-fileซึ่งทั้งสองรายการแสดงทั้งไฟล์และไดเรกทอรีรวมถึงไดเรกทอรีว่าง
Evan Aad

มีอยู่find-diredและfind-lisp-find-diredเรียกซ้ำโดยที่ไม่เพียงแสดงรายการเนื้อหาของไดเรกทอรีปัจจุบัน แต่ยังแสดงเนื้อหาของไดเรกทอรีย่อยแต่ละไดเรกทอรีย่อยไดเรกทอรีย่อย ฯลฯ
Evan Aad

ใช่เกิดซ้ำ
เฉินบิน

1

คำตอบนี้อนุมานว่าคุณต้องการรับรายการเสียงกระเพื่อมของไฟล์และชื่อ dir แทนที่จะแสดงรายชื่อไฟล์

หากคุณใช้ไลบรารีDired +คุณสามารถใช้ฟังก์ชันdiredp-files-withinได้ (คุณไม่จำเป็นต้องอยู่ในบัฟเฟอร์ Dired เพื่อใช้งาน)

นี้ทำงานร่วมกับรุ่น Emacs ใด ๆ directory-files-recursivelyและมันก็เป็นทั่วไปมากกว่า

  • คุณสามารถผ่านรายการไฟล์และ dirs และทำหน้าที่ซ้ำในแต่ละไฟล์

  • หรือคุณสามารถส่งผ่านฟังก์ชั่นที่ส่งคืนรายการดังกล่าว

    • หากมีบัฟเฟอร์ Diredสำหรับไดเรกทอรีที่ได้รับการประมวลผลฟังก์ชันจะถูกเรียกใช้ในบัฟเฟอร์นั้นเพื่อส่งคืนรายการไฟล์ที่จะรวม

      ตัวอย่างเช่นถ้าฟังก์ชั่นdired-get-marked-files นั้นจะมีเฉพาะไฟล์และไดเรกทอรีย่อยที่ทำเครื่องหมายไว้เท่านั้น

  • คุณสามารถส่งผ่านมันกริยาที่แต่ละไฟล์หรือไดเรกทอรีต้องตอบสนอง การจับคู่ Regexp นั้นแน่นอนว่าเป็นเพรดิเคตชนิดหนึ่ง

  • คุณสามารถบอกได้ว่าจะไม่ติดตามลิงก์สัญลักษณ์


0
(defun my-dir-list (แหล่งที่มา)
  ;;
  ;; พิมพ์รายการไฟล์ในบัฟเฟอร์ปัจจุบัน
  ;;
  ;; ยังไม่ได้ทดสอบประเภทระบบ: gnu
  ;; ทดสอบแล้ว, ชนิดของระบบ: windows-nt
  ;;
  (โต้ตอบ "sDirectory:")
  (ให้ ((n 0))
    (l-file-dir (และ (แหล่งที่มาของ cd) (directory-files-and-attributes "./"))
    (dir-list '())
    (รายการไฟล์ '())
    )
    (princ (รูปแบบ "% s \ n" ไดเรกทอรีเริ่มต้น) (บัฟเฟอร์ปัจจุบัน))
    (ในขณะที่ l-file-dir
      (ถ้า (nth 1 (car l-file-dir))
      (setq n (1+ n)
        รายชื่อ dir (ข้อเสีย ((แลมบ์ดา (ต้นฉบับ))
                  (และ (ไม่ใช่ (string-prefix-p "." (แหล่งที่มาของรถยนต์))))
                (car l-file-dir)) รายการ dir)
        )
    (princ (รูปแบบ "% s \ n" (ไดเรกทอรีเริ่มต้นพร้อมกัน)
                      (และ (จับคู่สตริง "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir))) (บัฟเฟอร์ปัจจุบัน))
    )
      (setq l-file-dir (cdr l-file-dir))
      )
    (ในขณะที่ (caar dir-list)
      (setq dir-list (cdr dir-list))
      (cd ".. ")
      )
    )
  'ตกลง
  )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.