4

私はemacs+auctexとauto-fill-modeを使用しています。

「test1test2」のようなスペースを含む文字列を検索(および置換)したい場合があります。問題は、自動入力モードでスペース文字が改行文字に置き換えられる場合があることです。したがって、「test1 test2」を検索して置換しても、自動入力によって空白が改行文字に置き換えられたこの文字列の出現は検出されません。

この問題を解決する方法はありますか?

テキストモードでは、query-replace-regexpで\ s-、つまり「test1 \ s-test2」を使用できますが、これはauctex-modeでは機能しません。理由はわかりません。

Cq Cjの使用は非常に不快です。これは、「test1 test2」などのケースが非常に頻繁に発生するためです。特に、1回の実行で改行とスペースを取得したいため、次のようにする必要があります。

M-x query-replace-regexp RET

test1[ <-- one space

C-j C-q

]\s-*test2

最後の\s-*は、auctexのくぼみの可能性があるためです。これはあまりエレガントではないようです。

ちなみに、「test1 test2」を検索して置き換えたい場合は、改行ケースを特別に扱うたびに考えるのは非常に面倒です...

4

2 に答える 2

3

Emacsには「カテゴリー」もあります。これは構文クラスに似ていますが、もう少し柔軟性があります。\cX正規表現で使用して、カテゴリ内の文字と一致させることができますX

これは、スペース、改行、タブ、フォームフィードを含む「すべて空白」のカテゴリを定義する関数であり、正規表現で。として引用できます\cs

(defun define-all-whitespace-category (table)
  "Define the 'all-whitespace' category, 's', in the category table TABLE."
  ;; First, clear out any existing definition for category 's'. Otherwise,
  ;; define-category throws an error if one calls this function more than once.
  (aset (char-table-extra-slot table 0) (- ?s ? ) nil)
  ;; Define the new category.
  (define-category ?s "all whitespace
All whitespace characters, including tab, form feed, and newline"
    table)
  ;; Add characters to it.
  (mapc (lambda (c) (modify-category-entry c ?s table))
        '(?  ?\n ?\f ?\t)))

(define-all-whitespace-category (standard-category-table))

auctex-modeは標準のカテゴリテーブルを使用しているように見えるので、そのモードでquery-replace-regexpを使用できるはずfoo\cs+barです。

それをテストするために、あなたは興味のあるキャラクターにポイントを置いて言うことができます:

M-: (looking-at "\\cs") RET

tこれは、ポイントの下の文字がすべて空白のカテゴリにあるかどうかを評価します。

于 2010-07-30T19:07:49.123 に答える
0

これを回避する最も簡単な方法は、おそらく小さなelisp関数を書くことでしょう。

何かのようなもの:

(defun auctex-query-replace-regexp (first second replace)
  (interactive "Mfirst:\nMsecond:\nM:replace:")
  (while (re-search-forward (concat first "[ 
]*" second))
    (replace-match replace)))

それを.emacsに貼り付け、最後にポイントを置き)、で評価しますC-x C-e

でグローバルにglobal-set-key、またはでモード固有のいずれかでキーにバインドしadd-hookます。

space文字クラスは、リテラルとリテラルで構成され、またはnewlineで挿入されることに注意してください。C-oC-q C-j

これは非常に単純な例です。それを改善することは、読者のためのエクササイズとして残されています;)

于 2010-07-30T13:06:05.800 に答える