ค้นหาและแทนที่ด้วยM-%และ!ทำจากตำแหน่งปัจจุบันถึงจุดสิ้นสุดของบัฟเฟอร์ ฉันจะทำเพื่อบัฟเฟอร์ทั้งหมดได้อย่างไร ขอบคุณ
:%s/foo/bar
ค้นหาและแทนที่ด้วยM-%และ!ทำจากตำแหน่งปัจจุบันถึงจุดสิ้นสุดของบัฟเฟอร์ ฉันจะทำเพื่อบัฟเฟอร์ทั้งหมดได้อย่างไร ขอบคุณ
:%s/foo/bar
คำตอบ:
ฉันไม่เห็นว่าได้รับการสนับสนุนในขณะที่ยังคงรักษาตำแหน่งเริ่มต้นของคุณ (ฉันไม่เห็นวิธีการตัดคำจนถึงจุดเริ่มต้นของบัฟเฟอร์เมื่อการค้นหาถึงจุดสิ้นสุด)
ทางออกที่ดีที่สุดของคุณคือใช้M-<เพื่อไปที่จุดเริ่มต้นของบัฟเฟอร์จากนั้นทำquery-replace
เมื่อคุณกดC-uC-spaceC-uC-spaceเพื่อข้ามกลับไปยังจุดเริ่มต้น
transient-mark-mode
เปิด มิฉะนั้นC-SPC C-SPC
จะเปิดใช้งานชั่วคราวtransient-mark-mode
คุณสามารถเพิ่มคำสั่งต่อไปนี้ไปยังไฟล์เริ่มต้น 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))))
คุณสามารถทำตามขั้นตอนต่อไปนี้:
C-x h
- เลือกบัฟเฟอร์ทั้งหมดหรือ M-<
- ไปที่ด้านบนของบัฟเฟอร์M-%
- เริ่มต้น query-replace
!
- บังคับให้แทนที่ทั้งหมดC-u C-SPC C-u C-SPC
- เลื่อนกลับไปที่ตำแหน่งเริ่มต้นของคุณคุณสามารถเพิ่มสิ่งนี้ลงใน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)
หากคุณใช้Iciclesคุณสามารถค้นหาและแทนที่บัฟเฟอร์ทั้งหมด (หรือบัฟเฟอร์หลายไฟล์หรือไฟล์หรือเป้าหมายบุ๊คมาร์ค)
และไม่เหมือนquery-replace
(เช่นC-x h M-%
):
นี่เป็นวิธีที่ฉันใช้อยู่เริ่มจากจุดเริ่มต้นของบัฟเฟอร์และจะกลับไปที่จุดเดิมหลังจากแทนที่
(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)