テキストを交換するための検索/置換のような機能


12

私は頻繁に自分自身を例に取って代わるしようとして見つけfoobarbarしてfooバッファに。

私が通常行う方法は次のいずれかです。

  • 3クエリ置き換え:aaa -> @@@bbb -> aaa@@@ -> bbb
  • 自動化をあきらめて、手作業で交換するだけ

一致する文字列がまたはであるかどうかをテストするために,構文in query-replace-regexpを使用して何かを動作させることが可能であると思います。しかし、結果の構文は面倒すぎるので、実際に試したことはありません。aaabbb

問題は、タスクがどれほど一般的であるかを考えると、組み込みまたは既存のパッケージのいずれかで、より良い、単一ステップの、それを行う方法が必要だと思います。ある?


シングルステップの方法もありますが、最初の方法は悪くありません、IMO。置換文字列を正しく選択すると、2回目のパスでクエリなしの置換を実行できます。
ドリュー

@Drew query-replace通常の場合M-% str1 str2、ポイントを移動して変更を手作業で行うよりも通常は速いことを知っています。素晴らしいのは、たとえが1つしか発生していなくても、最速になるものについて考える時間を無駄にする必要がないからですstr1。理想的には、テキストの反転も同じくらい速く、それについても考えずに使用できるようにしたいです。
T.バーロン

誰かが簡単な答えを提供します。たとえば、置換にLisp式を使用して、置換するテキストを参照するなど、あなたが求めることを間違いなく行うことができます。たとえば、スワップイディオムに似たものを使用します(setq a (prog1 b (setq b a)))。さらに簡単な方法もあります。
ドリュー

2
私は\,(if \1 "b" "a")特にagaい(正規表現に対して\(a\)\|b)を見つけることはありませんが、もしそれがあなたを悩ますなら、それでも単語は二度タイプされなければなりません。
ポリツァ

2
どうして\(aaa\)\|bbb
ポリツァ

回答:


7

これを行う小さなコマンドを次に示します。

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

ありがとう、それは私が自分で書いたものよりもずっと手の込んだ方法です!実装された機能について詳しく説明できますか?プレフィックス引数を使用すると、後方に移動し、必要な場合にのみリージョンで置換を実行することがわかります...またはquery-replace、それはすべての機能を保持するための反転のための単なる書き換えですか?それは私のemacsの中で100%の定義と一致していませんが、私は... 24.5でまだだ
T. Verron

@ T.Verronこれはquery-replace、最新バージョンの関数ファミリーの標準ボディに過ぎないため、すべての機能が保持されます。関数の最後に、Emacsマニュアルに記載されている文字列を交換する推奨方法を追加しました。
link0ff

私はおそらくあまりにも早く受け入れました。機能は、私がコメントアウトした場合(24.3 Emacsの)ここで働くbackwardregion-noncontiguous-pの呼び出しからperform-replace。それは一般的な問題ですか、それともperform-replaceバージョン間でインターフェースが変更されたことを意味しますか?
T.バーロン

はい、最新バージョンにこれらの2つの引数が追加されてインターフェースが変更されたため、以前のバージョンには存在しません
。– link0ff

2
この解決策も今では問題ないようです。
名前

9

plurをインストール

コマンドを実行します plur-query-replace

入力{foo,bar}とその置換{bar,foo}

ヒットyして、必要に応じてオカレンスを置き換えます。

このコマンドには、非対話型のisearchのようなバリアントもあります。


ありがとう!plurの目的は、私が時々探していたものでもありますので、ぜひ見てください。私の唯一のためらいは...上記のパッケージの作者のコメントから茎;)
T. Verron

1
plurが必要emacs 24.4です。
T.バーロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.