バッファ全体を検索および置換する方法は?


17

検索とにより、交換するM-%!、バッファの末尾に現在の位置から行われます。バッファ全体に対してどうすればよいですか?ありがとう。


2
タイトルを「バッファ全体を検索して置換」に変更することをお勧めします。グローバルには、プロジェクト全体を指すこともあります。
マラバルバ14

1
:これはVimの/悪は打ちにくいですつの領域である:%s/foo/bar
shosti

@shosti:実際、あなたの方法はより多くのキーストロークを必要とすると思います。Just sayin ';-)
nispio 14

回答:


14

まだ開始位置を維持している間はサポートされていません。(検索が終わりに達したときに、バッファーの先頭に折り返す方法がわかりません。)

最善の策M-<は、バッファの先頭に移動してから、をquery-replace押しC-uC-spaceC-uC-spaceて開始点に戻るまで押します。


1
これtransient-mark-modeは、オンのときに機能します。そうでない場合はC-SPC C-SPC、一時的に有効になりますtransient-mark-mode
nispio

5
C-SPCで手動でマークを設定する必要はありません。M- <(および潜在的に「長い道のりを移動する」他の多くのコマンド)はあなたのためにそれをします。
マティアスダール14

9

次のコマンドをemacs初期化ファイルに追加して、選択したキーストロークにバインドできます。

(defun replace-regexp-entire-buffer (pattern replacement)
  "Perform regular-expression replacement throughout buffer."
  (interactive
   (let ((args (query-replace-read-args "Replace" t)))
     (setcdr (cdr args) nil)    ; remove third value returned from query---args
     args))
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward pattern nil t)
      (replace-match replacement))))

9

次の手順を実行できます。

  • C-x h—バッファー全体を選択するか、 M-< - バッファーの先頭に移動します
  • M-% —開始する query-replace
  • ! —すべてを強制的に置換
  • C-u C-SPC C-u C-SPC —開始位置に戻る

これはもっと注目されるはずです。
インドラ

3

これをinit.elファイルに追加してto の動作を更新し、M-%デフォルトでバッファ全体の単語を置換できます。

(defun my/query-replace (from-string to-string &optional delimited start end)
  "Replace some occurrences of FROM-STRING with TO-STRING.  As each match is
found, the user must type a character saying what to do with it. This is a
modified version of the standard `query-replace' function in `replace.el',
This modified version defaults to operating on the entire buffer instead of
working only from POINT to the end of the buffer. For more information, see
the documentation of `query-replace'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           (if (and transient-mark-mode mark-active) " in region" ""))
       nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace from-string to-string t nil delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map "%" 'my/query-replace)

と同じ動作を取得するにはquery-replace-regexp

(defun my/query-replace-regexp (regexp to-string &optional delimited start end)
  "Replace some things after point matching REGEXP with TO-STRING.  As each
match is found, the user must type a character saying what to do with
it. This is a modified version of the standard `query-replace-regexp'
function in `replace.el', This modified version defaults to operating on the
entire buffer instead of working only from POINT to the end of the
buffer. For more information, see the documentation of `query-replace-regexp'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           " regexp"
           (if (and transient-mark-mode mark-active) " in region" ""))
       t)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace regexp to-string t t delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map [?\C-%] 'my/query-replace-regexp)

非常に便利。ありがとう。
NVaughan

2

Iciclesを使用する場合、バッファ全体(または複数のバッファまたはファイル、ブックマークターゲット)を検索および置換できます。

そしてとは異なりquery-replace(例C-x h M-%):

  • 任意の順序で一致ナビゲートできます。

  • 交換はオンデマンドです。各試合に行って、交換するかどうかを答える必要はありません


0

これは私が現在使用しているソリューションです。バッファの先頭から開始し、置換後に古いポイントに戻ります。

(defun query-replace-from-top ()
  (interactive)
  (let ((orig-point (point)))
    (save-excursion
      (goto-char (point-min))
      (call-interactively 'query-replace))
    (message "Back to old point.")
    (goto-char orig-point)))
(bind-key* "M-%" 'query-replace-from-top)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.