Tính năng tìm kiếm / thay thế giống như để hoán đổi văn bản


12

Tôi thường xuyên thấy mình cố gắng thay thế ví dụ foovới barbarvới footrong một bộ đệm.

Cách tôi thường làm là:

  • 3 truy vấn thay thế: aaa -> @@@, bbb -> aaa,@@@ -> bbb
  • từ bỏ tự động hóa và chỉ cần thay thế bằng tay

Tôi cho rằng có thể có một cái gì đó hoạt động bằng cách sử dụng ,cú pháp query-replace-regexpđể kiểm tra xem chuỗi phù hợp là aaahay bbb. Nhưng cú pháp kết quả sẽ quá cồng kềnh, vì vậy tôi chưa bao giờ thực sự thử nó.

Vấn đề là, theo mức độ phổ biến của một nhiệm vụ, tôi nghĩ rằng phải có một cách tốt hơn, một bước duy nhất, cách thực hiện, hoặc được tích hợp hoặc trong một gói hiện có. Lanhung?


Có thể có một cách duy nhất, nhưng cách đầu tiên của bạn không tệ, IMO. Và nếu bạn chọn chuỗi thay thế ngay thì bạn có thể thực hiện thay thế không truy vấn cho lần thứ hai.
vẽ

@Drew Đối với thường xuyên query-replace, tôi biết rằng thường là nhanh M-% str1 str2hơn để di chuyển điểm và thực hiện thay đổi bằng tay. Thật tuyệt, vì tôi không phải lãng phí thời gian để suy nghĩ về những gì sẽ nhanh nhất, ngay cả khi chỉ có một lần xuất hiện str1. Lý tưởng nhất là tôi muốn đảo ngược văn bản nhanh như vậy, để tôi có thể sử dụng nó mà không cần suy nghĩ về nó.
T. Verron

Ai đó sẽ cung cấp một câu trả lời đơn giản. Bạn không thể nghi ngờ làm những gì bạn yêu cầu, ví dụ, bằng cách sử dụng biểu thức Lisp để thay thế, tham chiếu văn bản sẽ được thay thế. Ví dụ, sử dụng một cái gì đó tương tự như thành ngữ trao đổi (setq a (prog1 b (setq b a))). Và thậm chí có thể có một cách đơn giản hơn.
vẽ

2
Tôi không thấy \,(if \1 "b" "a")đặc biệt xấu xí (chống lại sự khai thác lại \(a\)\|b), nhưng các từ vẫn phải gõ hai lần, nếu điều đó làm phiền bạn.
Politza

2
Tại sao không \(aaa\)\|bbb?
Politza

Câu trả lời:


7

Đây là một lệnh nhỏ sẽ làm điều này:

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

Cảm ơn bạn, đó là cách công phu hơn những gì tôi sẽ tự viết! Có lẽ bạn có thể giải thích các tính năng được thực hiện? Tôi thấy rằng với đối số tiền tố bạn đi ngược lại, nó chỉ thực hiện thay thế trong khu vực nếu cần ... Hoặc nó chỉ là viết lại query-replacecho đảo ngược, để nó giữ lại tất cả các tính năng của nó? Nó không khớp với 100% định nghĩa trong emacs của tôi, nhưng tôi vẫn còn 24,5 ...
T. Verron

@ T.Verron Đây chỉ là một bộ phận tiêu chuẩn từ query-replacehọ các chức năng từ phiên bản mới nhất, vì vậy nó giữ lại tất cả các tính năng. Đến cuối chức năng, tôi đã thêm cách hoán đổi các chuỗi được đề xuất trong hướng dẫn sử dụng Emacs.
link0ff

Tôi có lẽ đã chấp nhận quá nhanh. Hàm chỉ hoạt động ở đây (emacs 24.3) nếu tôi nhận xét backwardregion-noncontiguous-ptừ cuộc gọi đến perform-replace. Đây có phải là một vấn đề chung hay không, có nghĩa là giao diện perform-replaceđã thay đổi giữa các phiên bản?
T. Verron

Có, giao diện đã thay đổi với 2 đối số được thêm vào trong phiên bản mới nhất, vì vậy chúng không tồn tại trong các đối số trước đó,
link0ff

2
Giải pháp này dường như cũng ổn bây giờ.
Tên

9

Cài đặt nhiều

và chạy lệnh plur-query-replace

và đầu vào {foo,bar}và thay thế của nó{bar,foo}

Nhấn yđể thay thế các lần xuất hiện như mong muốn.

Ngoài ra còn có các biến thể không tương tác và giống như tìm kiếm của lệnh này.


Cảm ơn! Mục đích của plur cũng là thứ mà đôi khi tôi đang tìm kiếm, tôi chắc chắn sẽ xem xét nó. Sự do dự duy nhất của tôi bắt nguồn từ nhận xét của tác giả của gói trên ...;)
T. Verron

1
pluryêu cầu emacs 24.4.
T. Verron
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.