2009-04-20 22 views
5

bước đột phá đầu tiên của tôi khác vào thế giới kỳ quặc của emacs lisp là một chức năng mà phải mất hai chuỗi và giao dịch hoán đổi chúng với eachother:Interactive Emacs Lisp chức năng để trao đổi hai từ với nhau

(defun swap-strings (a b) 
    "Replace all occurances of a with b and vice versa" 
    (interactive "*sFirst Swap Word: \nsSecond Swap Word: ") 
    (save-excursion 
    (while (re-search-forward (concat a "\\|" b) nil t) 
     (if (equal (match-string 0) a) 
     (replace-match b) 
    (replace-match a))))) 

này hoạt động - nhưng tôi m bị kẹt trên các mục sau:

  • cách nhắc người dùng xác nhận trước mỗi lần thay thế? (Tôi không thể nhận được perform-replace để hoạt động)
  • cách thoát khỏi các chuỗi ab để chúng không được hiểu là regex nếu chúng chứa bất kỳ ký tự regex nào?

Edit: Các bản sao-thể dán mã cuối cùng tôi đã sử dụng trong một thời gian là:

(defun swap-words (a b) 
    "Replace all occurances of a with b and vice versa" 
    (interactive "*sFirst Swap Word: \nsSecond Swap Word: ") 
    (save-excursion 
    (while (re-search-forward (concat (regexp-quote a) "\\|" (regexp-quote b))) 
     (if (y-or-n-p "Swap?") 
     (if (equal (match-string 0) a) 
      (replace-match (regexp-quote b)) 
     (replace-match (regexp-quote a)))) 
    ))) 

Thật không may, nó không làm nổi bật trận đấu sắp tới trên trang như I-tìm kiếm không.

Trả lời

3

Sử dụng y-or-n-p cho người đầu tiên: (when (y-or-n-p "Swap?") do stuff

regexp-quote cho phần thứ hai: (regexp-quote your-string)

1

regexp-quotealready mentioned.

Để xác nhận, nếu bạn muốn hỏi người dùng trước mỗi thay thế, bạn có thể chọn query-replace-regexp thực hiện chính xác những gì bạn muốn.

(Và bạn vẫn có thể xử lý nội dung được xây dựng của Emacs transponse functions.)

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