Có cách nào để sử dụng thay thế truy vấn từ chế độ đầu ra grep / ack / ag không?


31

Tôi biết find-grep-dired, đánh dấu các tệp tương ứng và sau đó nhấn Qđể chạy dired-do-query-replace-regexptrên các tệp được đánh dấu. Thật không may, điều đó đòi hỏi phải khởi động lại grep và không còn sử dụng git-grep, ack hoặc ag và chuyển sang sử dụng find-grepcó cú pháp khác để tìm kiếm.

Tôi cũng biết multi-occuroccur-edit-mode, nhưng điều đó đòi hỏi phải khởi động lại tìm kiếm bằng cách sử dụng. Cuối cùng, ag-diredxuất hiện để khớp với tên tệp, không phải trên nội dung của tệp.

Cách tiếp cận hiện tại của tôi là tạo đầu ra grep, sau đó chạy macro bắt đầu trong bộ đệm grep và truy cập từng trận đấu và thay đổi nó. Tôi muốn sử dụng query-replacetrực tiếp trên tập hợp các trận đấu được tìm thấy.

Những gì tôi muốn làm là một trong hai nhanh chóng xây dựng một bộ đệm dired từ đầu ra grep hiện vì vậy mà tôi có thể đánh dấu các tập tin thích hợp và cuộc gọi truy vấn-regexp trên chúng, hoặc chuyển đổi sản lượng grep vào một danh sách các bộ đệm cho multi-occurđể tôi có thể sử dụng occur-edit-modeđể chỉnh sửa nó tại chỗ và chạy query-replacetrên bộ đệm đó.

Có chức năng này tồn tại, hoặc có một quy trình công việc khác giải quyết vấn đề này?

Câu trả lời:


28

@Malabarba đã đề cập đến việc sử dụng wgrepgói để chỉnh sửa kết quả grep / ack / ag.

Tôi muốn viết hướng dẫn chi tiết về cách tôi sử dụng aggói và wgrep-aggói để đạt được chỉnh sửa kết quả đã sử dụng multiple-cursorsgói.

Các gói này có sẵn thông qua Melpa. Bạn cũng cần phải có agaka the_silver_searcher được cài đặt trên hệ thống của bạn.

Hướng dẫn này áp dụng cho các trường hợp bạn đang tìm cách thực hiện các chỉnh sửa dòng đơn tại tất cả / các vị trí đã chọn được agtìm thấy.

  • Cài đặt agtrên hệ thống của bạn và các gói emacs đã đề cập ở trên.

  • aghỗ trợ tìm kiếm tệp có nội dung phù hợp với biểu thức chính quy định của bạn. Cách đơn giản nhất để biết agnơi gốc của dự án là đặt một .gitthư mục trống ở đó. Sau đó thực hiện tìm kiếm bằng cách sử dụng M-x ag-project-regexp.

  • Bộ đệm kết quả của tìm kiếm ag không thể chỉnh sửa theo mặc định. Để làm cho nó có thể chỉnh sửa, hãy làm M-x wgrep-change-to-wgrep-modehoặc sử dụng wgrepràng buộc -default C-c C-p.

  • Bây giờ nếu bạn cần thay đổi 'abcdef' thành 'ghijkl' trong tất cả các tệp của mình, bạn sẽ tìm kiếm 'abcdef' và bộ đệm kết quả ag sẽ hiển thị tất cả các dòng có chứa chuỗi đó. Sau đó, bạn làm cho bộ đệm đó có thể chỉnh sửa và thay đổi các chuỗi đó theo cách thủ công và những thay đổi đó sẽ phản ánh trong bộ đệm tệp thực tế khi thực hiện M-x wgrep-finish-edithoặc sử dụng liên kết mặc định C-c C-e. Bạn cũng có thể sử dụng query-replace-regexpđể làm thay thế tìm kiếm.

  • Tôi thích sử dụng multiple-cursorsđể tái cấu trúc nhanh để tôi có thể thấy phản hồi theo thời gian thực về nơi nhiều lần chỉnh sửa của tôi diễn ra đồng thời. Đánh dấu chuỗi bạn muốn thay thế trong bộ đệm kết quả ag đó và gọi M-x mc/mark-all-like-thisvà sau đó chỉnh sửa trong sự sợ hãi khi bạn thấy nội dung được chỉnh sửa tại nhiều điểm cùng một lúc.

  • Khi bạn hài lòng với các chỉnh sửa, như tôi đã đề cập ở trên, hãy thực hiện C-c C-eđể "phản ánh" các thay đổi trong bộ đệm thực tế. Bộ đệm chưa được lưu.

  • Để lưu tất cả các bộ đệm, tôi thường làm điều đó trong một lần, sử dụng C-x s !ràng buộc mặc định của emacs .

Dưới đây là một ví dụ sử dụng với ảnh chụp màn hình:

Nó cho thấy quá trình thay thế tất cả các trường hợp bind-to-modi-mapđến bind-to-my-maptrong tôi ~/.emacs.d/.

Khi tôi tìm kiếm bind-to-modi-maptrong thư mục cài đặt emacs của mình, tôi nhận được kết quả như sau:kết quả ag, không thay đổi

Bộ đệm này là chỉ đọc.

Sau M-x wgrep-change-to-wgrep-mode, tôi nhấn mạnh, -modi-mapchọn tất cả các phiên bản của lựa chọn đó bằng cách sử dụng M-x mc/mark-all-like-thisvà sau khi chỉnh sửa các lựa chọn -my-mapđó, nó trông như dưới đây: kết quả ag, được sửa đổi bằng nhiều con trỏ

Màu xanh lam cho biết dòng nào sẽ được sửa đổi khi tôi nhấn C-c C-e.

Khi nhấn C-c C-e, bạn có thể thấy thay đổi được phản ánh trong tệp thực tế trong ảnh chụp màn hình này: kết quả ag, sau khi hoàn thành các chỉnh sửa

Sau đó tôi sẽ lưu tất cả các tập tin sửa đổi bằng cách sử dụng C-x s !.


Đây thực sự là cách tốt nhất để thay thế chuỗi. Chứa vào một dự án, chú ý loại trừ ag, dễ thực hiện, vẫn có thể xác minh bạn đang thay thế điều đúng.
PascalVKooten

13

Những gì tôi muốn làm là nhanh chóng xây dựng bộ đệm được điều hướng từ đầu ra grep hiện có [...] hoặc chuyển đổi đầu ra grep thành một danh sách các bộ đệm cho đa xảy ra [...].

Bạn không cần phải chuyển đổi bộ đệm kết quả grep thành bất cứ thứ gì, tất nhiên đã có một chế độ dành riêng cho việc chỉnh sửa đầu ra grep (và phản ánh các thay đổi trên các tệp).

  1. Cài đặt wgrep gói từ Melpa.
  2. (require 'wgrep) trong tập tin init của bạn.
  3. Sau khi thực hiện tìm kiếm grep, nhấn C-c C-pvà chỉnh sửa!
  4. Lưu các chỉnh sửa của bạn với C-c C-e

Nó thậm chí hoạt động với ack và ag là tốt.


2
Đó là những gì tôi làm (với ag.el). Cùng với việc chỉnh sửa đa hướng đơn giản, các phép tái cấu trúc đơn giản thực sự dễ dàng.
Tom Regner

4

Chức năng này tồn tại trong đạn ( projectile-replace). Nó sẽ sử dụng ag / ack / git grep / grep nếu có sẵn (theo thứ tự đó) để tìm sự xuất hiện và tags-query-replaceđể thực hiện thay thế truy vấn.


Điều đó bị các vấn đề tương tự như find-grep-dired. Nó không sử dụng đầu ra grep hiện có. Có những vấn đề tương tự với đa đạn xảy ra. Tôi muốn bắt đầu thay thế truy vấn sau khi xem danh sách các kết quả khớp và không thay đổi phương thức tìm kiếm cơ bản. Đó là một quy trình làm việc thay thế mặc dù.
dgtized

Những gì bạn đang mô tả âm thanh giống như nó có thể dễ dàng được thực hiện bằng cách tạo một macro rất nhanh để thay thế văn bản và gọi liên tục M-g n C-x e(nghĩa là sử dụng next-errorđể cuộn qua các lần xuất hiện).
shosti

1

Đây là một cách tiếp cận khác, sử dụng Icicles .

Trong *grep*bộ đệm đầu ra Emacs của bạn , nhấn Cc `(đó là backcote Cc), trong chế độ Icicle bị ràng buộc trong bộ đệm *grep*để ra lệnh icicle-compilation-search. Điều này cho phép bạn nhanh chóng điều hướng trong số các lần tìm kiếm ( greplượt truy cập) bạn chọn, theo bất kỳ thứ tự nào.

Nhập vào bạn nhập vào bộ lọc động nhỏ gọn (thu hẹp) tập hợp các lần tìm kiếm và bạn có thể sử dụng hoàn thành lũy tiến để thu hẹp bằng cách khớp liên tiếp nhiều mẫu (ví dụ: chuỗi con, biểu thức chính).

Khi điều hướng giữa các lần truy cập tìm kiếm, bạn có thể thay thế bất kỳ trong số chúng theo yêu cầu - toàn bộ lần truy cập (dòng) hoặc chỉ phần phù hợp với đầu vào xe buýt nhỏ hiện tại của bạn.

Xem Tìm kiếm Icicles - Biên dịch hoặc Grep . Giới thiệu về tìm kiếm Icicles ở đây và thông tin về việc thay thế các kết quả khớp trong khi tìm kiếm Icicles ở đây .


0

Tôi sử dụng tiện ích này Tôi đã viết xah_find.el

Tôi đã viết nó bởi vì:

  • Tinh khiết Không còn lo lắng về grep trên Windows hoặc truyền Unicode giữa các emacs đến Hệ điều hành. vấn đề gac emacs
  • Nếu bạn là người dùng unicode nặng, các công cụ unix có một số lỗi bán. vấn đề uniq linux
  • Tôi tìm / thay thế mỗi tuần trên các tệp 5k. Tôi đã sử dụng dired-do-query-thay-regapi trong nhiều năm. Tôi thấy bản chất tương tác thực sự làm mất thời gian của tôi, nhưng tôi cần phải kiểm tra kết quả của những thay đổi. Vì vậy, giải pháp của tôi hiện đang chạy hàng loạt nhưng có một báo cáo hay mà tôi có thể quét ở tất cả các kết quả tìm / thay thế, với tùy chọn ghi vào tệp.

Công cụ elisp này có lẽ chậm hơn 5 đến 10 lần so với việc gọi unix grep trong emacs, nhưng hoạt động tốt với tôi.

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.