Tìm kiếm và thay thế, bởi M-%và !, đượ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.
:%s/foo/bar
Tìm kiếm và thay thế, bởi M-%và !, đượ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.
:%s/foo/bar
Câu trả lời:
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.
transient-mark-mode
được bật. Nếu không C-SPC C-SPC
sẽ tạm thời kích hoạttransient-mark-mode
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))))
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ộ đệmM-%
- 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ạnBạn có thể thêm phần này vào init.el
tệ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)
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ó.
Đâ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)