9
votes

Emacs: comment puis-je remplacer-regexp avec une fonction LISP dans un défuneur?

Par exemple, je veux faire tout texte entre parenthèses, (), upccase. Il est trivial de faire le suivant de manière interactive: xxx pré>

à la place, je veux écrire un défun code> qui fera cela: p>

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


0 commentaires

5 Réponses :


6
votes

Tout d'abord, vous utilisez Recherche-Avertir code> dans votre première fonction. Cela prend un littéral à chaîne plutôt qu'une expression régulière. Vous devriez utiliser recherche -wewwe-regexp code>, comme vous le faites dans votre deuxième fonction.

Deuxièmement, alors que ce code est valide comme une valeur de remplacement pour requête-remplacement-regexp Code>, je ne pense pas que vous puissiez le transmettre à Remplacer-Match code>: P>

(\\, (upcase \\ 1)) code>

Vous pouvez obtenir la valeur de la correspondance trouvée par Recherche-Forwe-REGEXP CODE> à l'aide de la chaîne code> Fonction CODE> Fonction. P>

enfin , Je ne suis pas sûr que votre recherche régulière est correcte. P>

Je pense avoir besoin de quelque chose dans ces lignes: P>

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


2 commentaires

Merci Luke. Cela laisse réellement une chaîne assortie non soudée. Mais connaître l'extermination correcte pour String-Match - il est facile d'écrire un défunteur qui le mettra en bretelles. Je posterai comme une "réponse à votre question". Merci encore.


Remarque: Si vous essayez ceci dans les fonctions de réégalité de remplacement interactive, cas-remplacer doit être nil pour permettre des remplacements de modifier le boîtier. Par défaut, c'est t et interdit les modifications de cas.



7
votes

La réponse de Luke fait presque le travail mais pas tout à fait. L'affiche originale souhaitait que tout le texte est enfermé entre parenthèses converti en majuscule, tandis que le code de Luke convertit le code en majuscule et supprime également la parenthèse. Une légère modification de la regex fournit la solution correcte: xxx


2 commentaires

Merci Bill. Vous avez raison - la réponse de Luke laisse des feuilles de cordes assorties non soudées. Votre réponse, cependant, fait tout le texte du tampon supérieur. J'ai écrit un simple défunteur - et il bore la réponse de Luke. Je vais mettre la solution finale comme une "réponse à votre question". Merci encore.


Oui, mon code se débarrasse des parenthèses. Je ne me dérangerai pas de modifier ma réponse car l'OP a posté la solution correcte.



6
votes

Cela résout le problème.

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


2 commentaires

Si vous souhaitez éliminer "Met-in-par", tu pourrais faire: (défunt UPCS-Luke () (interactif) (Goto-Char 1) (tandis que (\ ([^ \)] + \ \)) "nil t) (Remplacer-Match (Concat" ("(UPCASE (String-String 1))") ")") ")


En utilisant également le format à cet effet serait plus agréable et plus flexible dans des cas plus compliqués.



3
votes

C'était très utile, merci à tous.

Dans l'intérêt de mettre plus d'exemples sur le Web, je suis passé à partir de là: xxx

(qui n'a pas Travailler, mais qui a utilisé les refusions qui fonctionnaient en mode interactif)

à ceci: xxx

J'avais besoin de trois barres obliques bassables avant la guillemande interne. < / p>


0 commentaires

0
votes

Les fonctions de remplacement basées sur la réégalité interactive ne peuvent pas modifier le cas, sinon fonctionnent bien par défaut: la variable Case-remplacer doit être définie sur nil (par défaut: < code> t ). Ensuite, les remplacements interactifs fonctionneront ensuite correctement avec (upccase \ 1) et amis.

Référence: Voir la discussion sur la liste de diffusion Emacs-Berlin: HTTPS: / /mailb.org/pipetermail/emacs-berlin/2021/000840.html


0 commentaires