3

同様に機能する関数を探していますquery-replaceが、同じ置換文字列を何度も使用する代わりに、一致が見つかるたびに置換文字列を要求します。つまり、一致が見つかったら、この一致をスキップするか、置換モードに入り、一致を置換するために使用する文字列を指定できます (以前の置換の履歴を使用)。

さらに便利なquery-replace-regexpのは、検索文字列のグループ化を使用できるバリアントです。

非正規表現バージョンに使用するコードをいくつか書きましたが、実際に何かを置き換えて、置換が行われた後/一致がスキップされた後に検索全体を繰り返す部分で立ち往生しています。これまでのコードは次のとおりです。

(defun query-replace-ask (search)
  (interactive "sQuery replace: ")
  (if (search-forward search nil t)
      (let ((beg (match-beginning 0))
            (end (match-end 0))
            (if (y-or-n-p "Replace?")
                (replacement (read-string "Replacement: "))
              (
               ;; Do the next search
               )))
        ;; Replace from beg to end with replacement
        ;; do the next search
        )))

また、関数が終了したら、関数が総置換数を出力できるとよいでしょう。

4

4 に答える 4

6

この機能は、すでに の一部ですquery-replace。で呼び出すことができますE?すべてのオプションを表示するには、置換中に を押します。

于 2013-08-10T15:14:18.230 に答える
3

の場合、置換文字列でquery-replace-regexp使用することができます。\?それは、あなたが行動を起こすと決めたすべての出来事で入力を求め、グループ化や elisp ( \,) などの他の正規表現機能と組み合わせることができます。これについては、このマニュアルページで説明されています。

于 2013-08-10T18:36:34.193 に答える
1

はい、クエリ置換の答えはe(またはE) です。


しかし、別の方法にも興味があるかもしれません: search with replacement on demand .

Iciclesでは、任意の順序で検索ヒットにアクセスできます。つまり、興味のあるものだけにアクセス (または再アクセス) できます。ヒットを選択するための周囲のコンテキストを、それらにアクセスしなくても確認できます。それらのいくつかを個別に訪問したり、さまざまなサイクル順序でそれらの一部またはすべてを循環したりできます。

オカレンスにアクセスすると、キーを押して、 Iciclesにマッチ内のテキストを置き換えたいことを伝えることができます。そうであれば、新しい置き換えテキストを求めるプロンプトを表示するかどうかを指定できます。

IOW、交換はオンデマンドです。すべてのヒットを特定の順序 (バッファ内での発生) で訪問する必要はなく、ヒットごとに何をすべきか (スキップ/置換/編集など) を示す義務もありません。

関心のある一致に直接移動し、適切な場合は置換を実行します。あなたが望むものを Emacs に伝えます。「これが欲しいですか? これは? これは? これは? ...)」という質問ではありません。

これを、いくつかの用途で強力な代替手段として言及するだけです. すべての用途で query-replace を置き換えるものではありません。

http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

于 2013-08-10T17:02:41.873 に答える
1

Isearch+は、 Iciclesが提供するものと同様のオンデマンド置換機能を提供するようになりました。

検索ヒットにアクセスするC-u C-M-RETと、置換テキストを求めるプロンプトが表示されます。(接頭辞 arg がない場合、最後の置換テキストが再利用されます。)

query-replace-regexp置換では、 : \&\=\N',# ,\、and\?`に許可されている特別な正規表現構造を使用することもできます。

たとえば、 の正規表現検索パターン \(e\)\|aと の置換パターンを使用するとします\,(if \1 "a" "e")。次に、それぞれC-M-RETが交換eされa、その逆になります。

于 2013-10-21T00:18:45.383 に答える