Можно ли изменить синтаксис regexp emacs?
Мне нравится emacs. Я люблю регулярные выражения. Я ненавижу синтаксис регулярных выражений emacs - необходимость избегать группировки парсеров и фигурных скобок, что вы не избегаете буквенных парен, отсутствия предопределенных классов символов и т.д.
Можно ли заменить механизм регулярных выражений emacs или настроить некоторые параметры, так что, когда я использую функцию Query-replace-regexp (или одну из многих других), я могу использовать синтаксис, который я программирую, в java/js/perl/рубин/и т.д...?
Edit:
Тема была первоначально "как изменить emges-regex engine", который не только изменит правила экранирования и добавит классы символов, но также (не упоминается в сообщении) добавит поддержку для разных общих расширений (?...). Такие функции, как non-capture the parens: (?:...), соответствуют только если /if -not follow: (? =...)/(?!...) и другие. Я не верю (хотя и счастлив, что вас исправили), это возможно с помощью текущего regex engine emacs, и никакие замены синтаксиса не исправят это.
В приведенном ниже решении рассматриваются исходные проблемы экранирования и дополнительные классы char путем замены синтаксисом emacs. Второй ответ (теперь удаленный) предложил совет (добавить функцию для запуска в начале другого) функцию регулярного выражения emacs, чтобы выполнить замену для всей обработки регулярных выражений. Автор быстро подвергал цензуре, осознавая, что он, вероятно, сломает существующий код emacs, и в конечном итоге сообщение было удалено.
Я бы по-прежнему хотел бы изменить regex-engine на тот, который поддерживает расширения, но я согласен с тем, что изменение поведения экранирования универсально вызовет хаос, который я не хочу преследовать. Таким образом, я меняю тему, чтобы ответить на вопрос и принять ответ.
Мне пришло в голову изменить движок для поддержки общего синтаксиса и расширений, посоветуйте функции регулярного выражения для преобразования внутреннего кода emacs в common-syntax, посоветуйте интерактивные функции преобразовать мой общий синтаксис в emacs-синтаксис (так он может быть преобразован обратно в обычный)... но я думаю, что даже RMS порекомендовал бы развилку до этого.
Ответы
Ответ 1
Вы можете определить свою собственную функцию elisp, которая изменила регулярное выражение и затем передала его обратно emacs. В псевдо-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)
Ответ 2
Если использовать регулярные выражения Python для инкрементного поиска/замены, а для замены и замены запроса достаточно, то visual-regexp-steroids является хорошим выбор.
visual-regexp-steroids - это расширение для visual-regexp, которое позволяет использовать современные 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)
но, очевидно, вы можете поменять его и переопределить встроенные сопоставления клавиш для поиска и замены, если хотите.