Est-il possible de modifier la syntaxe regexp des emacs?

J’adore emacs. J’aime les regexs. Je déteste la syntaxe regex d’Emacs – le besoin d’échapper au regroupement des parens et des accolades, que vous n’échappiez pas au parens littéral, à l’absence de classes de caractères prédéfinies, etc.

Puis-je remplacer le moteur regex d’emacs, ou modifier certains parameters, de sorte que lorsque j’utilise la fonctionnalité Query-replace-regexp (ou une autre parmi d’autres), je puisse utiliser la syntaxe avec java / js / perl / ruby ​​/ etc …?

Edit: Le sujet était à l’origine “comment changer le moteur regex d’emacs”, ce qui non seulement modifierait les règles d’échappement et appendait des classes de caractères, mais aussi (non mentionné dans l’article) appenda le support pour diverses extensions communes (? …). Des fonctionnalités comme les parens non capturantes: (?: …), ne correspondent que si / if-not suivi de: (? = …) / (?! …), et d’autres. Je ne crois pas (bien qu’heureux d’être corrigé) que cela soit possible avec le moteur regex actuel d’emacs, et aucun remplacement de syntaxe ne résoudra ce problème.

La solution ci-dessous aborde les problèmes d’échappement et les classes de caractères supplémentaires en remplaçant par la syntaxe emacs comprend. Une seconde réponse (maintenant supprimée) suggère de conseiller (append une fonction à exécuter au début d’une autre) la fonction regex d’emacs pour remplacer tout le traitement des regex. L’auteur s’est rapidement censuré en réalisant qu’il risquait de casser beaucoup de code emacs existant, et que la publication a finalement été supprimée.

Je voudrais quand même changer le moteur de regex en un moteur qui prend en charge les extensions, mais je suis d’accord que le fait de changer le comportement d’échappement de façon universelle causerait des dégâts que je ne suis pas prêt à poursuivre. Ainsi, je change de sujet pour correspondre à la question et accepter la réponse.

Je pensais changer de moteur pour prendre en charge la syntaxe commune et les extensions, conseiller à la fonction regex de convertir le code interne emacs en common-syntax, conseiller aux fonctions interactives de convertir ma syntaxe commune en emacs-syntax reconverti en commun) … mais je pense que même RMS recommanderait une fourchette avant cela.

Vous pouvez définir votre propre fonction elisp qui modifie l’expression rationnelle, puis la renvoyer à emacs. En pseudo-elisp:

(defun my-query-replace-regexp (regexp) ; modify regexp to replace ( with \(, { with \{, etc. (query-replace-regexp modified-regexp) ) ; rebind C-% to use new regexp function (global-set-key "\C-%" 'my-query-replace-regexp) 

Si l’utilisation d’expressions régulières Python pour la recherche / remplacement incrémentielle et pour le remplacement de remplacement et de requête est suffisante, alors visual-regexp-steroids est un bon choix.

visual-regexp-steroids est une extension de visual-regexp qui permet d’utiliser des moteurs d’expressions rationnelles modernes (plus de parenthèses de groupe échappé et d’autres avantages!) … Pour l’instant, Python et pcre2el sont supportés par défaut (testés sur Linux et Windows).

Il utilise par défaut les expressions régulières Python .

Une fonctionnalité vraiment intéressante est une recherche / remplacement en direct, par exemple en commençant par

 one = 1 two = 2 three = 3 four = 4 

vous pouvez échanger les numéros et les chaînes comme suit:

entrer la description de l'image ici

Il peut être installé facilement via MELPA . Mon .emacs est:

 (require 'visual-regexp-steroids) (define-key global-map (kbd "Cc r") 'vr/isearch-backward) (define-key global-map (kbd "Cc s") 'vr/isearch-forward) (define-key global-map (kbd "Cc l") 'vr/replace) (define-key global-map (kbd "Cc q") 'vr/query-replace) 

mais de toute évidence, vous pouvez modifier pour adapter et remplacer les mappages de clés intégrées pour la recherche et le remplacement si vous le souhaitez.