vimのsedスタイルの置換コマンドに相当するものはありますか?


14

vimで見落としていることの1つは、複数行で機能する置換コマンドを入力できることです。たとえば、

:/begin/,/end/s/foo/bar/g

上記のコマンドは、「begin」を含む最初の行で始まり、「end」を含む次の行で終わる「bar」を「foo」に置き換えます。

emacsで似たようなことをする方法はありますか?

回答:


7

evilexはの簡易バージョンを提供するため、正確なドロップインではないと想定するのがおそらく最善です。ただし、ポイントが最初の行(つまり、例の行)より前であれば、指定した例はそのまま使用できますbegin


vimでは、検索もポイントから開始されるため、私が探していたもののように聞こえます。ありがとう!
ラリーコールマン14年

8

組み込み機能のみを使用する1つの方法を次に示します。

  1. の最初の出現を含む行のポイントでbegin、を押しC-SPCます。

  2. 次のオカレンスに移動しendます:

    C-s end RET

  3. 交換するfoobar

    M-% foo RET bar RET !

これはquery-replace、バッファ全体が存在する場合、バッファ全体ではなくアクティブ領域で機能するという事実を利用します。


もちろん、カスタムコマンドを定義することもできます。

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

このコマンドは常にバッファーの先頭から検索するため、ポイントは呼び出したときにbegin/ foo/の後にendなります。

次の方法でキーバインディングを設定します。

(global-set-key (kbd "C-c r") 'replace-from-to)

5

一般的に、これはあなたが使用するものnarrow-to-regionです。

カーソルを(たとえば、検索によって)リージョンの先頭にC-SPC移動し、を押してから、リージョンの末尾に移動して、と入力しM-x narrow-to-regionます。これで、任意の検索および置換コマンドを発行でき、必要なコマンドはバッファーの狭い部分にのみ適用されます。完了したら、入力M-x widenしてバッファの内容を復元します。


4
場合begin/ endプログラミング言語で区切り文字あり、あなたはおそらく使用することができますC-M-Space実行するためにmark-sexp1つのコマンドで地域を選択します。
14年

1
デフォルトのバインディング:C-x n nnarrow-to-region)とC-x n wwiden)。
itsjeyd 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.