วิธีที่ง่ายที่สุดในการค้นหาไฟล์ที่มีประโยชน์ทั้งหมดในโครงการเดียวคืออะไร?


28

เป็นวิธีที่ง่ายที่สุดในการค้นหา regexp ทั่วเนื้อหาไฟล์ทั้งหมดในโครงการปัจจุบันข้ามไฟล์ที่ไม่มีประโยชน์อะไร

ไฟล์ที่ไม่มีประโยชน์คือไฟล์ที่รวบรวม, ไลบรารีที่อิมพอร์ต, ไฟล์ควบคุมเวอร์ชัน ฯลฯ

ฉันรู้rgrepแต่มันก็แค่ค้นหาทุกอย่าง มีแพคเกจที่ค้นหา 'inteligently' และรู้เกี่ยวกับภาษาการเขียนโปรแกรมที่แตกต่างกันดังนั้นฉันไม่ต้องกำหนดค่าสำหรับแต่ละโครงการหรือไม่


ความคิดเห็น "มันแค่ค้นหาทุกอย่าง" ของคุณrgrepมีความสับสนเล็กน้อยเนื่องจากจะยกเว้นไฟล์ทั้งหมดที่ตรงกับเกณฑ์ "ไฟล์ไร้ประโยชน์" ของคุณตามค่าเริ่มต้น
phils

คำตอบ:


32

โครงการค้นหาตามภายใน Emacs สามารถทำได้โดยใช้กระสุน

อนุญาตสำหรับการกำหนดค่าข้ามไฟล์ (ใน<projectroot>\.projectileไฟล์) สำหรับแต่ละโครงการหรือระบุไดเรกทอรีย่อยเพื่อตรวจสอบและละเว้นไฟล์อื่น ๆ

มันสามารถทำงานgrep, ack(ต้องack-and-a-half.el) และag( ag.el) บนไฟล์ภายในโครงการที่กำหนดไว้ (ขึ้นทั้งใน.projectileไฟล์หรือโดยการหาไฟล์ VC ได้รับการสนับสนุนในการกำหนดรากโครงการ)

คำสั่งที่มีประโยชน์

(เกี่ยวกับการค้นหาไฟล์ที่มีประโยชน์)

ตาม Projectile Readme

  • C-c p s g :: เรียกใช้grepไฟล์ในโครงการ
  • C-c p s a :: ทำงานackในโครงการ ต้องมี ack-and-a-half
  • C-c p s s :: ทำงานagในโครงการ ต้องมี ag.el
  • C-c p f :: แสดงรายการของไฟล์ทั้งหมดในโครงการ
  • C-c p d :: แสดงรายการของไดเรกทอรีทั้งหมดในโครงการ
  • C-c p a :: สลับระหว่างไฟล์ที่มีชื่อเดียวกัน แต่มีนามสกุลต่างกันในโครงการ
  • C-c p o:: ทำงานmulti-occurบนบัฟเฟอร์โครงการทั้งหมดที่เปิดอยู่

สิ่งเหล่านี้จะกระทำกับไฟล์ที่กำหนดว่าเป็นส่วนหนึ่งของโครงการ (หรือพบเมื่อสร้าง / สร้างแคชใหม่)


ขอบคุณคำสั่ง projectile ที่ฉันสามารถใช้สำหรับสิ่งนี้คืออะไร
Malabarba

แก้ไขให้รวมส่วนย่อยของคำสั่ง (ผู้ที่เกี่ยวข้องกับการค้นหา, ค้นหาไฟล์และ dired) รายการทั้งหมดอยู่ในแพ็คเกจ readme
Jonathan Leech-Pepin

13

ค้นหาโครงการกว้างของไฟล์ที่เกี่ยวข้องเท่านั้นที่สามารถทำได้โดยใช้agaka the_silver_searcher

ทำไมต้องเป็น ag?

  • มันไม่สนใจรูปแบบไฟล์ของคุณ.gitignore, ,.hgignore คุณสามารถเลือกให้การค้นหาของคุณไม่ใช้รายการเพิกเฉยจากรายการเพิกเฉยที่ควบคุมเวอร์ชันได้โดยใช้สวิตช์svn:ignore-U
  • หากมีไฟล์ใน repo ต้นทางของคุณคุณไม่ต้องการค้นหาเพียงเพิ่มรูปแบบของ.agignoreไฟล์ลงในไฟล์
    • คุณสามารถใส่.agignoreไฟล์ส่วนกลางในไฟล์ของคุณ$HOMEจากนั้นคุณสามารถใส่.agignoreไฟล์เฉพาะโครงการเพิ่มเติมในรูทโครงการของคุณ

การตั้งค่าagและ emacs

  • ติดตั้งagaka the_silver_searcherบนระบบของคุณ
  • ตั้งค่า.agignoreไฟล์ ฉันชอบที่จะมีเพียงระดับโลกแฟ้มในของฉัน.agignore$HOME
  • ติดตั้งagแพ็คเกจ (มีอยู่ใน Melpa)
  • จากนั้นคุณสามารถใช้ag-projectหรือag-project-regexpฟังก์ชั่น (ที่มาพร้อมกับagแพ็คเกจ) เพื่อค้นหาไฟล์ทั้งโครงการ
    • โดยค่าเริ่มต้นฟังก์ชั่นเหล่านี้ใช้รากของ VCS ที่ repo เป็นไดเรกทอรีที่จะค้นหาใน. ag-project-root-functionคุณสามารถแทนที่โดยการตั้งค่าหรือการปรับแต่ง
    • แม้ว่าโปรเจ็กต์ของคุณไม่ได้ควบคุมคอมไพล์คุณสามารถทำเครื่องหมายรูทโปรเจ็กต์สำหรับการค้นหาตามag-project/ ag-project-regexpโดยใส่.gitโฟลเดอร์ว่างในรูทโปรเจคของคุณ ag-project-root-functionจากนั้นคุณจะได้ไม่ต้องปรับแต่ง

4

หากโครงการของคุณใช้ Git คุณจะต้องcounsel https://github.com/abo-abo/swiper

  • counsel-git เพื่อค้นหาไฟล์

  • counsel-git-grep เพื่อ grep

การพึ่งพาเพียงอย่างเดียวคือคอมไพล์

การ grepping ข้อความเร็วกว่าเครื่องมือค้นหาเงิน (ag)

ที่ปรึกษายังมีเครื่องมือที่ทรงพลังอื่น ๆ ตัวอย่างเช่นหลังจากทำงานcounsel-git-grepคุณสามารถกดC-c C-oและC-x C-qไปที่wgrep-modeการแทนที่ข้อความในขอบเขตโครงการได้อย่างง่ายดาย

มีบทความhttps://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/อธิบายรายละเอียด บทความนั้นใช้counsel-ag(คำสั่งอื่นที่สร้างไว้ในที่ปรึกษา) แต่cousnel-git-grepใช้กระบวนการทำงานที่เหมือนกันทุกประการ


แต่ทำไม grepping ข้อความจึงมาเร็วกว่า ag? คุณช่วยอธิบายรายละเอียดได้ไหม?
denis631

1
agนอกจากนี้ยังเป็นโปรแกรม grep git-grepเช่น ฉันไม่สามารถพูดได้ว่าเร็วกว่าอะไร ดูgithub.com/BurntSushi/ripgrepซึ่งเปรียบเทียบประสิทธิภาพของโปรแกรม grep ยอดนิยม (รวมถึงagและgit-grep)
chen bin

1

คำตอบแรกนั้นสวยงาม แต่ก็ยังให้รายละเอียดที่สำคัญเกี่ยวกับ Emacs รุ่นใหม่ ฉันรู้จัก Emacs ด้วยตัวเองดังนั้นผู้มาใหม่คนอื่น ๆ อาจไม่ทราบเรื่องนี้ กำหนดเป้าหมายของคุณคือค้นหาข้อความภายในไฟล์ในโครงการจากนั้นคุณจะติดตั้ง Projectile โดยใช้ที่เก็บ MELPA ก่อน

สิ่งนี้จะติดตั้งแพคเกจใน. emacs.d และเพิ่มการกำหนดค่าพื้นฐานบางอย่างให้กับ. emacs ในไดเรกทอรี $ USER (สมมติว่าคุณได้สร้างไฟล์. emacs) เช่นต้องการ Projectile ในการติดตั้ง Emacs ของคุณ

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

คำตอบที่ได้รับการยอมรับกล่าวถึงคำสั่งต่อไปนี้:

C-c p s g

สิ่งนี้จะไม่ทำงานยกเว้นว่าคุณจะกำหนดค่า Projectile ด้วยคำนำหน้าคีย์แมปนี้ แต่ฉันกำหนดค่าให้ใช้ Cc Cp เป็นคำสั่งสำหรับ Project in .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

ตอนนี้ฉันสามารถทำการค้นหาข้อความในไฟล์ในโครงการโดยใช้ grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

หากต้องการแยกมันออก C-c C-pจะเรียก Projectile และs gทำการค้นหา grep คุณจะได้ผลลัพธ์ที่สวยงามเช่นนี้โดยสมมติว่าการค้นหาของคุณคือvisit_contactและคุณกำลังค้นหา Ruby's rspec ในโครงการ:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.