2009-04-20 16 views
5

Benim ilk baskını ile iki kelime takas işlev iki dizeyi alır ve birbirleri ile takas yapar bir işlevdir:Etkileşimli Emacs Lisp emacs lisp ait ilginç dünyasına birbirlerine

(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))))) 

Bu işleri - ama ben m yapıştırıldı:

  • Her bir değiştirmeden önce kullanıcının onay için nasıl sorulur? (Çalışmak için perform-replace)
  • a ve b dizelerinden nasıl kurtulacaklar, herhangi bir normal ifade karakteri içeriyorlarsa normal ifadeler olarak yorumlanamazlar?

Düzenleme: Bir süredir kullanıyorum son kopya-pastable koddur:

(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)))) 
    ))) 

Ne yazık ki, I-arama yaptığı gibi sayfasındaki yaklaşan eşleşmeleri vurgulamaz. İlk için

cevap

3

Kullanım y-or-n-p: saniye (when (y-or-n-p "Swap?") do stuff

Ve regexp-quote: (regexp-quote your-string)

1

regexp-quotealready mentioned olduğunu.

Onay için, kullanıcıya her yerine önce sormak isterseniz, tam olarak ne istediğinizi yapan query-replace-regexp'u seçebilirsiniz.

(Ve hala Emacs en yerleşik transponse functions başa çıkabilirim.)