วิธีการค้นหาและแทนที่ในบัฟเฟอร์ทั้งหมด?


17

ค้นหาและแทนที่ด้วยM-%และ!ทำจากตำแหน่งปัจจุบันถึงจุดสิ้นสุดของบัฟเฟอร์ ฉันจะทำเพื่อบัฟเฟอร์ทั้งหมดได้อย่างไร ขอบคุณ


2
ฉันขอแนะนำให้เปลี่ยนชื่อเป็น "ค้นหาและแทนที่บัฟเฟอร์ทั้งหมด" ทั่วโลกอาจหมายถึงโครงการทั้งหมด
Malabarba

1
นี้เป็นหนึ่งในพื้นที่ที่เป็นกลุ่ม / ชั่วร้ายยากที่จะชนะ::%s/foo/bar
shosti

@shosti: อันที่จริงฉันคิดว่าวิธีการของคุณต้องการการกดแป้นมากกว่า เพียงแค่ sayin ';-)
nispio

คำตอบ:


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- <(และคำสั่งอื่น ๆ อีกมากมายที่อาจ "ย้ายจุดไกล") ทำเพื่อคุณ
งัดดาห์ล

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ไฟล์ของคุณเพื่ออัปเดตพฤติกรรมของ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.