ripgrep 15.0
(github.com/BurntSushi)- ripgrep 15.0 เป็นรุ่นหลักที่มีการอัปเดตหลากหลาย ทั้งการแก้บั๊ก ปรับปรุงประสิทธิภาพ และเพิ่มความสามารถใหม่
- มีการแก้บั๊กหลายรายการเกี่ยวกับ การใช้กฎ gitignore และปรับ การใช้หน่วยความจำให้เหมาะสม เมื่อต้องจัดการไฟล์ขนาดใหญ่
- เพิ่มการรองรับแพลตฟอร์ม Windows aarch64 และยุติการรองรับ powerpc64
- ความสามารถใหม่บางส่วนได้แก่ รองรับ --json พร้อมแฟล็กทดแทนพร้อมกัน และรองรับวงเล็บปีกกาซ้อนใน globs
- การปรับปรุง ประสิทธิภาพโดยรวม การแก้ข้อผิดพลาด และการเพิ่มความสะดวกในการใช้งาน ช่วยเพิ่มประสิทธิผลของนักพัฒนา
ภาพรวมของ ripgrep 15.0
ripgrep 15.0 เป็นรุ่นเมเจอร์ล่าสุดของ ripgrep โดยเน้นที่ การแก้บั๊ก การปรับปรุง ประสิทธิภาพ เล็กน้อย และการเพิ่ม ความสามารถใหม่ ขนาดเล็ก
ripgrep เป็นเครื่องมือสำหรับค้นหาแพตเทิร์นนิพจน์ปรกติแบบเรียกซ้ำในไดเรกทอรีปัจจุบันโดยอิงตามบรรทัด
โดยปกติจะปฏิบัติตามกฎ gitignore และข้ามไฟล์/ไดเรกทอรีที่ซ่อนอยู่รวมถึงไฟล์ไบนารีโดยอัตโนมัติ
การเปลี่ยนแปลงสำคัญ
- แก้ไข บั๊กที่เกี่ยวข้องกับการจับคู่ gitignore หลายรายการ
- แก้ปัญหาบั๊กที่ถูกรายงานบ่อยเกี่ยวกับการใช้กฎ gitignore ของไดเรกทอรีแม่
- แก้บั๊ก การใช้หน่วยความจำเพิ่มขึ้น ที่เกิดขึ้นเมื่อประมวลผลไฟล์ gitignore ขนาดใหญ่มาก
- เปลี่ยนให้
rg -vf fileจับคู่ทั้งหมดเมื่อ file ว่างเปล่า - ตอนนี้แฟล็ก
-r/--replaceทำงานร่วมกับ--jsonได้อย่างถูกต้อง - รองรับการมองว่า รีโพซิทอรี Jujutsu(jj) บางประเภทเป็นเหมือนรีโพซิทอรี git ทำให้ ripgrep ปฏิบัติตาม gitignore ของ jj
- Globs รองรับ วงเล็บปีกกาซ้อน
การรองรับแพลตฟอร์ม
- มีการจัดเตรียมไบนารีรีลีสสำหรับ Windows aarch64 เพิ่มใหม่
- จะไม่มีการจัดเตรียมไบนารีรีลีสสำหรับ powerpc64 อีกต่อไป
- ยุติเนื่องจากปัญหาในเวิร์กโฟลว์ CI release และสามารถร้องขอได้หากต้องการการทดสอบและการรองรับ
- ไบนารีของ ripgrep ถูกคอมไพล์ด้วย LTO (การเพิ่มประสิทธิภาพทั้งกระบวนการลิงก์) ซึ่งช่วยเพิ่มประสิทธิภาพเล็กน้อยและลดขนาดไฟล์
การปรับปรุงประสิทธิภาพ
- บน Windows หากไม่ได้ใช้ตัวเลือก
-z/--search-zipจะมีการ ปิดการค้นหา helper binary เพื่อเพิ่มประสิทธิภาพ - บน Windows มีการเพิ่มความเร็วด้วยการ ข้ามการทำ path normalization เมื่อแสดงผลไฮเปอร์ลิงก์
- ปรับปรุงประสิทธิภาพการจัดการ ค่าขนาดใหญ่ เมื่อใช้
-A/--after-context
การแก้บั๊ก
- แก้ไขปัญหาที่เกี่ยวข้องกับ gitignore หลายรายการ เช่น การไม่ใช้ gitignore ของไดเรกทอรีแม่
- แก้ให้คำสั่ง
rg -vf fileกับไฟล์ว่างจับคู่ทั้งหมด - เพิ่มการจัดการให้ ไม่สนใจ UTF-8 BOM marker ใน
.gitignoreเป็นต้น - ปรับการใช้หน่วยความจำให้เหมาะสม เมื่อประมวลผลไฟล์ gitignore ขนาดใหญ่
- แก้ข้อผิดพลาด การแสดงจำนวนไบต์ที่ค้นหา เมื่อใช้
--stats - แก้ข้อผิดพลาดในการจัดการ glob ที่ลงท้ายด้วย
. - แก้ปัญหา การแสดงว่าเกินจำนวนแมตช์ เมื่อใช้
-m/--max-countร่วมกับ-U/--multiline - เปลี่ยนให้เมื่อใช้แฟล็ก
-r/--replaceมีการ คงตัวปิดบรรทัด ไว้ - แก้ข้อผิดพลาด การกลับด้าน exit code เมื่อใช้
-q --files-without-matchร่วมกัน - แก้ความไม่สอดคล้องของเอกสารระหว่าง
-c/--countและ--files-with-matches - แก้ปัญหา panic ที่เกิดขึ้นไม่บ่อยกับนิพจน์ปรกติขนาดใหญ่และอินพุตขนาดใหญ่
- จัดการการ escape ขีดกลางในชื่อแฟล็กตัวเลือกบน man page
- จัดการการคอมไพล์แบบสแตติกของ PCRE2 ในรีลีส macOS aarch64
- แก้บั๊กฟิลเตอร์ ละเว้นไดเรกทอรีแม่ เมื่อค้นหาไฟล์ซ่อนที่อยู่ใน whitelist
- แก้ปัญหา สถิติสรุปไม่ถูกต้อง เมื่อใช้แฟล็ก
--json - แก้ข้อผิดพลาดในการจัดการ gitignore เมื่อค้นหาด้วยพาธสัมบูรณ์และ global gitignore
- แก้ปัญหา panic ที่เคยเกิดขึ้นเมื่อใช้
-U/--multilineร่วมกับ-r/--replace
การปรับปรุงความสามารถ
- ชุดประเภทไฟล์เริ่มต้นถูก ขยาย และ ปรับปรุง อย่างมาก
- ปรับให้
-r/--replaceเข้ากันได้กับ--json - ปรับปรุงระบบเติมคำสั่งอัตโนมัติของ fish shell ให้สะท้อน ไฟล์คอนฟิก ของ ripgrep
- เพิ่ม italic เป็นคุณสมบัติสไตล์ที่ใช้กับ
--colorได้ - ปฏิบัติต่อไดเรกทอรี
.jjเป็นรีโพซิทอรี git - เมื่อใช้มัลติเธรด เพิ่มความสามารถในการจัดคิวการค้นหาตาม ลำดับไฟล์ที่ระบุจาก CLI
- เพิ่มอาร์ติแฟกต์รีลีส
aarch64สำหรับ Windows - เพิ่ม highlight color type ที่ช่วยให้จัดสไตล์ข้อความที่ไม่ตรงกันภายในบรรทัดที่มีการแมตช์ได้
- เพิ่มความสามารถ nested alternates ให้กับ globs และ crate globset
- ปรับปรุงการเติมคำสั่งอัตโนมัติของ
--hyperlink-formatบน bash, fish และ zsh
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ripgrep เป็นเครื่องมือที่ช่วยประหยัดเวลาให้ฉันได้มากจริง ๆ ตลอดหลายปีที่ผ่านมา เป็นสิ่งที่ต้องติดตั้งเป็นอย่างแรกทุกครั้งเมื่อเริ่มใช้ระบบใหม่ โดยเฉพาะเวลาสำรวจ codebase เก่า ๆ คือขาดไม่ได้เลย ข้อเสียดายนิดหนึ่งคือแม้จะใช้ตัวเลือก
-F(มองเป็น literal) ก็ยังมีบางอักขระที่ถูกมองเป็นอักขระพิเศษและต้อง escape อยู่ดี จำไม่ได้แน่ชัดว่าเป็นตัวไหน แต่ถึงอย่างนั้นก็ยังดีใจทุกครั้งที่เห็น ripgrep ออกอัปเดตต่อเนื่อง-F/--fixed-stringsปิดความสามารถของ regular expression ในแพตเทิร์นแบบ 100% และจะตีความเป็น literal เท่านั้น ถ้ายังต้อง escape อยู่ สาเหตุน่าจะมาจาก shell ที่บังคับให้ทำมากกว่าrg เป็นเครื่องมือที่ให้ความรู้สึกเหมือนเวทมนตร์ แต่จริง ๆ แล้วมันคือผลลัพธ์ของวิศวกรรมที่ยอดเยี่ยม การปรับปรุงอย่างต่อเนื่อง และการดึงประสิทธิภาพของฮาร์ดแวร์สุดน่าทึ่งที่พวกเราใช้กันทุกวันออกมาได้อย่างเต็มที่ อีกทั้งยังเป็นนวัตกรรมที่เปิดทางให้นักพัฒนาสามารถสำรวจและทำความเข้าใจโค้ดได้เร็วขึ้น โดยไม่จำเป็นต้องสร้างมาตรฐานแยกต่างหากแบบ lsp
smithingในบริบทนี้หมายถึงอะไรcodebase ของ ripgrep เป็นตัวอย่างชั้นยอดของการ "เตรียมเครื่องดื่มแล้วนั่งลงบนเก้าอี้ตัวที่สบายที่สุด เพื่ออ่านซอฟต์แวร์คุณภาพสูงอย่างเพลิดเพลิน" คลิกไล่ดูโค้ดตรงนั้นตรงนี้แล้วต้องทึ่งตลอด
เหมือนกับ fd, rg เป็นเครื่องมือ command line ที่ใช้งานแล้วเพลินจริง ๆ ฉันชอบเครื่องมือใหม่ ๆ แบบอิงคำสั่งพวกนี้มาก
rg <string>หรือfd <string>ก็พอแล้วฟีเจอร์ที่ส่วนตัวอยากให้เพิ่มคือแฟลก "extension" ที่ทำงานคล้าย
-gแต่ตีความอาร์กิวเมนต์ที่ป้อนเข้าไปเป็นนามสกุลไฟล์ (เช่นrg -e c,h) เพราะเวลาจะใช้ glob pattern ส่วนใหญ่ก็เพื่อจับคู่นามสกุลไฟล์นี่แหละ-t/--typeไหม สามารถใช้แบบ-tcตามตัวอย่างได้ ถ้าเป็นนามสกุลที่ ripgrep ยังไม่มี ก็สามารถนิยาม type เองได้ripgrep เป็นหนึ่งในเหตุผลหลักที่ทำให้ฉันเริ่มสนใจ rust มันทำงานได้สมบูรณ์มากจนพอรู้ว่าเขียนด้วย rust ก็ยิ่งอยากรู้จักภาษานี้มากขึ้น หลายปีผ่านไปจนถึงตอนนี้ก็ยังใช้
rgทุกวันไม่นานมานี้เพิ่งค้นพบตัวเลือก
--replaceและประทับใจมาก ใช้มันคู่กับ--typeแล้วก็เสียดายที่ก่อนหน้านี้ไม่รู้เลยว่ามีฟีเจอร์ดี ๆ แบบนี้อยู่ ต่อจากนี้คงต้องอ่าน release notes ให้ละเอียดขึ้นและตามฟีเจอร์ใหม่ ๆ ให้ทันมากขึ้น อีกทั้งก็ดีใจที่มีการปรับปรุงการทำงานร่วมกับ jjเป็นเครื่องมือที่ยอดเยี่ยมและใช้งานง่ายมาก ตอนแรกเริ่มใช้บน Linux ตอนนี้ก็ใช้บน Windows ด้วย เพราะเครื่องมือนี้ทำให้ตอนนี้ฉันนำ regular expression มาใช้ค้นหาโดยตรงแทน wildcard แล้ว
rg --filesก็มีประโยชน์ด้วยสัปดาห์นี้ฉันทำ bash function สำหรับรัน ripgrep เฉพาะกับไฟล์ที่ git ติดตามไว้
ทำให้ค้นหาได้เร็วขึ้นมากในไดเรกทอรีที่มีไฟล์ไบนารีหรือ dot file เยอะ ๆ ถ้าจะค้นหา dot file ต้องใช้ตัวเลือก
-uuแต่ตัวเลือกนี้จะค้นหาไฟล์ไบนารีด้วย พอมีไฟล์เป็นร้อย ๆ ไฟล์git ls-filesเองก็เริ่มช้าgit ls-filesอยู่แล้ว อ้างอิงไว้ด้วยว่า-uuหมายถึงสั่งให้ ripgrep ไม่สนใจ gitignore และ hidden file แต่ก็ยังข้ามไฟล์ไบนารีอยู่ ถ้าจะรวมไฟล์ไบนารีด้วยต้องใช้-uuuปัญหาใหญ่สุดของฟังก์ชันนี้คือถ้าใช้กับ repo ของ Linux kernel จะเจอ error ว่า argument list ยาวเกินไป เลยลองเปลี่ยนไปใช้ xargs ถ้ามีตัวอย่างสถานการณ์ที่git ls-files -z | xargs -0 rg ...เร็วกว่าrg ...ตรง ๆ ก็ช่วยแชร์ด้วย-.ได้แทน-uu(สำหรับค้นหา hidden file อย่างเดียว) คงจะดีถ้าค้นหา hidden file ที่ git ติดตามได้ แต่ overhead จากการ query รายชื่อไฟล์ดูจะมากพอจนแม้เขียนด้วย Rust ก็ยังเลี่ยงไม่ได้git grepไหมฉันใช้ ripgrep ในงานทุกวัน ทั้งบน command line และเวลาใช้ค้นหาใน vscode ก็ใช้ตลอด ขอขอบคุณ burntsushi