วิธีการเลือกคอลัมน์จากนั้นทำการแก้ไขใน GNU Emacs?


15

ฉันใช้ ViM, TextMate และ GNU Emacs มาหลายปีแล้ว

ตัวอย่างเช่นนี่คือข้อความที่ฉันต้องการแก้ไข

foo
foo
foo

และนี่คือผลลัพธ์ข้อความที่ฉันต้องการ

bar foo
bar foo
bar foo

เมื่อฉันอยู่ในกลุ่มฉันสามารถทำ "Ctrl v" ในบรรทัดแรกและคอลัมน์แรกจากนั้นกด "2 j" จากนั้นกด "i" จากนั้นพิมพ์ "bar" เสร็จแล้ว

เมื่อฉันใช้ Textmate ฉันสามารถกด "Apple Command Option" ทั้งคู่ในขณะที่เลือกลง (ด้วยเมาส์ของฉัน) จากนั้นพิมพ์ "bar" เสร็จแล้ว

แต่เมื่อฉันใช้ GNU Emacs 23.1 ฉันไม่รู้ว่าจะทำอย่างไร : ((

ฉันค้นหา EmacsWiki และ googling ไปรอบ ๆ แต่ไม่ได้รับการแก้ไข กรุณาแนะนำฉันถ้าคุณรู้วิธีแก้ปัญหาของฉัน จะขอบคุณสำหรับการที่


@Trey Jackson และ @humble coffee แก้ไขขอบคุณมาก !!
Arie

คำตอบ:


16

สองทางเลือกที่อยู่ในใจ ที่แรกก็คือรูปสี่เหลี่ยม (ดังที่กล่าวไว้ในคำตอบอื่น) ทิศทางที่ชัดเจนสำหรับสิ่งนั้นคือ:

  1. ข้ามไปบรรทัดแรกคอลัมน์แรก
  2. C-SPC
  3. ไปที่บรรทัดสุดท้าย (คอลัมน์แรก)
  4. C-x r t bar SPC RET

อีกตัวเลือกหนึ่งที่ให้บริการดีมากสี่เหลี่ยมผืนผ้า / คอลัมน์การแก้ไขคำสั่งเป็นโหมดทรัสต์ นี่คือบล็อกโพสต์ (การเปิดเผย: บล็อกของฉัน) ที่อธิบายวิธีใช้ หากต้องการดูพลังของโหมด CUA มันคุ้มค่าที่จะรับชมวิดีโอสามนาทีนี้

ฉันรวมโหมด CUA เข้ากับสิ่งต่อไปนี้ (เพราะฉันไม่ต้องการให้มีโหมดเครื่องหมายชั่วคราว):

(setq cua-enable-cua-keys nil)
(setq cua-highlight-region-shift-only t) ;; no transient mark mode
(setq cua-toggle-set-mark nil) ;; original set-mark behavior, i.e. no transient-mark-mode
(cua-mode)

11

ใน Emacs-24.4 การสนับสนุนพื้นฐานสำหรับสี่เหลี่ยมได้รับการปรับปรุงเล็กน้อยดังนั้นแทนที่จะใช้C-SPCแล้วตามด้วยC-x r tคุณสามารถทำได้:

C-x SPC
down down
C-t bar RET

สิ่งหนึ่งที่ดีเกี่ยวกับมันเมื่อเปรียบเทียบกับC-SPCวิธีนี้คือคุณจะได้รับข้อเสนอแนะแบบเห็นภาพเกี่ยวกับสี่เหลี่ยมที่คุณเลือก แน่นอนcua-modeวิธีการทำงานเช่นกัน (และทำงานในทำนองเดียวกัน)


น่าเศร้าที่ฉันเห็นว่าการปรับปรุงนั้นไม่เพียงพอเลย: ถูกcua-modeต้องมากกว่า ... เพียงแค่พูดถึงสิ่งใด: ในcua-modeขณะที่สี่เหลี่ยมผืนผ้าถูกเน้นฉันสามารถพิมพ์และเพิ่มข้อความได้ ใน emacs ปัจจุบันในตัว "การสนับสนุนฐาน" ไฮไลท์จะหายไป (การเลือกคือ "ยกเลิก") และอินพุตถูกแทรกที่จุดเคอร์เซอร์ นี่คือการตอบโต้ที่ง่ายและไม่ใช่สิ่งที่ฉันมักจะต้องการ (และทำความคุ้นเคยกับcua-modeมันได้อย่างไร)
ShinTakezou

@ShinTakezou: ในขณะที่คุณพบว่าตัวนับสี่เหลี่ยมโหมดเครื่องหมายใช้งานง่ายฉันพบว่าพฤติกรรมเคาน์เตอร์ของ cua ใช้งานง่าย โชคดีที่คุณได้รับเลือก หากคุณต้องการการสนับสนุนของ cua คุณสามารถเปิดใช้งานโหมด cua หรือ (หากคุณต้องการการสนับสนุนรูปสี่เหลี่ยมผืนผ้า(global-set-key [?\C-x ?\s] 'cua-rectangle-mark-mode)เท่านั้น)
สเตฟาน

ในความเป็นจริงคือสิ่งที่ฉันทำ: ติดกับโหมด cua มันทำงานเหมือน: เน้นคอลัมน์พิมพ์ข้อความเสร็จแล้ว มิฉะนั้น: ไฮไลต์คอลัมน์ว่าคุณต้องการเพิ่มข้อความพิมพ์ข้อความใน minibuffer (คุณจะไม่เห็นมันปรากฏอยู่ในบัฟเฟอร์เมื่อคุณพิมพ์ ... ), ... เสร็จแล้ว คุณจะเห็นการพิมพ์ผิดในถ่านตัวสุดท้าย ... ในโหมด cua ฉันสามารถดูได้ในขณะที่ฉันพิมพ์ลบ (ไม่เลิกทำการแทรกทั้งหมด) ทบทวนใหม่แทรกถ่านอีกตัว ... และสี่เหลี่ยมผืนผ้าเน้นไว้ ตามที่ฉันต้องการ btw และฉันสามารถย่อขยายขยายพิมพ์ข้อความเพิ่มเติมหรือ "ตัด" ที่สี่เหลี่ยมผืนผ้าใหม่ ... ดังนั้นสำหรับฉันมันใช้งานง่ายและสะดวกสบายมากขึ้น
ShinTakezou

ฉันดีใจที่คุณชอบมัน ;-)
สเตฟาน

BTW ใน Emacs-25 การดำเนินการที่ไม่ใช่ CUA rectange C-t(aka C-x r t) ยังแสดงตัวอย่างของข้อความที่แทรกใหม่เมื่อคุณพิมพ์
สเตฟาน

2

ใน emacs คอลัมน์ประเภทนี้เรียกว่า 'rectangles' ดังนั้นนี่คือหน้าเอกสารที่เกี่ยวข้อง

คำสั่งทั้งหมดเหล่านี้ต้องการให้พื้นที่มีสี่เหลี่ยมผืนผ้าที่คุณกำลังใช้งานอยู่ ดังนั้นคุณต้องตั้งเครื่องหมายบนตัวอักขระซ้ายบนในสี่เหลี่ยมและขยายขอบเขตไปยังอักขระขวาล่างในสี่เหลี่ยม คำสั่งที่คุณใช้หลังจากM-x string-insert-rectangleนั้นจะแจ้งให้คุณใส่สตริง


1

คำตอบที่สั้นที่สุด: C-RETเปิดใช้งานโหมดสี่เหลี่ยมผืนผ้าทรัสต์ผ่าน

ดังนั้นสำหรับกรณีของคุณมันจะเป็น

  1. ไปที่บรรทัดแรกคอลัมน์แรกและกดC-RETเพื่อเข้าสู่โหมด CUA
  2. ไปที่บรรทัดสุดท้ายคอลัมน์แรกและพิมพ์ barSPC
  3. ออกจากโหมด CUA ผ่านESCหรือ CG

ดูคำตอบของ @Trey สำหรับวิธีการแก้ปัญหาที่ซับซ้อนมากขึ้นและเชื่อมโยงไปยัง CUA


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

0

คุณสามารถใช้ replace-regexp สำหรับสิ่งนี้:

  1. กำหนดเครื่องหมายเป็นบรรทัดสุดท้าย -> C SPC และไปที่บรรทัดสุดท้าย
  2. พิมพ์ Mx replace-regexp RET ใน minibuffer (ฉันมีการเชื่อมต่อที่สำคัญสำหรับนายนี้)
  3. ให้ ^ RET
  4. พิมพ์ bar และกด RET

นี่จะเพิ่มแถบไปยังจุดเริ่มต้นของบรรทัด

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