ฉันมักจะมีสถานการณ์ที่ฉันต้องใช้ข้อความในภูมิภาค สำหรับ HTML และกรณีง่าย ๆ มีห้องสมุดสำหรับสิ่งนี้อยู่แล้ว แต่แล้วเรื่องทั่วไปล่ะ ฉันต้องการที่จะถามว่าฉันจะแทรกจุดเริ่มต้นและจุดสิ้นสุดของภูมิภาค
ฉันมักจะมีสถานการณ์ที่ฉันต้องใช้ข้อความในภูมิภาค สำหรับ HTML และกรณีง่าย ๆ มีห้องสมุดสำหรับสิ่งนี้อยู่แล้ว แต่แล้วเรื่องทั่วไปล่ะ ฉันต้องการที่จะถามว่าฉันจะแทรกจุดเริ่มต้นและจุดสิ้นสุดของภูมิภาค
คำตอบ:
ฉัน 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 " "?>"))
evil
ว่าฉันใช้สิ่งนั้นรบกวนที่นี่ บางทีฟังก์ชั่นของประเภทinteractive "r"
ทำงานได้อย่างมีประสิทธิภาพมากขึ้น?
ฉันขอแนะนำวิธีการที่แตกต่าง เมื่อมีภูมิภาคโดยนิยามpoint
จะต้องอยู่ที่จุดเริ่มต้น (หรือสิ้นสุด) ของภูมิภาคและmark
จะอยู่ที่ท้าย (หรือเริ่มต้น) ซึ่งหมายความว่าคุณสามารถป้อนข้อความที่คุณต้องการจากนั้นใช้exchange-point-and-mark
เช่นC-x C-x
เพื่อข้ามไปยังส่วนอื่น ๆ ของภูมิภาค ใส่เสื้อคลุมครึ่งหลังของคุณแล้วเสร็จ
คุณไม่ได้รับการถามอย่างชัดเจนเกี่ยวกับข้อความแทรก แต่ฉันไม่สามารถจินตนาการได้ว่าจะมีวิธีการทำสิ่งเดียวกันโดยใช้ความพยายามน้อยลง
multiple-cursors
สามารถ tweaked เพื่อแทรกข้อความพร้อมกันที่จุดเริ่มต้นและจุดสิ้นสุดของพื้นที่ที่ใช้งานอยู่
C-x C-x
กว่าวางรูปภาพกับข้อความที่คุณต้องการเพียง ด้วยคำตอบของคุณคุณต้องเรียกใช้ฟังก์ชันของคุณ ( C-c something
) และคุณต้องกดreturn
หลังจากแต่ละรายการ ดังนั้นไม่ว่าคุณจะทำอะไรคุณก็มีการกดปุ่มอีกสองครั้ง ที่กล่าวว่าจะไม่ช่วยถ้าคุณต้องการสิ่งที่โทรจาก elisp
เพื่อความหลากหลาย:
วิธีการที่จะทำเช่นนี้กับบางส่วนเริ่มต้นโดยพลการและข้อความตอนท้ายอีกก็จะไปใช้replace-regexp
ในภูมิภาค: การแข่งขัน.+
และแทนที่ด้วยbefore \& after
หรือข้อความใด ๆ ที่คุณต้องการใช้งานและbefore
after
คุณสามารถเขียนคำสั่งให้ทำสิ่งนี้ แต่ฉันกำลังคิดถึงกรณีที่ในไฟล์ที่กำหนดคุณต้องการใช้ข้อความเริ่มต้น / สิ้นสุดเดียวกันในหลาย ๆ ที่ คุณสามารถบันทึกแมโครหรือใช้ประวัติ minibuffer เพื่อทำซ้ำในภูมิภาคอื่น
แน่นอนหากข้อความที่คุณต้องการตัดสามารถแสดงเป็นนิพจน์ปกติคุณไม่จำเป็นต้องเลือกพื้นที่และสามารถทำquery-replace-regexp
บัฟเฟอร์ได้ แต่สมมุติว่าข้อความที่คุณต้องการตัดไม่สอดคล้องกัน
<?php
...?>
และจากนั้นเมื่อคุณเลือกภูมิภาคและประเภท<?php
(หรือการผูกกุญแจ) ให้ห่อไว้ในคู่ แต่ afaik ไม่มีวิธีที่ง่ายในการใช้ไลบรารี่เหล่านี้ถ้าคุณมีคู่เดียว