2 điểm bởi GN⁺ 2025-10-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • ripgrep 15.0 là một bản phát hành lớn bao gồm nhiều cập nhật như sửa lỗi, cải thiện hiệu năng và bổ sung tính năng mới
  • Nhiều lỗi liên quan đến áp dụng quy tắc gitignore đã được sửa, đồng thời tối ưu bộ nhớ khi xử lý tệp dung lượng lớn
  • Bổ sung hỗ trợ nền tảng Windows aarch64 và ngừng hỗ trợ powerpc64
  • Một số tính năng mới gồm hỗ trợ đồng thời --json và cờ thay thế, hỗ trợ ngoặc nhọn lồng nhau trong globs
  • Nhìn chung, các cải tiến về hiệu năng, sửa lỗi và tăng tính tiện dụng giúp nâng cao năng suất cho lập trình viên

Tổng quan về ripgrep 15.0

ripgrep 15.0 là bản phát hành major mới nhất của ripgrep, chủ yếu bao gồm sửa lỗi, cải thiện hiệu năng nhỏ và bổ sung một số tính năng mới quy mô nhỏ

ripgrep là công cụ tìm kiếm đệ quy các mẫu biểu thức chính quy theo từng dòng trong thư mục hiện tại
Mặc định, công cụ tuân theo các quy tắc gitignore và tự động bỏ qua các tệp/thư mục ẩn cũng như tệp nhị phân

Các thay đổi chính

  • Đã sửa nhiều lỗi liên quan đến khớp gitignore
    • Khắc phục lỗi thường được báo cáo liên quan đến việc áp dụng quy tắc gitignore của thư mục cha
  • Đã khắc phục lỗi tăng mức sử dụng bộ nhớ khi xử lý các tệp gitignore rất lớn
  • rg -vf file nay sẽ khớp với mọi thứ khi file trống
  • Cờ -r/--replace hiện hoạt động bình thường cùng với --json
  • Một số kho Jujutsu (jj) cũng được nhận diện như kho git, vì vậy ripgrep sẽ tuân theo gitignore của jj
  • Globs nay hỗ trợ ngoặc nhọn lồng nhau

Hỗ trợ nền tảng

  • Mới cung cấp binary phát hành cho aarch64 trên Windows
  • Không còn cung cấp binary phát hành cho powerpc64
    • Việc ngừng cung cấp là do vấn đề trong workflow phát hành CI; nếu muốn kiểm thử và hỗ trợ lại thì có thể yêu cầu
  • Binary ripgrep được biên dịch với LTO (tối ưu toàn bộ ở thời điểm liên kết), mang lại mức cải thiện hiệu năng nhẹ và giảm kích thước

Cải thiện hiệu năng

  • Trên Windows, hiệu năng được cải thiện nhờ vô hiệu hóa việc tìm helper binary khi không dùng tùy chọn -z/--search-zip
  • Trên Windows, tốc độ được cải thiện nhờ bỏ qua chuẩn hóa đường dẫn khi xuất hyperlink
  • Cải thiện hiệu năng xử lý giá trị lớn khi dùng -A/--after-context

Sửa lỗi

  • Đã sửa nhiều vấn đề liên quan đến gitignore, bao gồm cả việc bỏ sót áp dụng gitignore của thư mục cha
  • Lệnh rg -vf file với tệp rỗng đã được sửa để khớp với mọi thứ
  • Bổ sung xử lý bỏ qua dấu BOM UTF-8 trong .gitignore và các tệp tương tự
  • Tối ưu sử dụng bộ nhớ khi xử lý các tệp gitignore lớn
  • Sửa lỗi hiển thị sai số byte đã tìm kiếm khi dùng --stats
  • Sửa lỗi xử lý glob kết thúc bằng .
  • Khắc phục vấn đề hiển thị vượt quá số lượng match khi dùng kết hợp -m/--max-count-U/--multiline
  • Thay đổi để giữ nguyên ký tự kết thúc dòng khi dùng cờ -r/--replace
  • Khắc phục lỗi đảo ngược mã thoát khi dùng kết hợp -q --files-without-match
  • Giải quyết sự không nhất quán trong tài liệu giữa -c/--count--files-with-matches
  • Sửa lỗi panic hiếm gặp với biểu thức chính quy lớn và dữ liệu đầu vào lớn
  • Xử lý escape dấu gạch nối trong tên cờ tùy chọn trên man page
  • Xử lý biên dịch tĩnh PCRE2 trong bản phát hành macOS aarch64
  • Sửa lỗi bộ lọc bỏ qua thư mục cha khi tìm kiếm các tệp ẩn nằm trong whitelist
  • Sửa vấn đề thống kê tổng kết không chính xác khi dùng cờ --json
  • Sửa lỗi xử lý gitignore khi tìm kiếm với đường dẫn tuyệt đối và gitignore toàn cục
  • Sửa lỗi panic khi dùng kết hợp -U/--multiline-r/--replace

Cải tiến tính năng

  • Tập hợp kiểu tệp mặc định được mở rộngcải thiện đáng kể
  • -r/--replace được cải thiện để tương thích với --json
  • Tính năng hoàn thành lệnh của fish shell được cải thiện để phản ánh tệp cấu hình của ripgrep
  • Bổ sung italic vào các thuộc tính kiểu có thể dùng với --color
  • Thư mục .jj được xem như kho git
  • Khi dùng đa luồng, bổ sung khả năng lên lịch tìm kiếm theo đúng thứ tự tệp được chỉ định trên CLI
  • Bổ sung artifact phát hành aarch64 cho Windows
  • Thêm kiểu màu highlight, cho phép tạo kiểu cho phần văn bản không khớp trong dòng có match
  • Bổ sung tính năng alternates lồng nhau cho globs và crate globset
  • Tính năng tự động hoàn thành cho --hyperlink-format được cải thiện trên bash, fish và zsh

1 bình luận

 
GN⁺ 2025-10-19
Ý kiến trên Hacker News
  • ripgrep là công cụ đã tiết kiệm cho tôi rất nhiều thời gian suốt nhiều năm qua, là thứ bắt buộc phải cài đầu tiên mỗi khi bắt đầu một hệ thống mới, đặc biệt là không thể thiếu khi khám phá các codebase cũ, một điều hơi tiếc là khi dùng tùy chọn -F (coi là chuỗi literal) thì vẫn có vài ký tự đôi lúc bị xử lý như ký tự đặc biệt cần escape, tôi không nhớ chính xác là ký tự nào, nhưng dù sao mỗi lần thấy ripgrep tiếp tục được cập nhật tôi đều rất vui

    • Nếu bạn cho ví dụ về ký tự nào đã gây vấn đề, tôi có thể giải thích cụ thể hơn, -F/--fixed-strings tắt 100% tính năng biểu thức chính quy trong pattern và chỉ xử lý literal, nếu cần escape thì có lẽ nguyên nhân là do shell yêu cầu
  • rg là một công cụ khiến người ta có cảm giác như phép màu, nhưng thực ra đó là kết quả của kỹ thuật xuất sắc, sự cải tiến bền bỉ và việc tận dụng tối đa hiệu năng phần cứng đáng kinh ngạc mà tất cả chúng ta dùng hằng ngày, đồng thời cũng là một đổi mới mở ra khả năng để các lập trình viên duyệt và hiểu mã nhanh hơn mà không cần phải tạo ra một tiêu chuẩn riêng như LSP

    • Tôi thật sự tò mò smithing ở ngữ cảnh này nghĩa là gì
  • Codebase của ripgrep là ví dụ tuyệt vời nhất cho kiểu "pha đồ uống, ngồi vào chiếc ghế thoải mái nhất và thưởng thức một phần mềm chất lượng cao", cứ bấm qua bấm lại từng ngóc ngách của mã nguồn rồi trầm trồ mãi

  • Giống như fd, rg là một công cụ dòng lệnh thật sự rất thích dùng, tôi rất thích những công cụ mới dựa trên lệnh như thế này

    • Gần đây tôi mới biết tác giả của ripgrep và fd đang làm việc tại Astral, nên mới thấy phần mềm của Astral tốt như vậy
    • Cả hai công cụ đều hoạt động đúng ý tôi đến 99% chỉ với mặc định, tiết kiệm thời gian khủng khiếp, ví dụ chỉ cần gõ rg <string> hoặc fd <string> là đủ
  • Tính năng tôi muốn có thêm là cờ "phần mở rộng", hoạt động như -g nhưng xử lý đối số đầu vào như phần mở rộng (ví dụ: rg -e c,h), vì phần lớn khi dùng glob pattern thì mục đích là khớp phần mở rộng

    • Tôi muốn hỏi liệu bạn đã thấy cờ -t/--type chưa, có thể dùng như ví dụ -tc, nếu ripgrep chưa có phần mở rộng đó thì bạn cũng có thể tự định nghĩa type
  • Với cá nhân tôi, ripgrep là lý do chính khiến tôi bắt đầu quan tâm đến Rust, nó hoạt động quá hoàn thiện nên việc nó được viết bằng Rust khiến tôi càng tò mò hơn, và đến giờ sau nhiều năm tôi vẫn dùng rg mỗi ngày

    • nibbles là lý do chính khiến tôi hứng thú với qbasic, nó quá hoàn thiện nên việc nó được viết bằng qbasic làm tôi thấy thú vị, và nhờ vậy tôi dùng nibbles mỗi ngày
  • Gần đây tôi phát hiện tùy chọn --replace và thấy khá ấn tượng, tôi dùng cùng với --type và thấy tiếc vì trước đây không biết những tính năng hay như vậy tồn tại, từ giờ tôi định sẽ đọc kỹ release note hơn để nhạy hơn với các tính năng mới, việc cải thiện tích hợp với jj cũng đáng mừng

  • Là một công cụ tuyệt vời mà lại rất dễ dùng, ban đầu tôi dùng trên Linux nhưng giờ cũng dùng trên Windows, nhờ công cụ này mà giờ tôi tìm kiếm trực tiếp bằng biểu thức chính quy thay vì wildcard

    • Tốt hơn grep mặc định, và lệnh rg --files cũng hữu ích
  • Tuần này tôi đã tạo một hàm bash để chỉ chạy ripgrep trên các tệp mà git đang theo dõi

      rgg() {
        readarray -d '' -t FILES < <(git ls-files -z)
        rg "${@}" "${FILES[@]}"
      }
    

    Có thể tìm kiếm nhanh hơn nhiều trong các thư mục có nhiều tệp nhị phân hoặc dot file, nếu muốn tìm trong dot file thì cần tùy chọn -uu, nhưng tùy chọn này lại khiến cả tệp nhị phân cũng bị tìm luôn, khi số lượng tệp lên đến hàng trăm thì bản thân git ls-files cũng chậm

    • Tôi tò mò không biết có ví dụ cụ thể nào mà làm vậy lại nhanh hơn không, bình thường ripgrep đã tôn trọng các quy tắc gitignore nên hoạt động khá giống git ls-files, để tham khảo thì -uu có nghĩa là bảo ripgrep bỏ qua gitignore và hidden file, nhưng vẫn bỏ qua tệp nhị phân, muốn bao gồm cả tệp nhị phân thì phải dùng -uuu, vấn đề lớn nhất của hàm này là nếu dùng trên repo kernel Linux sẽ báo lỗi argument list too long, nên tôi đã đổi sang xargs
        $ git ls-files -z | time xargs -0 rg APM_RESUME
        ...
      
        real  0.638
        user  0.741
        sys   1.441
        maxmem 29 MB
        faults 0
        $ time rg APM_RESUME
        ...
      
        real  0.097
        user  0.399
        sys   0.588
        maxmem 29 MB
        faults 0
      
      Nếu có ví dụ nào trong tình huống này mà git ls-files -z | xargs -0 rg ... nhanh hơn chỉ rg ... thì mong được chia sẻ
    • Sau khi viết bình luận này xong tôi đọc lại manual và phát hiện ra có thể dùng cờ -. (chỉ tìm trong tệp ẩn) thay vì -uu, sẽ rất tốt nếu có thể tìm trong các hidden file mà git đang theo dõi, nhưng overhead phát sinh khi truy vấn danh sách tệp là thứ không thể xem nhẹ ngay cả khi viết bằng Rust
    • Không biết có phải tôi đã bỏ sót gì không, nhưng chẳng phải mặc định ripgrep vốn đã bỏ qua các tệp không được git theo dõi sao?
    • Tôi tò mò không biết cách này có nhanh hơn git grep không
  • Tôi dùng ripgrep mỗi ngày trong công việc, cả ở dòng lệnh lẫn khi tìm kiếm trong vscode, lúc nào cũng dùng, xin cảm ơn burntsushi