2009-04-20 21 views
5

Mi primera incursión en el mundo peculiar de Emacs Lisp es una función que toma dos cadenas y los permuta entre nosostros:interactivo Emacs Lisp función para intercambiar dos palabras entre sí

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

Esto funciona - pero me m atascado en lo siguiente:

  • cómo solicitar confirmación al usuario antes de cada reemplazo? (No puedo hacer que perform-replace funcione)
  • cómo escapar de las cadenas a y b para que no se interpreten como expresiones regulares si contienen algún tipo de caracteres regex?

Editar: El código de copia-pastable última He estado usando desde hace algún tiempo es:

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

Por desgracia, no se resaltan los próximos partidos de la página como lo hace en la búsqueda.

Respuesta

3

Uso y-or-n-p por primera: (when (y-or-n-p "Swap?") do stuff

Y regexp-quote para el segundo: (regexp-quote your-string)

1

regexp-quote es already mentioned.

En cuanto a la confirmación, si desea preguntar al usuario antes de cada reemplazo, puede elegir query-replace-regexp que hace exactamente lo que quiere.

(Y todavía puede ocuparse de transponse functions de Emacs)

Cuestiones relacionadas