Подтвердить что ты не робот

Можно ли изменить синтаксис 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 порекомендовал бы развилку до этого.

4b9b3361

Ответ 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)

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