เปิดไฟล์ซ้ำที่จับคู่ regexp ในไดเรกทอรีที่ทำเครื่องหมายไว้


9

โดยทั่วไปฉันต้องการเปิดไฟล์ทั้งหมดภายในชุดไดเรกทอรี (และไดเรกทอรีย่อย) ที่ชื่อไฟล์ตรงกับ regexp ที่กำหนด

ตัวอย่างเช่น

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

ฉันได้ทำเครื่องหมายไดเรกทอรีhst, incและlibและตอนนี้ฉันอยากจะไปเยี่ยมทุกไฟล์ที่มีนามสกุล.c, .ccและ.hภายในสามไดเรกทอรีและไดเรกทอรีย่อยของพวกเขา

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

ฉันเปิดให้คำแนะนำในการทำสิ่งเดียวกันนี้โดยใช้helmหรือdired+หรือส่วนขยายอื่น ๆ ที่จะช่วยให้ฉันนำทางระบบไฟล์ของฉันได้ง่ายขึ้น


มี Mathias หรือ Drew ตอบเควสต์อินของคุณหรือไม่? หรือคุณกำลังมองหาบางอย่างที่แตกต่างออกไป?
Malabarba

คำตอบ:


14

ลองสิ่งนี้:

C-u C-x d

นี่ให้คุณใส่อาร์กิวเมนต์สำหรับว่า Dired ควรแสดงรายการไฟล์อย่างไร โดยค่าเริ่มต้นมันบอกว่า-alที่พรอมต์ เพิ่มนั้นสิ้นสุดกับR -alRประเภทRET.

เลือก / RETพิมพ์ไดเรกทอรีและกด

การดำเนินการนี้จะเปิดไดเรกทอรีทั้งหมดซ้ำจากไดเรกทอรีที่คุณเลือกและด้านล่าง

จากที่นี่พิมพ์% mเพื่อทำเครื่องหมายไฟล์ทั้งหมดที่ตรงกับรูปแบบชื่อไฟล์ที่ต้องการ ฉันก็มักจะพิมพ์tแล้วkเพื่อฆ่า (ซ่อน) ไฟล์ทั้งหมดที่ฉันไม่สนใจพิมพ์tอีกครั้งเพื่อทำเครื่องหมายไฟล์ทั้งหมด

เท่าที่เปิดไฟล์จริง ๆ ฉันไม่คิดว่าจะมีวิธีมาตรฐานที่จะทำ แต่คุณสามารถกำหนดคำสั่งใหม่ที่จะทำ (วางไว้ใน.emacsไฟล์ของคุณ):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

คนส่วนใหญ่อาจรวมสิ่งนี้ไว้ในแพ็คเกจเสริมประสิทธิภาพ Dired ที่ดี แต่ก็สนุกที่จะทำเองเช่นกัน;)

สนุก!


7

คุณสามารถทำเช่นนี้ได้อย่างง่ายดายด้วยหางเสือกระสุนปืนหาไฟล์ เนื่องจาก Projectile คอยติดตามทุกไฟล์ด้วยพา ธ ที่สัมพันธ์กันคุณจึงสามารถ จำกัด ให้แคบลงได้ทุกอย่าง ลองใช้ตัวอย่างของคุณ ในกรณีของคุณคุณต้องการเปิดไฟล์ในhst, และinc libคุณสามารถดึงไฟล์ทั้งหมดที่เป็นของไดเรกทอรีนี้ได้สองวิธี:

  • ในพร้อมต์ Helm ให้helm-projectile-find-fileป้อนแต่ละไดเร็กทอรีและทำเครื่องหมายไฟล์ที่ จำกัด ให้แคบลงในไดเร็กทอรีนั้น ตัวอย่างเช่นก่อนอื่นฉันป้อน^hst/(ซึ่งแคบลงไฟล์ทั้งหมดที่มีhst/ที่จุดเริ่มต้นของผู้สมัครแต่ละคน) ทำเครื่องหมายไฟล์ทั้งหมดด้วยM-aทำสิ่งที่คล้ายกันสำหรับไฟล์ในอีกสองไดเรกทอรี

  • หรือคุณสามารถดึงไฟล์ในไดเรกทอรีทั้งหมดโดยใช้รูปแบบนี้^hst/\|^inc\|^lib : หางเสือยอมรับ regex หลังจากทั้งหมด regex วิธี\| orทำเช่นนี้หากคุณต้องการเลือกทุกอย่างในครั้งเดียว

ด้วยสิ่งเหล่านี้คุณจะทำเครื่องหมายไฟล์ทั้งหมดที่คุณต้องการเปิด จากนั้นเพียงกดRETเพื่อเปิดทั้งหมด

helm-candidate-number-limitโปรดทราบว่าถ้าคุณมีจำนวนมากของไฟล์ในไดเรกทอรีที่คุณจะต้องเพิ่มขึ้น มิฉะนั้นเมื่อจำนวนผู้สมัครถึงขีด จำกัด แล้วจะไม่มีการแสดงผู้สมัครอีกและคุณไม่สามารถเลือกผู้สมัครที่มองไม่เห็น ตั้งเป็นตัวเลขที่สูงขึ้นหรือตั้งเป็นnilหากคุณไม่ต้องการขีด จำกัด นี้

สิ่งที่ดีกับ Helm คือคุณสามารถเลือกไฟล์แบบโต้ตอบได้


ฉันคิดว่าเขาต้องการเปิดพวกเขาทั้งหมดพร้อมกันไม่ใช่เลือกหนึ่งในนั้น
Malabarba

1
@Malabarba คุณสามารถเลือกหลายไฟล์ด้วยการM-aใช้helm-projectile-find-fileและกด RET หนึ่งครั้งเพื่อเปิดทั้งหมดโดยใช้วิธีที่ฉันแสดง
Tu Do

แน่นอน! ขออภัยพลาดประโยคนั้นไป ฉันแก้ไขเพื่อให้ชัดเจนกว่าคนโง่เช่นฉัน คุณสามารถย้อนกลับได้ถ้าคุณไม่ชอบหรือถ้าฉันทำอะไรผิด
Malabarba

@ Malabarba ขอบคุณ ชัดเจนขึ้นแล้ว
Tu Do

4

ที่นี่มีสองทางเลือก (ทางเลือก):

  1. ใน Dired คุณสามารถรวมส่วนย่อยทั้งหมดที่มีไฟล์ที่คุณต้องการดำเนินการโดยใช้lsสวิตช์ที่รวม-Rหรือโดยใช้iเพื่อรวมส่วนย่อยเฉพาะ หากคุณใช้ไลบรารี่ Dired +คุณสามารถใช้* .(ผูกไว้กับdiredp-mark/unmark-extensionเพื่อทำเครื่องหมายไฟล์ทั้งหมดในรายการที่มีนามสกุลที่กำหนด (เช่น.h) จากนั้นคุณสามารถใช้F(ผูกกับdired-do-find-marked-files) เพื่อเปิดไฟล์ที่ทำเครื่องหมายไว้ทั้งหมด

  2. ด้วย Library Dired +คุณสามารถดำเนินการกับไฟล์ที่ทำเครื่องหมายไว้ทั้งหมดและไฟล์ที่ทำเครื่องหมายไว้ทั้งหมดในไดเรกทอรีย่อยที่ทำเครื่องหมายกำหนดไว้ซ้ำ IOW ส่วนย่อยของส่วนย่อยย่อยของพวกเขา ฯลฯ

    ไดเรกทอรีการทำเครื่องหมายใด ๆถ้าไม่มีแฟ้มที่มีการทำเครื่องหมายในไดเรกทอรีที่ (เช่นการทำเครื่องหมายใน Dired รายการสำหรับ subdir นั้น) แล้วการดำเนินการอยู่ในทั้งหมดของไฟล์

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

    แต่ถ้าคุณใช้ห้องสมุดIciclesร่วมกับDired +แล้วคุณสามารถใช้M-+ C-FคือM-+ C-S-f(ซึ่งถูกผูกไว้icicle-visit-marked-file-of-content-recursive) เพื่อเปิดใดหรือทั้งหมดของไฟล์ที่อธิบายเพียง (กล่าวคือผู้ที่ทำเครื่องหมายหรือ subdirs ทำเครื่องหมายกำหนดซ้ำ)

    คุณสามารถใช้ regexps ได้ทันทีเพื่อกรองชื่อไฟล์ (และ / หรือเนื้อหาไฟล์) ตัวอย่างเช่นคุณสามารถตามที่คุณร้องขอให้เปิดไฟล์ทั้งหมดที่มีส่วนขยาย.c, .ccและ.hใน subdirs ทำเครื่องหมาย (กับ subdirs ทำเครื่องหมายถูกจัดการในลักษณะเดียวกันซ้ำ)


3

eshell จัดการกับ**/*การขยายตัวแบบ zsh แบบ zsh ดังนั้นวิธีการหนึ่งที่จะทำให้ eshell นั้นอยู่ในไดเรกทอรีที่ถูกต้องและทำงานได้for f in **/*cc **/*h { find-file $f}

ฟังก์ชั่นfind-fileรองรับไวด์การ์ดเมื่อเรียกใช้จาก elisp นี่เป็นตัวอย่างข้อมูลที่มีประโยชน์จากเอกสารประกอบสำหรับfind-file:

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

ฉันไม่สามารถหาวิธีที่จะให้มันทำงานกับ globbing สไตล์ zsh ได้ แต่มันอาจเป็นตัวเลือกที่ดี

หากไฟล์เหล่านี้ทั้งหมดอยู่ในโปรเจ็กต์ที่ถูกควบคุมซอร์สเดียวโปรเจ็กต์อาจเป็นวิธีที่แตกต่างและดีกว่า

PS หากคุณไปกับ eshell ฉันขอแนะนำให้ผูกeshell-toggle-cdกุญแจเพื่อให้คุณสามารถป๊อปอัพพร้อมท์ eshell ในไดเรกทอรีของบัฟเฟอร์ที่คุณกำลังแก้ไข


ฉันไม่คิดว่ามันfind-fileจะทำงานแบบวนซ้ำซึ่งเป็นคุณสมบัติหลักของฉัน การเปิดเปลือกและพิมพ์คำสั่งดูเหมือนว่าจะทำงานได้มากเกินไปเพราะ (ฉันเดา) คำสั่งของฉันจะต้องเป็นแบบfor d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }นี้หรือมันง่ายกว่านั้นไหม?
nispio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.