Можно ли изменить синтаксис регулярных выражений в emacs? - PullRequest
41 голосов
/ 18 мая 2009

Я люблю Emacs. Я люблю регулярные выражения. Я ненавижу синтаксис regex в emacs - необходимость избегать группирования паренов и скобок, что вы не избегаете буквальных паренсов, отсутствия предопределенных классов символов и т. Д.

Могу ли я заменить механизм регулярных выражений в emacs или настроить некоторые параметры, чтобы при использовании функции Query-replace-regexp (или одной из многих других) я мог использовать синтаксис, который я запрограммировал в java / js / perl / рубин / и т.д ...?

Edit: Изначально речь шла о том, «как изменить движок регулярных выражений в emacs», который не только изменял бы правила экранирования и добавлял классы символов, но также (не упоминалось в посте) добавлял поддержку различных распространенных расширений (? ...). Такие функции, как нехватка паренов: (?: ...), сопоставляются только если / если-не сопровождается: (? = ...) / (?! ...) и другие. Я не верю (хотя и рад, что исправляюсь), это возможно с текущим механизмом регулярных выражений emacs, и никакие замены синтаксиса не исправят это.

В приведенном ниже решении рассматриваются исходные проблемы экранирования и дополнительных классов char путем замены на синтаксис, который понимает emacs. Во втором ответе (теперь удаленном) предложено дать совет (добавить функцию для запуска в начале другого) в функцию регулярного выражения в emacs, чтобы сделать замену всей обработке регулярного выражения. Автор быстро подверг цензуре себя, осознав, что он, скорее всего, нарушит существующий код emacs, и в конечном итоге пост был удален.

Я бы все-таки хотел изменить движок регулярных выражений на тот, который поддерживает расширения, но я согласен, что универсальное изменение поведения выхода вызовет хаос, за которым я не буду охотиться. Таким образом, я меняю тему в соответствии с вопросом и принимаю ответ.

Мне пришло в голову поменять движок для поддержки общего синтаксиса и расширений, посоветовать функции regex преобразовать внутренний код emacs в общий синтаксис, посоветовать интерактивным функциям преобразовать мой общий синтаксис в синтаксис emacs (так его можно преобразовать обратно в обычный) ... но я думаю, что даже RMS рекомендовал бы вилку до этого.

Ответы [ 2 ]

15 голосов
/ 18 мая 2009

Вы можете определить свою собственную функцию elisp, которая изменила регулярное выражение и затем передала его обратно в emacs. В псевдоэлиспе:

(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)
6 голосов
/ 10 февраля 2015

Если достаточно использовать регулярные выражения Python для инкрементного поиска / замены, а также для замены и замены запроса, тогда visual-regexp-steroids - хороший выбор.

visual-regexp-steroids - это расширение для visual-regexp, которое позволяет использовать современные механизмы регулярных выражений (больше не нужно избегать скобок в группе и других полезностей!) ... На данный момент Python и pcre2el поддерживаются "из коробки" (проверено на Linux и Windows).

По умолчанию Регулярные выражения Python .

Одна действительно хорошая функция - это поиск / замена в реальном времени, например, начиная с

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

вы можете поменять местами числа и строки следующим образом:

enter image description here

Может быть легко установлен через MELPA . Мой .emacs:

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

но, очевидно, вы можете изменить его в соответствии с требованиями и переопределить встроенные сопоставления клавиш для поиска и замены, если хотите.

...