전체 버퍼에서 검색하고 바꾸는 방법?


17

검색으로 대체 M-%하고 !, 버퍼의 끝에 현재 위치에서 이루어집니다. 전체 버퍼에 대해 어떻게 할 수 있습니까? 감사.


2
제목을 "전체 버퍼 검색 및 바꾸기"로 변경하는 것이 좋습니다. 전 세계적으로 전체 프로젝트를 언급 할 수도 있습니다.
Malabarba

1
이것은 Vim / Evil이 이길 수없는 영역 중 하나입니다.:%s/foo/bar
shosti

@ shosti : 사실, 당신의 방법에는 더 많은 키 입력이 필요하다고 생각합니다. 그냥
말하기

답변:


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-<(그리고 잠재적으로 "먼 곳으로 이동"하는 많은 다른 명령들)이 당신을 위해 그것을합니다.
Mathias Dahl

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 — 시작 위치로 다시 이동

더주의를 기울여야합니다.
Indra

3

init.el파일에 이것을 추가 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 2019

2

차가워 요 를 사용하는 경우 전체 버퍼 (또는 여러 버퍼 또는 파일 또는 책갈피 대상)를 검색하고 바꿀 수 있습니다 .

그리고 달리 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.