Haliviq
CLI

fzf + ripgrep เร็วกว่า grep -r เมื่อทำงานใน monorepo

rg --files | fzf ใช้กระโดดไปไฟล์แบบ fuzzy และเอา rg ไปครอบด้วย fzf ที่มี preview จะได้การค้นเนื้อหาแบบเห็นผลทันที ใน monorepo ใหญ่ ๆ การค้นหาของเราเร็วจนแทบไม่ต้องรอ เหตุผลหลักคือ ripgrep เคารพ .gitignore และข้ามโฟลเดอร์ build ให้เองตั้งแต่ต้น

เกิดอะไรขึ้น

ใน monorepo ของเรา grep -r ช้ามาก มันไล่เข้าไปใน node_modules, build output และ cache แล้วคืนผลลัพธ์กองโตจากไฟล์ที่เราไม่เคยอยากค้น

การหาไฟล์ตามชื่อก็ไม่สะดวกเหมือนกัน เรามักพิมพ์ path ยาว ๆ จากความจำ หรือไล่คลิกใน tree ของ editor แทนที่จะกระโดดไปหาไฟล์ที่ต้องการทันที

ทำไมถึงเป็นแบบนั้น

grep -r ธรรมดาจะค้นทุกอย่างใต้โฟลเดอร์ ยกเว้นเราจะระบุสิ่งที่ต้องข้ามเองทีละอย่าง ใน monorepo ที่มีหลาย package นั่นรวมโฟลเดอร์ dependency และ build ขนาดมหึมา และเวลาส่วนใหญ่หมดไปกับไฟล์ที่ไม่เกี่ยวข้อง

ripgrep ทำงานต่างออกไปโดยค่าเริ่มต้น มันเคารพ .gitignore ข้ามไฟล์ hidden กับไฟล์ binary และค้นแบบขนาน เพราะข้ามโฟลเดอร์ build ที่ถูก ignore ให้เอง มันจึงทำงานน้อยลงมาก นี่คือเหตุผลหลักที่รู้สึกว่าเร็วแทบทันที แม้ regex engine ที่เร็วก็ช่วยอีกแรง

ตอนนี้เราทำอย่างไร

เราจับคู่ ripgrep กับ fzf ส่ง rg --files เข้า fzf จะได้การกระโดดไปไฟล์แบบ fuzzy ที่แสดงเฉพาะไฟล์ที่ไม่ถูก ignore และเพิ่ม preview เพื่อดูต้นไฟล์ก่อนเปิดได้

ส่วนการค้นเนื้อหา fzf สั่งรัน rg ใหม่ทุกครั้งที่พิมพ์ได้ ผลลัพธ์เลยอัปเดตสดตามที่พิมพ์ เราเก็บทั้งหมดเป็น shell alias การค้นจึงใช้แค่ไม่กี่ปุ่ม ไม่ต้องพิมพ์ grep ยาว ๆ พร้อมรายการที่ต้องข้าม

shellbash
# Fuzzy file jump with a preview
rg --files | fzf --preview 'head -n 50 {}'

# Live content search
fzf --disabled --bind 'change:reload:rg --line-number --no-heading {q} || true'

เช็กลิสต์สั้น ๆ

  1. 1ติดตั้ง ripgrep และ fzf ด้วย package manager
  2. 2ใช้ rg --files | fzf กระโดดไปไฟล์แบบ fuzzy
  3. 3เพิ่มคำสั่ง preview เพื่อดูเนื้อไฟล์ระหว่างเลื่อน
  4. 4ใช้ fzf กับ reload เพื่อรัน rg สดทุกครั้งที่พิมพ์
  5. 5ครอบคำสั่งที่ใช้บ่อยด้วย shell alias

จำไว้สั้น ๆ

ใช้ ripgrep เพื่อความเร็วและค่าเริ่มต้นที่สมเหตุสมผล แล้วเอา fzf มาครอบเพื่อค้นแบบโต้ตอบ

เราอยากฟังว่าคุณกำลังสร้างอะไรอยู่

คุยกับเรา