2011-06-18 8 views
6

Por ejemplo, quiero hacer que todo el texto entre paréntesis,(), UPCASE. Es trivial para hacer la siguiente forma interactiva:Emacs: ¿cómo puedo reemplazar-regexp con una función lisp en un defun?

M-x query-replace-regexp 
replace: "(\(.+?\))" 
with : "(\,(upcase \1))" 

lugar quiero escribir un defun que hará que:

(defun upcs() 
    (interactive) 
    (goto-char 1) 
    (while (search-forward "(\\(.+?\\))" nil t) (replace-match "(\\,(upcase \\1))" t nil))) 

pero no funciona! Mientras que las siguientes obras (que añade foo y bar a los textos entre paréntesis):

(defun HOOK() 
    (interactive) 
    (goto-char 1) 
    (while (search-forward-regexp "(\\(.+?\\))" nil t) (replace-match "(foo \\1 bar)" t nil))) 

Respuesta

2

Así que esto resuelve el problema.

(defun put-in-par (str) 
    (concat "(" str ")")) 

(defun upcs-luke() 
    (interactive) 
    (goto-char 1) 
     (while (search-forward-regexp "(\\([^\\)]+\\))" nil t) 
      (replace-match (put-in-par (upcase (match-string 1))) t nil))) 

Gracias a BillC y Luke Girvin por su ayuda.

+0

Si quiere eliminar 'put-in-par', puede hacer: (defun upcs-luke() (interactivo) (goto-char 1) (while (search-forward-regexp "(\\ ([^ \\)] + \\)) "nil t) (replace-match (concat" ("(upcase (match-string 1))") ") t nil))) – zev

+0

También usa' format' para este propósito sería más agradable y más flexible en casos más complicados. – ocodo

5

En primer lugar, se están usando search-forward en su primera función. Esto toma una cadena literal en lugar de una expresión regular. Debería usar search-forward-regexp, como lo hace en su segunda función.

En segundo lugar, mientras que el código es válido como un valor para reemplazar query-replace-regexp, no creo que se puede pasar a replace-match:

(\\,(upcase \\1))

, usted puede obtener el valor de la coincidencia encontrada por search-forward-regexp usando la función match-string.

Finalmente, no estoy seguro de que la expresión regular de búsqueda sea correcta.

creo que necesita algo en este sentido:

(defun upcs() 
    (interactive) 
    (goto-char 1) 
     (while (search-forward-regexp "(\\([^\\)]+\\))" nil t) 
      (replace-match (upcase (match-string 1)) t nil))) 
+0

Gracias Luke. Esto en realidad deja la cuerda emparejada sin arriostramiento. Pero sabiendo la exesión correcta para el partido de cuerda, es fácil escribir un defun que lo pondrá entre llaves. Lo publicaré como una "respuesta a tu pregunta". Gracias de nuevo. – Adobe

+0

@Adobe - de nada. –

6

respuesta de Lucas casi hace el trabajo, pero no del todo. El póster original quería que todo el texto que estaba entre paréntesis se convirtiera en mayúscula, mientras que el código de Luke lo convierte en mayúscula y TAMBIÉN quita el paréntesis. Una ligera modificación de la expresión regular proporciona la solución correcta:

(defun upcs() 
(interactive) 
(goto-char 1) 
    (while (search-forward-regexp "\\([^\\)]+\\)" nil t) 
     (replace-match (upcase (match-string 1)) t nil))) 
+0

Gracias Bill. Tienes razón: la respuesta de Luke deja sin correas a la cadena correspondiente. Su respuesta, sin embargo, hace que todo el texto del búfer sea mayúscula.He escrito un defun simple, y contiene la respuesta de Luke. Pondré la solución final como una "respuesta a su pregunta". Gracias de nuevo. – Adobe

+0

Sí, mi código elimina los paréntesis. No me molestaré en editar mi respuesta ya que el OP ha publicado la solución correcta. –

0

Esto fue muy útil, gracias a todos.

Con el fin de poner más ejemplos en la web, que pasó de esto:

(replace-regexp "\([\%\)\”\"]\..?\)[0-9]+" "\1") 

(que no funcionaba, pero que utiliza las expresiones regulares que funcionaba en modo interactivo)

a esto:

(while (re-search-forward "\\([\\%\\\"\\”]\\)\\.?[0-9]+" nil t) 
    (replace-match (match-string 1) t nil)) 

que necesitaba tres barras invertidas antes de la comilla interna.

Cuestiones relacionadas