Làm thế nào để tìm kiếm và thay thế trong toàn bộ bộ đệm?


17

Tìm kiếm và thay thế, bởi M-%!, được thực hiện từ vị trí hiện tại đến cuối bộ đệm. Làm thế nào tôi có thể làm điều đó cho toàn bộ bộ đệm? Cảm ơn.


2
Tôi đề nghị thay đổi tiêu đề thành "tìm kiếm và thay thế toàn bộ bộ đệm". Trên toàn cầu cũng có thể được đề cập đến toàn bộ các dự án.
Malabarba

1
Đây là một lĩnh vực mà Vim / Evil khó đánh bại::%s/foo/bar
shosti

@shosti: Thật ra, tôi nghĩ phương pháp của bạn đòi hỏi nhiều tổ hợp phím hơn. Chỉ cần nói ';-)
nispio

Câu trả lời:


14

Tôi không thấy rằng được hỗ trợ trong khi vẫn giữ vị trí bắt đầu của bạn. (Tôi không thấy cách nào để bắt đầu bộ đệm khi tìm kiếm đến cuối.)

Đặt cược tốt nhất của bạn là sử dụng M-<để bắt đầu bộ đệm, sau đó thực hiện query-replace, khi bạn hoàn thành nhấn C-uC-spaceC-uC-spaceđể quay trở lại điểm xuất phát của bạn.


1
Điều này hoạt động khi transient-mark-modeđược bật. Nếu không C-SPC C-SPCsẽ tạm thời kích hoạttransient-mark-mode
nispio

5
Không cần thiết lập dấu bằng tay với C-SPC. M- <(và nhiều lệnh khác có khả năng "di chuyển điểm xa") thực hiện điều đó cho bạn.
Mathias Dahl

9

Bạn có thể thêm lệnh sau vào tệp khởi tạo emacs của mình và liên kết nó với tổ hợp phím bạn chọn.

(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

Bạn có thể làm theo các bước sau:

  • C-x h- Chọn toàn bộ bộ đệm hoặc M-< - Chuyển đến đầu bộ đệm
  • M-% - Khởi xướng query-replace
  • ! - Buộc thay thế tất cả
  • C-u C-SPC C-u C-SPC - Di chuyển trở lại vị trí bắt đầu của bạn

Điều này sẽ được chú ý nhiều hơn.
Indra

3

Bạn có thể thêm phần này vào init.eltệp của mình để cập nhật hành vi M-%thay thế từ trong toàn bộ bộ đệm theo mặc định:

(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)

Và để có được hành vi tương tự từ 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)

Rất hữu ích. Cảm ơn.
NVaughan

2

Nếu bạn sử dụng Icicles thì bạn có thể tìm kiếm và thay thế trên toàn bộ bộ đệm (hoặc nhiều bộ đệm hoặc tệp hoặc mục tiêu đánh dấu).

Và không giống như query-replace(ví dụ C-x h M-%):

  • Bạn có thể điều hướng các trận đấu theo thứ tự bất kỳ .

  • Thay thế là theo yêu cầu: bạn không cần phải truy cập mỗi trận đấu và trả lời có hay không thay thế nó.


0

Đây là giải pháp tôi hiện đang sử dụng, nó bắt đầu từ khi bắt đầu bộ đệm và sẽ quay trở lại điểm cũ sau khi thay thế.

(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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.