42 votes

Est-il possible de changer la syntaxe des expressions rationnelles d’emacs?

J'aime emacs. J'adore les regexs. Je déteste emacs' regex syntaxe - le besoin de s'échapper de regroupement des parenthèses et accolades, que vous ne échapper littérale parenthèses, le manque de caractère prédéfini de classes, etc.

Puis-je remplacer emacs' moteur d'expressions régulières, ou modifier certains paramètres, de sorte que lorsque je utiliser le Query-replace-regexp (ou l'un des beaucoup d'autres) fonctionnalité que je peux utiliser la syntaxe, je programme en java/js/perl/ruby/etc...?

Edit: Le sujet était à l'origine "comment changer d'emacs moteur d'expressions régulières" qui ne serait pas seulement de changer d'échapper à des règles et à ajouter les classes de caractères, mais aussi (non mentionné dans le post) ajouter la prise en charge de différentes extensions (?...). Caractéristiques, comme la non-saisie des parenthèses: (?:...), match seulement si/si-non suivie par: (?=...)/(?!...), et pour les autres. Je ne crois pas (mais heureux d'être corrigé) ces sont possibles avec d'emacs et de courant moteur d'expressions régulières, et aucun montant de la syntaxe de remplacement permettra de résoudre ce problème.

La solution ci-dessous traite de l'origine des problèmes de l'évasion et de supplémentaires char classes par le remplacement, avec la syntaxe emacs comprend. Une seconde réponse (maintenant supprimé) a suggéré de conseiller (ajouter une fonction à exécuter au début d'un autre) emacs' fonction regex pour faire le remplacement de tous les regex de traitement. L'auteur rapidement censuré lui/elle-même de réaliser qu'il serait susceptible de briser beaucoup existant emacs code, et, finalement, le post a été supprimé.

Je voudrais modifier la regex moteur qui prend en charge les extensions, mais je suis d'accord que la modification de l'échappement comportement universellement causerait des ravages je ne suis pas prêt pour la chasse. Donc, je vais changer le sujet pour correspondre à la question et d'accepter la réponse.

Il a traversé mon esprit à changer le moteur à l'appui commun-la syntaxe et les extensions, conseiller de la fonction regex pour convertir emacs-code interne à la commune de la syntaxe, de conseiller les fonctions interactives pour convertir ma commune-syntaxe de emacs-syntaxe (de sorte qu'il peut être reconvertis en commun)... mais je pense que même RMS recommandons une fourche avant.

15voto

Adam Rosenfield Points 176408

Vous pouvez définir votre propre fonction elisp qui a modifié l’expression rationnelle puis l’a renvoyée à 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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X