Cách dễ nhất để tìm kiếm tất cả các tệp hữu ích trong một dự án là gì?


28

Cách dễ nhất để tìm kiếm một biểu thức chính quy trong toàn bộ nội dung tất cả các tệp trong dự án hiện tại, bỏ qua các tệp không hữu ích là gì?

Các tệp vô dụng là những thứ như tệp được biên dịch, thư viện đã nhập, tệp kiểm soát phiên bản, v.v.

Tôi biết rgrep, nhưng nó chỉ tìm kiếm mọi thứ. Có một gói tìm kiếm 'không liên tục' và biết về một số ngôn ngữ lập trình khác nhau, vì vậy tôi sẽ không phải định cấu hình cho từng dự án riêng lẻ?


Nhận xét "nó chỉ tìm kiếm mọi thứ" của bạn rgrephơi khó hiểu, vì nó loại trừ tất cả các tệp phù hợp với tiêu chí "tệp vô dụng" của bạn theo mặc định.
phils

Câu trả lời:


32

Tìm kiếm dựa trên dự án trong Emacs có thể được thực hiện bằng cách sử dụng đạn .

Nó cho phép cấu hình theo từng dự án của các tệp bỏ qua (trong một <projectroot>\.projectiletệp) hoặc chỉ định các thư mục con để theo dõi và bỏ qua tất cả các tệp khác.

Nó có thể chạy grep, ack(yêu cầu ack-and-a-half.el) và ag( ag.el) trên các tệp trong dự án được xác định (dựa trên .projectiletệp hoặc bằng cách tìm tệp VC được hỗ trợ để xác định gốc dự án).

Các lệnh hữu ích

(Liên quan đến tìm kiếm thông qua các tập tin hữu ích)

Theo Projectme ​​Readme

  • C-c p s g :: Chạy greptrên các tập tin trong dự án.
  • C-c p s a :: Chạy acktrên dự án. Yêu cầu sự hiện diện của ack-rưỡi.
  • C-c p s s :: Chạy agtrên dự án. Yêu cầu sự hiện diện của ag.el.
  • C-c p f :: Hiển thị danh sách tất cả các tệp trong dự án.
  • C-c p d :: Hiển thị danh sách tất cả các thư mục trong dự án.
  • C-c p a :: Chuyển đổi giữa các tệp có cùng tên nhưng phần mở rộng khác nhau trong dự án.
  • C-c p o:: Chạy multi-occurtrên tất cả các bộ đệm dự án hiện đang mở.

Chúng sẽ chỉ hoạt động trên các tệp được xác định là một phần của dự án (hoặc được tìm thấy khi bộ đệm được tạo / tái tạo).


Cảm ơn, lệnh bắn mà tôi có thể sử dụng cho việc này là gì?
Malabarba

Đã chỉnh sửa nó để bao gồm một tập hợp con của các lệnh (những lệnh liên quan đến tìm kiếm, tìm tệp và chuyển hướng). Danh sách đầy đủ là trong gói readme.
Jonathan Leech-Pepin

13

Việc tìm kiếm trên toàn dự án chỉ các tệp có liên quan có thể được thực hiện bằng cách sử dụng agaka the_silver_searcher .

Tại sao lại là ag?

  • Nó bỏ qua mô hình tập tin từ bạn .gitignore, .hgignore, svn:ignore. Bạn có thể chọn cho các tìm kiếm của mình KHÔNG sử dụng danh sách bỏ qua từ danh sách bỏ qua kiểm soát phiên bản bằng cách sử dụng công -Utắc.
  • Nếu có tệp trong repo nguồn của bạn mà bạn không muốn tìm kiếm, chỉ cần thêm mẫu của chúng vào .agignoretệp.
    • Một .agignoretệp toàn cầu có thể được đặt trong của bạn $HOMEvà sau đó bạn có thể đặt các .agignoretệp cụ thể hơn của dự án vào gốc dự án của bạn.

Thiết lập agvà emacs

  • Cài đặt agaka the_silver_searcher trên hệ thống của bạn.
  • Thiết lập .agignoretập tin. Tôi thích chỉ có một .agignoretập tin toàn cầu trong của tôi $HOME.
  • Cài đặt aggói (có sẵn trên Melpa).
  • Sau đó, bạn có thể sử dụng chức năng ag-projecthoặc ag-project-regexp(đi kèm với aggói) để thực hiện tìm kiếm tệp trên toàn dự án.
    • Theo mặc định, các chức năng này sử dụng thư mục gốc của repo VCS làm thư mục để tìm kiếm. Bạn có thể ghi đè lên điều này bằng cách cài đặt hoặc tùy chỉnh ag-project-root-function.
    • Ngay cả khi dự án của bạn không được kiểm soát git, bạn có thể đánh dấu gốc dự án cho ag-project/ ag-project-regexptìm kiếm dựa trên bằng cách đặt một .gitthư mục trống trong thư mục gốc của dự án. Sau đó, bạn không phải tùy chỉnh ag-project-root-function.

4

Nếu dự án của bạn sử dụng Git, bạn chỉ cần counsel https://github.com/abo-abo/swiper

  • counsel-git để tìm tập tin

  • counsel-git-grep để grep

Sự phụ thuộc duy nhất là git

Grepping văn bản nhanh hơn trình tìm kiếm bạc (ag)

Luật sư cũng cung cấp các công cụ mạnh mẽ khác. Ví dụ, sau khi chạy counsel-git-grep, bạn có thể nhấn C-c C-oC-x C-qđi vào wgrep-modeđể dễ dàng thay thế văn bản trong phạm vi dự án.

Có một bài viết https://sam217pa.github.io/2016/09/11/nucle-power-editing-via-ivy-and-ag/ giải thích chi tiết. Bài viết đó sử dụng counsel-ag(một lệnh khác được xây dựng trong tư vấn) nhưng cousnel-git-grepsử dụng chính xác cùng một luồng công việc.


Nhưng làm thế nào đến văn bản grepping nhanh hơn ag? Bạn có thể vui lòng giải thích?
denis631

1
agcũng là một chương trình grep, như thế git-grep. Tôi không thể nói cái nào nhanh hơn. Xem github.com/BurntSushi/ripgrep để so sánh hiệu suất của các chương trình grep phổ biến (bao gồm aggit-grep)
chen bin

1

Câu trả lời đầu tiên rất hay, nhưng nó bỏ qua một số chi tiết quan trọng về các phiên bản hiện đại của Emacs. Tôi biết Emacs mình, vì vậy những người mới khác có thể không nhận thức được điều này. Vì mục tiêu của bạn là tìm kiếm văn bản TRONG MỘT tệp trong DỰ ÁN, trước tiên bạn sẽ cài đặt Projectile bằng kho lưu trữ MELPA.

Thao tác này sẽ cài đặt gói trong .emacs.d và thêm một số cấu hình cơ bản vào .emacs trong thư mục $ USER của bạn (giả sử bạn đã tạo tệp .emacs), chẳng hạn như yêu cầu Projectile trong cài đặt Emacs của bạn.

Tuy nhiên, bạn vẫn cần kích hoạt nó và liên kết các tiền tố keymap, để bạn có thể gọi nó trong bộ đệm mini.

Câu trả lời được chấp nhận đề cập đến lệnh sau:

C-c p s g

Điều này sẽ không hoạt động, trừ khi bạn định cấu hình Projectile với tiền tố sơ đồ bàn phím này. Nhưng tôi đã cấu hình nó để sử dụng Cc Cp làm lệnh cho Project trong .emacs:

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

Bây giờ được đưa ra, tôi có thể thực hiện tìm kiếm văn bản trong các tệp trong một dự án bằng grep:

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

Để phá vỡ nó, C-c C-psẽ gọi Projectile và s gsẽ thực hiện tìm kiếm grep. Bạn sẽ nhận được một đầu ra đẹp như thế này, giả sử tìm kiếm của bạn là visit_contactvà bạn đang tìm kiếm rspec của Ruby trong một dự án:

./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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.