มีเทียบเท่ากับคำสั่งทดแทนสไตล์ sed จากเสียงเรียกเข้า?


14

สิ่งหนึ่งที่ฉันพลาดจากเสียงเรียกเข้าคือสามารถพิมพ์คำสั่งการแทนที่ที่จะทำงานผ่านหลายบรรทัดตัวอย่างเช่น:

:/begin/,/end/s/foo/bar/g

คำสั่งดังกล่าวใช้แทน "foo" สำหรับ "bar" ที่ขึ้นต้นด้วยบรรทัดแรกที่มี "start" และลงท้ายด้วยบรรทัดถัดไปหลังจากนั้นจะมี "end"

มีวิธีการทำสิ่งที่คล้ายกันใน emacs หรือไม่?

คำตอบ:


7

evilให้รุ่นที่แยกลงมาexดังนั้นจึงควรสันนิษฐานว่าไม่ใช่ของจริง อย่างไรก็ตามตัวอย่างที่คุณให้มาทำงานนอกกรอบโดยมีจุดนั้นอยู่ก่อนหน้าบรรทัดแรก (เช่นbeginบรรทัดในตัวอย่างของคุณ)


ในการค้นหาจะเริ่มต้นที่จุดดังนั้นเสียงเหมือนสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Larry Coleman

8

นี่คือวิธีหนึ่งในการดำเนินการที่ใช้ฟังก์ชันการทำงานที่มีอยู่แล้วเท่านั้น:

  1. ด้วยจุดในเส้นที่มีเกิดขึ้นครั้งแรกของการกดbeginC-SPC

  2. ย้ายไปที่การเกิดขึ้นครั้งต่อไปของend:

    C-s end RET

  3. แทนที่fooด้วยbar:

    M-% foo RET bar RET !

สิ่งนี้ทำให้การใช้งานของความจริงที่query-replaceจะทำงานในพื้นที่ที่ใช้งานแทนบัฟเฟอร์ทั้งหมดหากมีหนึ่ง


แน่นอนคุณยังสามารถกำหนดคำสั่งที่กำหนดเอง:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

คำสั่งนี้จะค้นหาจากจุดเริ่มต้นของบัฟเฟอร์เสมอดังนั้นจุดสามารถอยู่หลังbegin/ foo/ endเมื่อคุณเรียกใช้

ตั้งค่าการเชื่อมโยงคีย์ผ่าน:

(global-set-key (kbd "C-c r") 'replace-from-to)

5

โดยทั่วไปนี่คือสิ่งที่คุณจะใช้narrow-to-regionสำหรับ

คุณเลื่อนเคอร์เซอร์ (ตัวอย่างเช่นโดยการค้นหา) จุดเริ่มต้นของภูมิภาคและกดแล้วย้ายไปยังจุดสิ้นสุดของภูมิภาคและชนิดC-SPC M-x narrow-to-regionตอนนี้คุณสามารถออกคำสั่งค้นหาและแทนที่คำสั่งที่คุณต้องการและพวกเขาจะใช้กับส่วนที่แคบลงของบัฟเฟอร์ เมื่อเสร็จแล้วให้พิมพ์M-x widenเพื่อกู้คืนเนื้อหาบัฟเฟอร์


4
ถ้าbegin/ endเป็นตัวคั่นในการเขียนโปรแกรมภาษาคุณจะสามารถใช้C-M-Spaceในการเรียกใช้mark-sexpการเลือกพื้นที่ในคำสั่งอย่างใดอย่างหนึ่ง
dgtized

1
การผูกเริ่มต้น: C-x n n( narrow-to-region) และC-x n w( widen)
itsjeyd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.