2009-04-20 12 views
5

La mia prima incursione nel mondo eccentrico di Emacs Lisp è una funzione che prende due stringhe e li scambia con la vicenda:Interactive Emacs Lisp funzionare per scambiare due parole con l'altro

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

Questo funziona - ma io' m bloccato su quanto segue:

  • come chiedere conferma all'utente prima di ogni sostituzione? (Non riesco a far funzionare perform-replace)
  • come sfuggire alle stringhe a e b in modo che non vengano interpretate come espressioni regolari se contengono caratteri di espressioni regolari?

Edit: Il codice finale copia-pastable ho usato per un po 'di tempo è:

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

Purtroppo, non mette in evidenza le prossime partite sulla pagina come I-ricerca fa.

risposta

3

Usa y-or-n-p per la prima: (when (y-or-n-p "Swap?") do stuff

E regexp-quote per il secondo: (regexp-quote your-string)

1

regexp-quote è already mentioned.

Come per la conferma, se si desidera chiedere all'utente prima ogni sostituzione, è possibile scegliere query-replace-regexp che fa esattamente ciò che si desidera.

(E si può ancora trattare con l'integrato di Emacs transponse functions.)