2012-06-21 25 views
19

Giả sử Bạn có một số văn bản với các từ như thế này bên trong:.Emacs regex tương tác thay thế

"foo" ... "bar" ... "file" ... "emacs" 

và tất cả các bạn muốn làm là để thay thế "với '' Tôi biết nó có thể được thực hiện chỉ yêu cầu sau đây thay thế:

" -> '' 

nhưng giả sử bạn muốn làm điều đó một cách tương tác và với regex, đối với trường hợp phức tạp hơn, làm thế nào nó có thể được thực hiện

tôi giải thích bản thân mình tốt hơn: tôi ước gì tôi có thể có một lệnh, hoặc một loạt, để làm việc theo cách này:

  • Viết regex như "\\(.*?\\)" và xem kết quả tương tác (tức là các kết quả hiển thị hiện tại được đánh dấu khi bạn chỉnh sửa regexp và đánh dấu luôn được cập nhật khi bạn thực hiện thay đổi).
  • Khi hài lòng với regexp, xác định một sự thay thế như ' '\1' '
  • tương tác thay thế tất cả phù hợp
+0

ý bạn là "đệ quy"? –

+0

event_jr: Tôi đã cập nhật câu hỏi dựa trên câu trả lời của Luigi và lặp lại phần đó trong quá trình, vì nó dường như không liên quan. – phils

Trả lời

19

Cuối cùng tôi đã phát hiện ra !!!!! Đây là những bước đi theo:

  • M-x isearch-forward-regexp

  • Chèn regex của bạn tương tác. Nếu bạn mắc lỗi, bạn có thể sử dụng DEL hoặc M-e và điều hướng thông qua regex của bạn để sửa nó.

  • Sau đó, sau khi bạn đã tìm thấy những gì bạn muốn ngay lập tức nhấn M-% và thay thế bạn thích và bắt đầu thay thế.

Vì vậy, bạn có thể tìm kiếm và thay thế bằng regex theo cách tương tác và gia tăng tổng thể.

+1

Tìm tốt. Trong quá trình cài đặt của tôi 'isearch-forward-regexp' bị ràng buộc với' C-M-s'. –

+2

'M-x isearch-description-bindings' (hoặc' C-s C-h C-h b') cũng đáng đọc. – phils

7

Liệu lệnh query-replace-regexp đáp ứng yêu cầu của bạn? Trên hầu hết các cài đặt của Emacs nó sẽ được ràng buộc để C-M-%.

Vì điều đó không đáp ứng các yêu cầu của OP, hãy đề xuất xem tại re-builder. Chức năng này không được ghi trong sách hướng dẫn Emacs, hoặc hệ thống trợ giúp, nó chỉ là về tài liệu trong số Emacs Lisp manual.

+0

truy vấn-thay thế-regexp nó không tương tác, hoặc gia tăng tốt hơn. Tôi muốn có một cách gia tăng để nhìn vào những gì nó phù hợp với –

+0

Nó không làm việc như vậy đối với tôi, nó không phải là tương tác cũng không gia tăng. Bạn có ý kiến ​​gì không? Tôi đã tải xuống các emacs thông qua apt-get. Bằng cách này tôi đã đăng các giải pháp hoạt động tốt trong trường hợp của tôi. –

+0

(xin lỗi, tôi vừa xóa nhận xét đầu tiên của tôi khi bạn thêm câu trả lời của mình). Tôi đã không hiểu rằng bạn muốn làm nổi bật trận đấu gia tăng * trong khi bạn đang xây dựng regexp *, đó là lý do tại sao tôi đã nhầm lẫn. Tôi hiểu những gì bạn đã làm sau này. – phils

7
  • Chạy M-x isearch-forward-regexp hoặc C-M-s.

  • Khi bạn bắt đầu nhập regex, lần xuất hiện đầu tiên sẽ được đánh dấu ngay lập tức. Cố gắng di chuyển trở lại thông qua regex bằng cách sử dụng con trỏ sẽ hủy tìm kiếm, vì vậy nếu bạn mắc lỗi, bạn nên sử dụng M-e để cho phép chỉnh sửa, thực hiện thay đổi, sau đó nhấn enter để tiếp tục tìm kiếm.

  • Khi bạn hài lòng với regex, nhấn M-%, nhập chuỗi thay thế (hoặc sử dụng phím lên để truy cập chuỗi thay thế đã sử dụng trước đó), sau đó nhấn RET để bắt đầu thay thế tương tác.

  • Đối với mỗi lần xuất hiện, bấm y để thay thế một lần, n để bỏ qua, ! để thay thế tất cả, RET để thoát ra, hoặc ? để xem các tùy chọn thêm.

  • Để lặp lại tìm kiếm regexp cuối cùng của bạn, nhập C-M-s rồi C-s.

Chi tiết đầy đủ nằm trong số manual page.

+0

Tôi thực sự chỉ muốn thêm một số chi tiết vào [Luigi's answer] (http://stackoverflow.com/a/11137064/201665), nhưng kể từ khi chỉnh sửa của tôi đã bị từ chối, tôi đăng nó như là một câu trả lời riêng biệt. –

+0

Có thể có hiệu lực với bạn. Với tình yêu, –

Các vấn đề liên quan