การใช้ Emacs เพื่อค้นหาและแทนที่ในไฟล์ข้อความที่ยังไม่เปิด


212

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

ใน Ultraedit ฉันจะใช้ Alt + s ตามด้วย p เพื่อแสดงกล่องโต้ตอบพร้อมตัวเลือก: ค้นหา (รวมถึงการใช้นิพจน์ปกติในหลายบรรทัด), แทนที่ด้วย, ในไฟล์ / ประเภท, ไดเรกทอรี, กรณีการแข่งขัน, จับคู่ทั้งคำเท่านั้น, รายการ ไฟล์ที่เปลี่ยนแปลงและไดเรกทอรีย่อยการค้นหา โดยปกติฉันจะใช้เมาส์คลิกเพื่อลาก - เลือกข้อความที่ฉันต้องการแทนที่

การใช้ Emacs เท่านั้น (บน Windows XP) โดยไม่ต้องเรียกยูทิลิตีภายนอกใด ๆ วิธีการแทนที่ foo \ nbar ทั้งหมดด้วย bar \ nbaz in *.cและ*.hไฟล์ในบางโฟลเดอร์และโฟลเดอร์ทั้งหมดที่อยู่ด้านล่าง บางที Emacs ไม่ใช่เครื่องมือที่ดีที่สุดในการทำเช่นนี้ แต่จะทำได้อย่างง่ายดายด้วยคำสั่งขั้นต่ำ?

คำตอบ:


370
  1. M-x find-name-dired: คุณจะได้รับแจ้งให้ระบุไดเรกทอรีรากและรูปแบบชื่อไฟล์
  2. กดtเพื่อ "toggle mark" สำหรับไฟล์ทั้งหมดที่พบ
  3. กดปุ่มQ"Query-Replace in Files ... ": คุณจะได้รับแจ้งให้ป้อนคำสั่ง / การแทนที่ regexps
  4. ดำเนินการต่อด้วยquery-replace-regexp: SPACEเพื่อแทนที่และย้ายไปยังการแข่งขันถัดไปnเพื่อข้ามการแข่งขัน ฯลฯ
  5. กดC-x sเพื่อบันทึกบัฟเฟอร์ (จากนั้นคุณสามารถกดy, nหรือ!จะบันทึกทั้งหมดในครั้งเดียว)

10
ไม่มันวนซ้ำ รุ่นที่ไม่ใช่แบบเรียกซ้ำจะเป็น% m ในโหมด dired
Chris Conway

5
อาจเป็นเพราะคุณโทรหา C: \ WINDOWS \ system32 \ find.exe ไม่ใช่ GNU
Jazz

6
Steen, Chris: อาจไม่ตรงตามที่คุณต้องการ แต่คุณสามารถใช้ 'Cx s' (save-some-buffer) มันจะแจ้งให้คุณทราบสำหรับไฟล์ที่แก้ไขแต่ละไฟล์ดังนั้นคุณต้องกด 'y' หลายครั้ง
danielpoe

48
C-x s !เพื่อบันทึกไฟล์ทั้งหมดในครั้งเดียว
cYrus

10
M-,เพื่อค้นหาและแทนที่ต่อไป (เช่นหลังจากพร้อมต์ "เปลี่ยนไฟล์" หากไฟล์ถูกเปลี่ยนบนดิสก์)
tfischbach

37
  • M-x find-name-dired RET
    • อาจใช้เวลาสักครู่ก่อนที่ไฟล์ทั้งหมดจะปรากฏในรายการเลื่อนไปที่ด้านล่าง ( M->) จนกระทั่ง " find finished" ปรากฏขึ้นเพื่อให้แน่ใจว่าไฟล์ทั้งหมดได้โหลดแล้ว
  • กดtเพื่อ "toggle mark" สำหรับไฟล์ทั้งหมดที่พบ
  • กดปุ่มQ"Query-Replace in Files ... ": คุณจะได้รับแจ้งให้ป้อนคำสั่ง / การแทนที่ regexps
  • ดำเนินการเช่นเดียวกับ query-replace-regexp: SPACE หรือyเพื่อแทนที่และย้ายไปยังการแข่งขันถัดไป, n เพื่อข้ามการแข่งขันเป็นต้น
    • พิมพ์! เพื่อแทนที่สิ่งที่เกิดขึ้นทั้งหมดในไฟล์ปัจจุบันโดยไม่ถามNเพื่อข้ามสิ่งที่เป็นไปได้ทั้งหมดสำหรับไฟล์ที่เหลือในปัจจุบัน ( Nเป็น emacs 23+ เท่านั้น)
    • Yจะทำอย่างไรในการเปลี่ยนไฟล์ทั้งหมดโดยไม่ต้องขอเพิ่มเติมประเภท
  • เรียก“ ibuffer” ( C-x C-bถ้าผูกไว้กับ ibuffer หรือM-x ibuffer RET) เพื่อแสดงรายการไฟล์ที่เปิดทั้งหมด
  • พิมพ์* uเพื่อทำเครื่องหมายไฟล์ที่ไม่ได้บันทึกทั้งหมดพิมพ์Sเพื่อบันทึกไฟล์ที่ทำเครื่องหมายไว้ทั้งหมด
  • * * RETเพื่อยกเลิกการทำเครื่องหมายเครื่องหมายทั้งหมดหรือพิมพ์Dเพื่อปิดไฟล์ที่ทำเครื่องหมายไว้ทั้งหมด

คำตอบนี้รวมกันจากคำตอบนี้จากไซต์นี้และจากบันทึกของฉันเอง ใช้ Emacs 23+


3
ibufferไม่ถูกผูกมัดC-x C-bโดยค่าเริ่มต้น
phils

2
ดีส่วนตัวผมแนะนำให้คนที่ไม่ผูกC-x C-bไปibufferเพราะมันมากดีกว่าเริ่มต้นที่มีผลผูกพัน เพียงเพิ่ม(global-set-key (kbd "C-x C-b") 'ibuffer)ไฟล์. emacs ของคุณ ความล้มเหลวนั้นใช้M-x ibuffer RETในคำแนะนำข้างต้น
phils

ตกลง. ฉันคิดว่าฉันมีชุดเริ่มต้น emacs ซึ่งเป็นเหตุผลว่าทำไมฉันถึงผูกพัน
Frank Henard

1
ไฟล์bla-bla-blaถูกเยี่ยมชมเป็นแบบอ่านอย่างเดียวและหยุดการค้นหา จะหลีกเลี่ยง / เพิกเฉยและเปลี่ยนใหม่ได้อย่างไร? ขอบคุณ
เฟลิเป้

3
ทำไมibufferเมื่อคุณสามารถC-x s( save-some-buffers) และพิมพ์!? ฉันไม่ต้องการที่จะคุยโวแค่อยากรู้อยากเห็น PS บวกสำหรับการอธิบาย!, และN Y
d12frosted

17

คำตอบที่ให้นั้นยอดเยี่ยม แต่ฉันคิดว่าฉันจะเพิ่มวิธีที่แตกต่างออกไปเล็กน้อย

มันเป็นวิธีการโต้ตอบมากขึ้นและต้องใช้wgrep, และrgrep ieditทั้งสองieditและwgrepจะต้องติดตั้งผ่าน MELPA หรือ Marmalade (โดยใช้M-x package-list-packages)

ขั้นแรกM-x rgrepให้ค้นหาสตริงที่คุณต้องการ

คุณจะสามารถระบุประเภท / รูปแบบไฟล์และโฟลเดอร์ที่จะเรียกคืนได้

ถัดไปคุณจะต้องทำงานเริ่มต้นด้วยwgrepC-s C-p

Wgrep จะช่วยให้คุณแก้ไขrgrepผลลัพธ์ดังนั้นตั้งค่าภูมิภาคบนสตริงเพื่อจับคู่และเริ่มต้นiedit-modeด้วยC-;(ขึ้นอยู่กับเทอร์มินัลของคุณคุณอาจจำเป็นต้องผูกสิ่งนี้ใหม่)

เหตุการณ์ทั้งหมดจะสามารถแก้ไขได้ในครั้งเดียว ที่จะกระทำC-x C-s wgrepจากนั้นC-x s !ให้บันทึกไฟล์ที่เปลี่ยนแปลง

ประโยชน์หลักของวิธีนี้คือการที่คุณสามารถใช้เพื่อสลับออกบางแมตช์iedit-mode M-;นอกจากนี้คุณยังสามารถใช้ผลลัพธ์rgrepเพื่อข้ามไปยังไฟล์ได้เช่นหากคุณมีคู่ที่ไม่คาดคิด

ฉันพบว่ามีประโยชน์มากสำหรับการแก้ไขซอร์สและเปลี่ยนชื่อสัญลักษณ์ (ตัวแปรชื่อฟังก์ชั่น ฯลฯ ) ในโครงการ

หากคุณยังไม่รู้จัก / ใช้โหมด iedit เป็นเครื่องมือที่มีประโยชน์มากฉันขอแนะนำให้คุณลองดู


เทคนิคนี้ค่อนข้างทรงพลังแม้ไม่ใช้ iedit มันเปลี่ยนการรู้วิธีการ grep (ง่ายด้วย lgrep / rgrep) เป็นการรู้วิธีการแทนที่การค้นหาจำนวนมาก!
NeilenMarais

การรวม rgrep / wgrep / macros นั้นยอดเยี่ยม
ocodo

2
ปุ่มลัดเพื่อเริ่มwgrepคือC-c C-pbtw
techniao


13

โดยทั่วไปฉันใช้เครื่องมืออื่น ๆ เพื่อทำงานนี้และดูเหมือนว่ามีวิธีการมากมายที่กล่าวถึงในเชลล์การเข้าใช้ Find and Replace Across Files ของ EmacsWikiแต่แพ็คเกจ Findrดูมีแนวโน้มดีมาก

การขโมยส่วนหนึ่งของไฟล์ต้นฉบับ :

(defun findr-query-replace (from to name dir)
  "Do `query-replace-regexp' of FROM with TO, on each file found by findr.

ฉันจะพยายามค้นหาสตริง "Collectible" ในทุกไฟล์ที่มีนามสกุล java และ hxx โดยใช้ findr.el ได้อย่างไร
swdev

@swdev: Mx findr-query-replace RET Collectible RET <การแทนที่> RET. * \. java RET <ไดเรกทอรีที่จะเริ่มค้นหาใน> RET
ShreevatsaR

ฉันชอบวิธีนี้ (หลีกเลี่ยงการสลับทั้งหมดที่เกี่ยวข้องกับวิธีการโดยตรง) ฉันใช้ฟังก์ชั่นอำนวยความสะดวกบางอย่างเพื่อรวมสิ่งนี้กับ projectile (project-root-discover) และแทนที่สิ่งที่จุด: gist.github.com/anonymous/055a9d62f9fc824153599724b8f44d57
Att

6

แหล่งที่มาของข้อมูล: 1

สำหรับผู้ใช้ emacs pro:

  1. โทรไปที่รายชื่อไฟล์ใน dir หรือโทรหาที่ค้นหาถ้าคุณต้องการไดเรกทอรีย่อยทั้งหมด
  2. ทำเครื่องหมายไฟล์ที่คุณต้องการ คุณสามารถทำเครื่องหมายด้วย regex โดยพิมพ์【% m 】
  3. พิมพ์ Q เพื่อเรียก dired-do-query-replace-regexp
  4. พิมพ์ find regex ของคุณและแทนที่สตริง pattern ☛ลวดลาย elex regex ทั่วไป〕
  5. สำหรับแต่ละเหตุการณ์ที่เกิดขึ้นพิมพ์ y เพื่อแทนที่, n เพื่อข้าม พิมพ์【 Ctrl + g 】เพื่อยกเลิกการทำงานทั้งหมด
  6. พิมพ์! เพื่อแทนที่สิ่งที่เกิดขึ้นทั้งหมดในไฟล์ปัจจุบันโดยไม่ต้องขอให้ N ข้ามการแทนที่ที่เป็นไปได้ทั้งหมดไปยังไฟล์ปัจจุบันที่เหลือ (N คือ emacs 23 เท่านั้น)
  7. หากต้องการแทนที่ไฟล์ทั้งหมดโดยไม่ถามเพิ่มเติมให้พิมพ์ Y. (Emacs 23 เท่านั้น)
  8. โทร ibuffer เพื่อแสดงรายการไฟล์ที่เปิดทั้งหมด พิมพ์【 * u 】เพื่อทำเครื่องหมายไฟล์ที่ไม่ได้บันทึกทั้งหมดพิมพ์ S เพื่อบันทึกไฟล์ที่ทำเครื่องหมายไว้ทั้งหมดพิมพ์ D เพื่อปิดไฟล์ทั้งหมด

คำแนะนำทีละขั้นตอนสำหรับผู้เริ่มต้นใช้งาน Emacs

เลือกไฟล์เป้าหมาย

เริ่ม emacs โดยพิมพ์“ emacs” ในพรอมต์บรรทัดคำสั่ง (หรือดับเบิลคลิกไอคอน Emacs หากคุณอยู่ในสภาพแวดล้อมส่วนติดต่อผู้ใช้แบบกราฟิก)

การเลือกไฟล์ในไดเรกทอรี

ก่อนอื่นคุณต้องเลือกไฟล์ที่คุณต้องการแทนที่ ใช้เมนูกราฟิก〖ไฟล์▸เปิดไดเรกทอรี〗Emacs จะขอเส้นทางไดเรกทอรี พิมพ์เส้นทางไดเรกทอรีจากนั้นกด Enter

ตอนนี้คุณจะเห็นรายการไฟล์และตอนนี้คุณต้องทำเครื่องหมายไฟล์ที่คุณต้องการให้ regex find / replace ทำงาน คุณทำเครื่องหมายไฟล์โดยเลื่อนเคอร์เซอร์ไปยังไฟล์ที่คุณต้องการจากนั้นกด m ยกเลิกการทำเครื่องหมายโดยกด u (ในการแสดงรายการไดเรกทอรีย่อยให้เลื่อนเคอร์เซอร์ไปที่ไดเรกทอรีแล้วกด i เนื้อหาของไดเรกทอรีย่อยจะปรากฏที่ด้านล่าง) หากต้องการทำเครื่องหมายไฟล์ทั้งหมดด้วย regex ให้พิมพ์【% m 】จากนั้นพิมพ์รูปแบบ regex ของคุณ ตัวอย่างเช่นหากคุณต้องการทำเครื่องหมายไฟล์ HTML ทั้งหมดให้พิมพ์【% m 】ตามด้วย. html $ (คุณสามารถค้นหารายการคำสั่งทำเครื่องหมายในเมนูแบบกราฟิก "ทำเครื่องหมาย" (เมนูนี้จะปรากฏขึ้นเมื่อคุณอยู่ในโหมด dired))

การเลือกไฟล์ในไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด

หากคุณต้องการค้นหา / แทนที่ไฟล์ภายในไดเรกทอรีรวมถึงไดเรกทอรีย่อยหลายร้อยรายการต่อไปนี้เป็นวิธีการเลือกไฟล์ทั้งหมดเหล่านี้

โทรหาคนหา (คุณเรียกคำสั่งโดยกด【 Alt + x 】) จากนั้นพิมพ์ชื่อไดเรกทอรี⁖ / Users / mary / myfiles

หมายเหตุ: หากคุณกำลังใช้ emacs บนเทอร์มินัลข้อความที่ไม่ใช่กราฟิกและหาก【 Alt + x 】ไม่ทำงานการกดคีย์ที่เทียบเท่าคือ【 Esc x 】

Emacs จะถามคุณพร้อมท์“ Run find (with args):” หากคุณต้องการแทนที่ไฟล์ HTML ทั้งหมดให้พิมพ์ -name "* html" หากคุณไม่สนใจว่าไฟล์ประเภทใด แต่เพียงแค่ไฟล์ทั้งหมดภายใต้ dir นั้นให้“ -type f”

ตอนนี้ทำเครื่องหมายไฟล์ตามที่อธิบายไว้ข้างต้น

ค้นหา / แทนที่แบบโต้ตอบ

ตอนนี้คุณพร้อมที่จะทำการแทนที่การค้นหาแบบโต้ตอบ เพื่อความง่ายสมมติว่าคุณต้องการแทนที่คำว่า "ด่วน" โดย "super" ตอนนี้เรียก dired-do-query-replace-regexp มันจะแจ้งให้คุณสำหรับสตริง regex และสตริงแทนที่ พิมพ์ "ด่วน" ป้อนจากนั้น "สุดยอด"

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

หากคุณต้องการยกเลิกการดำเนินการทั้งหมดโดยไม่บันทึกการเปลี่ยนแปลงใด ๆ ให้พิมพ์ type Ctrl + g 】จากนั้นออกจาก emacs โดยใช้เมนู〖ไฟล์▸ออกจาก Emacs ac

บันทึกไฟล์ที่เปลี่ยนแปลง

ตอนนี้หลังจากที่คุณผ่านการทดสอบข้างต้นแล้วคุณจะต้องทำอีกหนึ่งขั้นตอนและนั่นคือการบันทึกไฟล์ที่เปลี่ยนแปลง

หากคุณใช้ emacs เวอร์ชัน 22 หรือใหม่กว่าให้โทร ibuffer เพื่อเข้าสู่โหมดการแสดงรายการบัฟเฟอร์จากนั้นพิมพ์【 * u 】เพื่อทำเครื่องหมายไฟล์ที่ไม่ได้บันทึกทั้งหมดแล้วพิมพ์ S เพื่อบันทึกทั้งหมด (นั่นคือ shift-s)

หากคุณใช้ emacs เวอร์ชั่น 21 คุณสามารถทำได้: call list-buffers จากนั้นเลื่อนเคอร์เซอร์ไปยังไฟล์ที่คุณต้องการบันทึกและพิมพ์ s มันจะทำเครื่องหมายไฟล์เพื่อบันทึกการกระทำในภายหลัง พิมพ์ u เพื่อยกเลิกการทำเครื่องหมาย เมื่อเสร็จแล้วให้พิมพ์ x เพื่อเรียกใช้การบันทึกไฟล์ทั้งหมดที่ทำเครื่องหมายเพื่อบันทึก (ใน emacs ไฟล์ที่เปิดเรียกว่า "บัฟเฟอร์" ไม่สนใจสิ่งอื่น ๆ ที่นั่น)

นอกจากตัวเลือกข้างต้นคุณยังสามารถเรียก save-some-buffers 【 Ctrl + xs 】จากนั้น emacs จะแสดงไฟล์ที่ไม่ได้บันทึกแต่ละไฟล์และถามว่าคุณต้องการบันทึกหรือไม่

หมายเหตุ: regex ของ emacs ไม่เหมือนกับ Perl หรือ Python แต่คล้ายกัน สำหรับข้อมูลสรุปและรูปแบบทั่วไปโปรดดู: Emacs Regex


2
คำตอบนี้ควรทำให้เป็นมิตรกับผู้ฝึกหัดมากกว่าคำตอบที่ฉันหวังไว้ ขอบคุณโดยวิธีการกระตุ้นให้ฉันใส่ทุกสิ่งแทนการเชื่อมโยง
Prashant Sharma

คำตอบเริ่มต้นด้วยแหล่งที่มา: เป็นบรรทัดแรก เหตุผลในการวางสำเนาคือบางครั้งลิงก์ภายนอกไปยังบล็อกกลายเป็นล้าสมัยแล้วคำตอบจะไร้ประโยชน์ และตามที่แนะนำโดยเมตาวิกิ ฉันตัดสินใจที่จะคัดลอกทุกสิ่ง
Prashant Sharma

5

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


เพิ่งลองในไดเรกทอรีที่มีไฟล์มากกว่า 14,000 ไฟล์ ใช้เวลาไม่กี่วินาทีในการป๊อปอัปใน Emacs ดังนั้นไม่ช้าอย่างแน่นอน (อีกต่อไป)
Berend de Boer

3

สำหรับบัฟเฟอร์แบบเปิดนี่คือสิ่งที่ฉันทำ:

(defun px-query-replace-in-open-buffers (arg1 arg2)
  "query-replace in all open files"
  (interactive "sRegexp:\nsReplace with:")
  (mapcar
   (lambda (x)
     (find-file x)
     (save-excursion
       (goto-char (point-min))
       (query-replace-regexp arg1 arg2)))
   (delq
    nil
    (mapcar
     (lambda (x)
       (buffer-file-name x))
     (buffer-list)))))

3

M-X Diredและ t เพื่อทำเครื่องหมายไฟล์ทั้งหมดและQเพื่อแทนที่ข้อความในไฟล์ทั้งหมด คุณสามารถขยายไดเรกทอรีย่อยโดยใช้iคำสั่งก่อนที่จะแทนที่แบบสอบถาม ข้อมูลสำคัญที่ฉันเพิ่มคือถ้าคุณให้คำนำหน้า (control-u) กับคำสั่ง i มันจะแจ้งให้คุณหาเรื่องและอาร์กิวเมนต์ -R จะขยายซ้ำทั้งหมดsubdirs ในdiredบัฟเฟอร์ ดังนั้นตอนนี้คุณสามารถค้นหาค้นหาทุกไฟล์ในไดเรกทอรีทั้งหมด


2

ตัวเลือกอื่นคือการใช้ การค้นหา Icicles นี่คือการค้นหาที่เพิ่มขึ้นที่แตกต่างกันซึ่งใช้การป้อนข้อมูล minibuffer ของคุณกับการค้นหายอดนิยม *Completions*ในขณะที่คุณปรับเปลี่ยนการป้อนข้อมูลปัจจุบันของคุณชุดของความนิยมที่ตรงกับที่มีการปรับปรุงในบัฟเฟอร์

คุณสามารถค้นหาไฟล์บัฟเฟอร์หรือตำแหน่งบุ๊กมาร์กใด ๆ ก็ได้ซึ่งคุณสามารถเลือกได้โดยใช้รูปแบบ minibuffer (เช่น regexp)

เมื่อคุณเยี่ยมชมการค้นหาที่คุณสามารถแทนที่ตามความต้องการทั้งการเข้าชมทั้งหมดหรือเพียงแค่ส่วนหนึ่งของมันที่ตรงกับการป้อนข้อมูล minibuffer ปัจจุบันของคุณ การเปลี่ยนตามความต้องการหมายความว่าคุณไม่ได้สอบถามเกี่ยวกับการค้นหาที่เข้ามาแต่ละครั้ง คุณเข้าถึงเพลงฮิตที่คุณต้องการโดยตรงในลำดับใดก็ได้ วิธีการนี้จะมีประสิทธิภาพมากขึ้นกว่าแบบสอบถามแทนที่ถ้าคุณมีจำนวน จำกัด ของการเปลี่ยนที่จะทำให้คุณข้ามหมดจดy/nกระตุ้น

การค้นหาอยู่เหนือบริบทการค้นหาที่คุณกำหนด - คุณไม่ จำกัด เฉพาะการค้นหาข้อความทั้งหมดในไฟล์เป้าหมาย (เช่นคุณสามารถข้ามความคิดเห็นหรือส่วนของโปรแกรมบางประเภท) ตัวอย่างง่าย ๆ ของบริบทการค้นหาคือบรรทัดดังตัวอย่างgrep , แต่บริบทสามารถเป็นบล็อกข้อความที่ตรงกับรูปแบบใด ๆ ที่คุณต้องการ โดยทั่วไปคุณจะกำหนดบริบทการค้นหาโดยใช้ regexp แต่คุณสามารถใช้ฟังก์ชั่นแทน นอกเหนือจากการกำหนดของคุณเองแล้วยังมีคำสั่งการค้นหา Icicles ที่กำหนดไว้ล่วงหน้าสำหรับบริบทประเภทต่างๆ: บล็อกของคุณสมบัติข้อความหรือคุณสมบัติการซ้อนทับสิ่งสิ่งของ ณ จุด ฯลฯ

นอกจากนี้คุณยังสามารถเรียงลำดับการค้นหายอดนิยมในคำสั่งการเรียงลำดับต่างๆเพื่อการเข้าถึง / การนำทางที่ง่ายขึ้น


2

find-name-dired ตกลง แต่:

  • ไฟล์ทั้งหมดที่คุณได้รับตรงกับ regexp เดียว
  • find-diredมีความยืดหยุ่นมากกว่าในเรื่องนั้น แต่มันก็ถูกสร้างขึ้นมาเพื่อใช้กฎทั่วไป (แม้ว่าพวกเขาจะซับซ้อนโดยพลการ) และแน่นอนfindมีภาษาที่ซับซ้อนและเป็นของตัวเอง
  • หากคุณต้องการดำเนินการกับไฟล์บางส่วนเท่านั้นที่มีชื่อถูกรวบรวมในfind(-name)-diredบัฟเฟอร์คุณต้องทำเครื่องหมายหรือลบ / ละเว้นบรรทัดของไฟล์ที่คุณไม่ต้องการดำเนินการ

ทางเลือกคือการใช้Dired +คำสั่งกระทำที่เกี่ยวกับ (ก) ไฟล์ที่มีการทำเครื่องหมายและ (ข) การทำเครื่องหมายไฟล์ทั้งหมด (หรือไฟล์ทั้งหมดถ้าไม่มีจะถูกทำเครื่องหมาย) ในไดเรกทอรีย่อยทำเครื่องหมาย ... พบซ้ำ สิ่งนี้จะช่วยให้คุณสามารถควบคุมการเลือกไฟล์ได้อย่างง่ายดาย คำสั่ง "ที่นี่และด้านล่าง" เหล่านี้ทั้งหมดอยู่ในคีย์คำนำหน้าM-+ในโหมด Dired

ตัวอย่างเช่นM-+ QเดียวกันกับQ--- query-replace แต่ไฟล์เป้าหมายทั้งหมดที่ทำเครื่องหมายไว้ใน dir ปัจจุบันและในส่วนย่อยที่ทำเครื่องหมายลงล่างลง ...

ใช่ทางเลือกที่จะใช้เช่นที่นี่และด้านล่างคำสั่งคือการแทรก subdirs และ subdirs Qของพวกเขาซ้ำแล้วใช้คำสั่งระดับบนเช่น แต่บ่อยครั้งที่สะดวกสบายไม่ต้องรำคาญกับตำบลที่แทรกอยู่

และในการทำเช่นนั้นคุณต้องมีวิธีที่รวดเร็วในการแทรกส่วนย่อยทั้งหมดซ้ำๆ ที่นี่เช่นกันDired +สามารถช่วยได้ M-+ M-iแทรกตำบลที่ทำเครื่องหมายไว้ทั้งหมดและตำบลที่ทำเครื่องหมายไว้แล้วซ้ำ นั่นคือมันเป็นเหมือนM-i(ซึ่งแทรกส่วนตำบลที่ทำเครื่องหมายไว้ในDired + ) แต่มันทำหน้าที่ซ้ำในส่วนย่อย

(ทุกเช่น "ที่นี่และด้านล่าง" Dired +คำสั่งที่มีอยู่ในเมนูหลาย > ทำเครื่องหมายที่นี่และที่ด้านล่าง .)

นอกจากนี้คุณยังสามารถดำเนินการ Dired บน Emacs filesetซึ่งเป็นชุดที่ถูกบันทึกไว้ในชื่อของไฟล์อยู่ที่ใดก็ได้ และถ้าคุณใช้Iciclesคุณสามารถเปิดบัฟเฟอร์ Dired สำหรับไฟล์ในชุดไฟล์หรือรายการไฟล์ที่บันทึกประเภทอื่น ๆ

คุณยังสามารถบุ๊กมาร์กบัฟเฟอร์ Dired ใด ๆ รวมถึงบัฟเฟอร์ที่คุณสร้างfind(-name)-diredขึ้นด้วย วิธีนี้ช่วยให้คุณสามารถกลับไปยังชุดดังกล่าวได้อย่างรวดเร็ว (เช่นชุดโครงการ) ในภายหลัง และถ้าคุณใช้คั่นหน้า +จากนั้นทำบุ๊กมาร์กบันทึกเร็กคอร์ด Dired (a) lsสวิตช์ของมัน(b) ไฟล์ที่ถูกทำเครื่องหมาย (c) ไดเรกทอรีย่อยที่ถูกแทรกและ (d) ไดเรกทอรี (ย่อย) ที่ถูกซ่อนอยู่ ทั้งหมดนี้จะถูกกู้คืนเมื่อคุณ "ข้าม" ไปยังบุ๊คมาร์ค ส่วนที่คั่นไว้ +ยังช่วยให้คุณสามารถบุ๊กมาร์กต้นไม้ของบัฟเฟอร์ Dired --- กระโดดไปยังที่คั่นหนังสือเพื่อคืนค่าบัฟเฟอร์ทั้งหมดในต้นไม้


ใครก็ตาม: สนใจที่จะอธิบายว่าทำไมคุณลงคะแนนคำตอบนี้
ดึง

1

ผมอยากจะขอแนะนำเครื่องมือที่ดีอีกหนึ่งซึ่งยังไม่ได้รับการกล่าวถึงเลยคือพวงมาลัย

มันเป็นการทดแทนที่ยอดเยี่ยมสำหรับการดำเนินการของ Emacs มาตรฐานที่เกี่ยวข้องกับการทำให้สมบูรณ์, การค้นหาและอื่น ๆ โดยเฉพาะอย่างยิ่งhelm-find-filesอนุญาตให้ทำการแทนที่คิวรี่ (รวมถึง regexp) ภายในไฟล์ที่เลือกหลายไฟล์

เพียงแค่เปิดhelm-find-filesทำเครื่องหมายไฟล์ที่เกี่ยวข้องด้วยM-SPCจากนั้นใช้F6หรือF7เพื่อเรียกใช้การแทนที่แบบสอบถามหรือแบบสอบถามแทนที่ regexp ในไฟล์ที่เลือก


สามารถhelm-find-filesทำเครื่องหมายโดย regexp แทนได้M-SPCหรือไม่
Nordlöw

-2

ไม่ใช่ Emacs แต่ xxdiff มาพร้อมกับเครื่องมือที่เรียกว่า xx-rename ซึ่งจะทำเช่นนั้นสำหรับหลาย ๆ สตริงในเวลาเดียวกัน (เช่นจากถึงจากถึงจาก FROM TO) ด้วยการแจ้งเตือนแบบโต้ตอบบันทึกการสำรองข้อมูลของไฟล์ที่ถูกดัดแปลงทั้งหมด บันทึกการเปลี่ยนแปลงที่เกิดขึ้นกับบริบท นั่นคือสิ่งที่ฉันมักจะใช้เมื่อฉันทำการต่ออายุใหญ่ / ทั่วโลก

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