วิธีตัดข้อความตามภูมิภาค


11

ฉันมักจะมีสถานการณ์ที่ฉันต้องใช้ข้อความในภูมิภาค สำหรับ HTML และกรณีง่าย ๆ มีห้องสมุดสำหรับสิ่งนี้อยู่แล้ว แต่แล้วเรื่องทั่วไปล่ะ ฉันต้องการที่จะถามว่าฉันจะแทรกจุดเริ่มต้นและจุดสิ้นสุดของภูมิภาค


คุณต้องการที่จะใช้มันเพื่อแทรกเนื้อหาโดยพลการหนึ่งครั้งหรือหลายคู่หรือไม่? ในกรณีหลังไลบรารีเช่น smartparens สามารถพิสูจน์ได้ว่ามีประโยชน์และพวกเขาสามารถขยายด้วยคู่ที่กำหนดเอง ตัวอย่างเช่นคุณสามารถเพิ่มคู่<?php... ?>และจากนั้นเมื่อคุณเลือกภูมิภาคและประเภท<?php(หรือการผูกกุญแจ) ให้ห่อไว้ในคู่ แต่ afaik ไม่มีวิธีที่ง่ายในการใช้ไลบรารี่เหล่านี้ถ้าคุณมีคู่เดียว
T. Verron

@ T.Verron: ฉันรู้ว่ามีอยู่จริง แต่สำหรับช่วงเวลาเหล่านั้นเมื่อมีความต้องการที่ไม่ซ้ำกันในการอ่านโค้ดและทำเครื่องหมายฟังก์ชั่นการใช้ซ้ำได้ทั่วไปที่สามารถนำกลับมาใช้ใหม่ได้จะดีที่สุด
nperson325681

คำตอบ:


6

ฉัน googled รอบและพบการโพสต์นี้โดยจอห์นดีคุก เขาสาธิตวิธีการสร้างฟังก์ชั่นอินเทอร์แอคทีฟที่เรียบง่ายเพื่อรับแท็ก HTML / XML รอบภูมิภาคได้อย่างง่ายดาย จากนั้นฉันปรับเปลี่ยนฟังก์ชั่นเพื่อถามสองครั้ง

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

ที่สำคัญกว่านั้นฟังก์ชั่นนี้ยังสามารถใช้เป็นเครื่องมือเสริมเช่นเมื่อคุณต้องการผูกปุ่มเพื่อแมปข้อความที่ระบุ

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

Btw วิธีนี้จัดการกรณีขอบเขตไม่เหมาะสม การค้นหาจุดเริ่มต้นอาจล้มเหลวในบางครั้งและปล่อยให้แท็กทั้งคู่อยู่ท้ายสุด อาจเป็นได้evilว่าฉันใช้สิ่งนั้นรบกวนที่นี่ บางทีฟังก์ชั่นของประเภทinteractive "r" ทำงานได้อย่างมีประสิทธิภาพมากขึ้น?
nperson325681

4

ฉันขอแนะนำวิธีการที่แตกต่าง เมื่อมีภูมิภาคโดยนิยามpointจะต้องอยู่ที่จุดเริ่มต้น (หรือสิ้นสุด) ของภูมิภาคและmarkจะอยู่ที่ท้าย (หรือเริ่มต้น) ซึ่งหมายความว่าคุณสามารถป้อนข้อความที่คุณต้องการจากนั้นใช้exchange-point-and-markเช่นC-x C-xเพื่อข้ามไปยังส่วนอื่น ๆ ของภูมิภาค ใส่เสื้อคลุมครึ่งหลังของคุณแล้วเสร็จ

คุณไม่ได้รับการถามอย่างชัดเจนเกี่ยวกับข้อความแทรก แต่ฉันไม่สามารถจินตนาการได้ว่าจะมีวิธีการทำสิ่งเดียวกันโดยใช้ความพยายามน้อยลง


หากข้อความเริ่มต้นและจุดสิ้นสุดเหมือนกันฉันสงสัยว่ามีบางสิ่งที่เหมือนกันที่multiple-cursorsสามารถ tweaked เพื่อแทรกข้อความพร้อมกันที่จุดเริ่มต้นและจุดสิ้นสุดของพื้นที่ที่ใช้งานอยู่
ลูกัส

ดูเหมือนว่าจะเป็นวิธีที่ผู้ใช้งานของบรรณาธิการน้อยกว่าถูกบังคับให้ทำ อย่างไรก็ตามฉันอ่านมาโครในการใช้คำบรรยายย่อยจากคำตอบของคุณต้องบอกว่า ฉันชอบสไตล์ของคุณ
nperson325681

1
@progo - ขอบคุณ :) ดูเหมือนว่าจะเป็นแนวทางแบบแมนนวล แต่จริงๆแล้วมันใช้การกดแป้นน้อยกว่าทางเลือกของคุณ ด้วยวิธีนี้อื่น ๆ C-x C-xกว่าวางรูปภาพกับข้อความที่คุณต้องการเพียง ด้วยคำตอบของคุณคุณต้องเรียกใช้ฟังก์ชันของคุณ ( C-c something) และคุณต้องกดreturnหลังจากแต่ละรายการ ดังนั้นไม่ว่าคุณจะทำอะไรคุณก็มีการกดปุ่มอีกสองครั้ง ที่กล่าวว่าจะไม่ช่วยถ้าคุณต้องการสิ่งที่โทรจาก elisp
ไทเลอร์

3

เพื่อความหลากหลาย:

วิธีการที่จะทำเช่นนี้กับบางส่วนเริ่มต้นโดยพลการและข้อความตอนท้ายอีกก็จะไปใช้replace-regexpในภูมิภาค: การแข่งขัน.+และแทนที่ด้วยbefore \& afterหรือข้อความใด ๆ ที่คุณต้องการใช้งานและbeforeafter

คุณสามารถเขียนคำสั่งให้ทำสิ่งนี้ แต่ฉันกำลังคิดถึงกรณีที่ในไฟล์ที่กำหนดคุณต้องการใช้ข้อความเริ่มต้น / สิ้นสุดเดียวกันในหลาย ๆ ที่ คุณสามารถบันทึกแมโครหรือใช้ประวัติ minibuffer เพื่อทำซ้ำในภูมิภาคอื่น

แน่นอนหากข้อความที่คุณต้องการตัดสามารถแสดงเป็นนิพจน์ปกติคุณไม่จำเป็นต้องเลือกพื้นที่และสามารถทำquery-replace-regexpบัฟเฟอร์ได้ แต่สมมุติว่าข้อความที่คุณต้องการตัดไม่สอดคล้องกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.