วิธีการเลือกภูมิภาคที่ไม่ต่อเนื่องใน Emacs


31

สมมติว่าฉันได้เลือกข้อความบางส่วนในบัฟเฟอร์ปัจจุบันแล้ว เป็นไปได้หรือไม่ที่จะเลือกข้อความอีกส่วนหนึ่งในขณะที่ยังคงส่วนที่เลือกไว้ก่อนหน้า (และอื่น ๆ )

เพิ่ม : หนึ่งแรงจูงใจสำหรับการทำงานนี้เป็นดังนี้: สมมติว่าฉันมีข้อความที่มีลักษณะเช่นนี้:

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

ฉันต้องการลบย่อหน้าบางส่วน (เช่น 2, 4 และ 6) และแทรกไว้ข้างหน้าวรรค 1


1
มีความเป็นรอง เลือก
wasamasa

2
มีหลายตัวเลือกแพคเกจ: skamphausen.de/cgi-bin/ska/multiselectดูเหมือนว่าจะเป็นแฮ็คที่รวดเร็ว
Tobias

ขึ้นอยู่กับขนาดของสิ่งที่คุณเลือกและสาเหตุmultiple-cursorsอาจให้ทางแก้ปัญหาแก่คุณ
Jordon Biondo

@wasamasa ฉันทำตามคำแนะนำในลิงค์ที่คุณให้ไว้ หลังจากการเลือกครั้งแรกฉันเลือกภูมิภาคที่สองของฉันในการเก็บคีย์ Meta เลือกแล้ว แต่มีปัญหาสองประการ: (1) ตัวเลือกที่สองดูเหมือนจะไม่ใช่ตัวเลือกจริงเนื่องจากการคัดลอกหรือลบไม่ทำงาน (2) ไม่สามารถเลือกตัวเลือกที่สามด้วยวิธีนี้
ชื่อ

1
Emacs วิกิพีเดียมีส่วนที่ดีเกี่ยวกับการเลือกรอง การปรับปรุงต่างๆทำให้สามารถใช้งานได้มากขึ้นจากแป้นพิมพ์เป็นต้น
ดึง

คำตอบ:


43

คุณสามารถใช้append-next-kill(ผูกไว้กับC-M-wค่าเริ่มต้น) เพื่อรวบรวมข้อความที่คุณต้องการแทรกด้านบนparagraph 1:

  1. ฆ่าparagraph 2ตามปกติ

  2. ทำเครื่องหมายparagraph 4และกดC-M-wก่อนที่จะฆ่ามัน paragraph 1ทำซ้ำขั้นตอนนี้สำหรับทุกย่อหน้าที่คุณต้องการที่จะย้ายก่อน

เมื่อเสร็จแล้วคุณสามารถดึงข้อความที่สะสมไว้ก่อนหน้าparagraph 1นี้


5
แม้จะมีสิ่งพื้นฐานก็ยังมีสิ่งใหม่ให้เรียนรู้อยู่เสมอ! สิ่งนี้มีประโยชน์มากเพราะฉันมักจะกดปุ่มจำนวนมากโดยการเดินทางไปที่แหวนสังหารเมื่อฉันต้องทำสิ่งนี้ หวังว่าฉันจะสามารถโหวตได้อีกต่อไป ...
ชื่อผู้ใช้ที่มีความหมาย

9

คุณสามารถใช้รีจิสเตอร์รวมกับแหวนมาร์ค กดเครื่องหมายในปัจจุบันมีการC-<SPC> C-<SPC>กู้คืนได้ในภายหลังด้วยC-u C-<SPC>หรือบันทึกไว้ในทะเบียนการพูดbผ่านและกระโดดกลับในภายหลังด้วยC-x r <SPC> bC-x r j b

ตอนนี้ทำเครื่องหมายภูมิภาคอื่น C-u C-x r s aจะคัดลอกภูมิภาคที่ทำเครื่องหมายไว้เพื่อลงทะเบียนaและลบข้อความ จากนั้นทำเครื่องหมายภูมิภาคถัดไปและC-u C-x r + aจะผนวกส่วนที่เลือกอื่นไว้ในการลงทะเบียนaและลบทิ้ง

C-x r i aจากนั้นคุณสามารถแทรกเนื้อหาที่มี

ดูส่วน "การบันทึกข้อความในการลงทะเบียน" ของคู่มือ Emacs


5

การสนับสนุนรูปสี่เหลี่ยมผืนผ้าภูมิภาคใหม่ใน Emacs-24.4 ได้เปิดตัวจริงแล้ว (ส่วนใหญ่) โครงสร้างพื้นฐานที่จำเป็นสำหรับการทำงานนี้ [หลังจากทั้งหมดพื้นที่สี่เหลี่ยมผืนผ้าเป็นภูมิภาคที่ไม่ต่อเนื่อง]

ดังนั้นตอนนี้ควรเป็นไปได้ที่จะใช้แพ็คเกจ "แยกพื้นที่" ซึ่งมีฟังก์ชั่นการใช้งานที่คุณต้องการ

เป็นที่ยอมรับกันว่าคำสั่ง Emacs จำนวนมากยังไม่ได้รับการปรับให้ใช้โครงสร้างพื้นฐานใหม่ (เช่นคำสั่งเช่น upcase-region หรือเลิกทำในภูมิภาค, การแทนที่ query, ... ) และดังนั้นจึงไม่สามารถทำงานได้อย่างถูกต้องบนสี่เหลี่ยม (ดังนั้นพวกเขาจะไม่ทำงานอย่างถูกต้องใน "แบ่งเขต" อย่างใดอย่างหนึ่ง) แต่สิ่งเหล่านี้เป็นข้อบกพร่องที่หวังว่าจะได้รับการแก้ไขในช่วงเวลา


4

ติดตั้ง Browsing-kill-ring.el

คัดลอกและฆ่าทุกภูมิภาคที่สนใจ

ถึงจุดที่ควรเริ่มการแทรกใหม่

M-x browse-kill-ring RET จะเปิดบัฟเฟอร์และวางเคอร์เซอร์ไว้

ประเภทที่nจะเดินทางชิ้น

RET จะมีการแทรกอันที่จุดในบัฟเฟอร์เดิม / อื่น ๆ


3

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

ตัวอย่างเช่นใช้งานได้อย่างยอดเยี่ยมเมื่อใช้ร่วมกับโหมดหลายเคอร์เซอร์ : เนื่องจากบรรทัดที่คุณเลือกให้ปรากฏในบัฟเฟอร์ Occur แสดงขึ้นอย่างต่อเนื่องไม่ว่าพวกเขาจะอยู่ในบัฟเฟอร์เดิมเท่าใดคุณสามารถทำเครื่องหมายทั้งหมดหรือ ส่วนย่อยจากนั้นเปิดใช้งานmc/edit-linesและแก้ไขทั้งหมดในครั้งเดียว (ใช่ฉันรู้ว่าเคอร์เซอร์หลายตัวสามารถทำได้ด้วยตัวเองด้วยmc/mark-all-like-thisแต่มันก็ดีที่มีตัวเลือก)

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


3

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

ขณะนี้ Emacs มีสิ่งที่เรียกว่าภูมิภาคที่ไม่ต่อเนื่องซึ่งเป็นตัวเลือกที่คุณต้องการ วานิลลา Emacs ไม่ได้ให้วิธีพิเศษใด ๆ ในการสร้างภูมิภาคที่ไม่ติดกันยกเว้นถ้ามันเป็นรูปสี่เหลี่ยมผืนผ้า แต่Zones ในห้องสมุดไม่

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

หากคุณใช้ไลบรารีคั่นหน้า +คุณสามารถบันทึกรายการโซนอย่างต่อเนื่องและเรียกคืนได้ในเซสชัน Emacs ในภายหลัง คั่นหน้า + ยังช่วยให้คุณกำหนดแท็กโดยพลการให้กับบุ๊กมาร์ก ซึ่งหมายความว่าคุณสามารถติดแท็กรายการโซน

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

มีหลายวิธีในการสร้างโซน หนึ่งในวิธีที่ง่ายที่สุดคือใช้C-x n a: มันกำหนดโซนจากพื้นที่ที่ใช้งานอยู่และเพิ่มเข้าไปในชุดโซนปัจจุบัน ( C-x n n( narrow-to-region) ทำเช่นนี้นอกเหนือจากการ จำกัด )

นี่คือบางสิ่งที่คุณสามารถทำได้ด้วยชุด (รายการ) ของโซน:

  • เรียงพวกเขา
  • รวมตัวกัน (รวมกัน) โซนที่อยู่ติดกันหรือทับซ้อนกัน (ซึ่งรวมถึงการเรียงลำดับพวกเขา)
  • ตัดกัน
  • จำกัด บัฟเฟอร์ไปยังโซนในรายการ ขี่จักรยานท่ามกลางความคับแคบ ดูแคบ ๆ หลาย
  • เลือกโซนในรายการเป็นภูมิภาคที่ใช้งานอยู่ วนตามภูมิภาค
  • ค้นหาพวกเขา (พวกเขาจะรวมเป็นหนึ่งโดยอัตโนมัติก่อน) สำหรับนี้คุณต้องห้องสมุดiSearch +
  • ค้นหาแทนที่พวกเขา
  • ไฮไลต์และไฮไลต์ (สำหรับนี้คุณต้องห้องสมุดจุดเด่นfacemenu+.elหรือห้องสมุด

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


2

ตัวเลือกอื่น: การเปลี่ยนย่อหน้า

เพื่อความสมบูรณ์คุณสามารถบรรลุการจัดเรียงลำดับย่อหน้าใหม่ (ตามลำดับ) พร้อมภูมิภาคที่มีเครื่องหมายและM-0 M-x transpose-paragraph(อาร์กิวเมนต์ศูนย์ทำให้tra-parสลับย่อหน้าที่มีจุดและเครื่องหมายอยู่นั่นคือพื้นที่เริ่มต้นและสิ้นสุด)!

โดยวิธีนี้ใช้ได้กับtranspose-.*คำสั่งทั้งหมด(-words, -sexp, -sentences, ... ) และมีประโยชน์อย่างมากในหลาย ๆ สถานการณ์


2

อีกวิธีคือใช้แพ็คเกจobjed (ฉันเป็นผู้เขียน) คุณสามารถทำเครื่องหมายวัตถุข้อความใด ๆ ที่มีmการย้ายจุดไปยังวัตถุถัดไปของชนิดปัจจุบันโดยอัตโนมัติ ไม่ทำเครื่องหมายวัตถุใด ๆ โดยไปที่วัตถุแล้วกด m อีกครั้ง นี่คือตัวอย่าง screencast (แสดงเส้นการทำเครื่องหมาย แต่ใช้ได้กับวัตถุอื่นเช่นย่อหน้า, defuns ... เช่นกัน):

ป้อนคำอธิบายรูปภาพที่นี่


เมื่อฉันพยายามที่จะติดตั้งแพคเกจนี้จาก Melpa package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not foundฉันได้รับข้อผิดพลาด
ชื่อ

@ ชื่อฟังดูเหมือนต้องอัปเดตรายชื่อแพ็คเกจของคุณ ลองแล้วM-x package-refresh-contents M-x package-install
clemera

@Name มันใช้งานได้ตอนนี้หรือไม่ แจ้งให้เราทราบหากคุณมีคำถามเพิ่มเติม
clemera

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