43

私はemacsが大好きです。私は正規表現が大好きです。は emacs の正規表現構文が嫌いです - グループ化括弧と中括弧をエスケープする必要があること、リテラル括弧をエスケープしないこと、事前定義された文字クラスの欠如など.

Query-replace-regexp (または他の多くの機能の 1 つ) 機能を使用するときに、java/js/perl/ruby/etc でプログラムした構文を使用できるように、emacs の正規表現エンジンを置き換えるか、設定を微調整できますか? ...?

編集: 件名はもともと「emacsの正規表現エンジンを変更する方法」でした。これは、エスケープルールを変更して文字クラスを追加するだけでなく、(投稿では言及されていませんが)さまざまな一般的な拡張機能のサポートを追加します(?...)。キャプチャしない括弧: (?:...)、if/if-not の後にのみ一致: (?=...)/(?!...) など。私は(修正されることを嬉しく思いますが)これらがemacsの現在の正規表現エンジンで可能であるとは信じていません。

以下の解決策は、emacs が理解する構文に置き換えることにより、エスケープと追加の char クラスの元の問題に対処します。2番目の回答(現在は削除されています)は、すべての正規表現処理を置き換えるためにemacsの正規表現関数をアドバイスする(別の開始時に実行する関数を追加する)ことを提案しました。著者は、既存の emacs コードの多くを破壊する可能性があることに気づき、すぐに自分自身を検閲し、最終的に投稿は削除されました。

正規表現エンジンを拡張機能をサポートするものに変更したいのですが、エスケープ動作を普遍的に変更すると混乱が生じることに同意します。追跡するつもりはありません。したがって、質問に合わせて件名を変更し、回答を受け入れています。

共通構文と拡張機能をサポートするようにエンジンを変更し、正規表現関数に emacs-internal コードを共通構文に変換するようにアドバイスし、インタラクティブ関数に私の共通構文を emacs-syntax に変換するようにアドバイスすることが頭をよぎりました。共通に戻されます)...しかし、RMSでさえその前にフォークを推奨すると思います。

4

2 に答える 2

15

正規表現を変更してから emacs に戻す独自の elisp 関数を定義できます。疑似 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)
于 2009-05-18T18:09:52.713 に答える
7

インクリメンタル検索/置換、および置換とクエリ置換に Python 正規表現を使用するだけで十分な場合は、visual-regexp-steroidsが適しています。

visual-regexp-steroids は、最新の正規表現エンジンの使用を可能にする visual-regexp の拡張機能です (エスケープされたグループ括弧やその他の機能はもう必要ありません!)... 今のところ、Python と pcre2el はそのままでサポートされています ( Linux および Windows)。

デフォルトはPython の正規表現です。

非常に優れた機能の 1 つは、ライブ検索/置換です。

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

次のように数字と文字列を入れ替えることができます。

ここに画像の説明を入力

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)

しかし明らかに、必要に応じて検索と置換のために組み込みのキー マッピングを変更し、上書きすることができます。

于 2015-02-09T21:40:02.667 に答える