ย้ายส่วนที่เลือกไปยังไฟล์แยกต่างหาก


12

ด้วย vim ฉันจะย้ายข้อความไปยังไฟล์ใหม่ได้อย่างไร? ในตอนนี้ฉันทำสิ่งนี้:

  • เลือกข้อความ
  • ใช้ :w new_file
  • เลือกข้อความอีกครั้ง
  • ลบข้อความ

มีวิธีที่มีประสิทธิภาพมากกว่านี้หรือไม่?

ก่อน

a.txt

sometext
some other text
some other other text
end

หลังจาก

a.txt

sometext
end

b.txt

some other text
some other other text

คำตอบ:


4

วิธีการเกี่ยวกับคำสั่งที่กำหนดเองเหล่านี้:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _

1
มันน่าเกลียดมาก แต่เดี๋ยวก่อนดูเหมือนว่าจะทำในขั้นตอนเดียวสิ่งที่ฉันขอ (ฉันพยายาม) +1 และยอมรับ ฉันกำลังมองหาวิธีดั้งเดิมที่จะทำสิ่งนี้ได้อย่างรวดเร็ว แต่เนื่องจากดูเหมือนว่าจะไม่มีทางคุณจะทำได้ดี ขอบคุณ!
greg0ire

1
ความงามอยู่ในสายตาของคนดู. ฉันพบว่ามันสวยมาก คุณจะต้องพิมพ์เพียงครั้งเดียว (ใน. vimrc ของคุณ)
Ingo Karkat

คุณพูดถูก "น่าเกลียดมาก" เป็น "ไม่คุ้นเคย" คำสั่งของคุณมีประโยชน์มากและฉันคิดว่าแน่นอนฉันจะแกะสลักใน. vimrc ของฉัน
greg0ire

8

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

ตัวอย่างต่างๆ:

  • :1,1 w new_file เพื่อสร้างไฟล์ใหม่ที่มีเฉพาะข้อความจากหมายเลขบรรทัด 1
  • :5,50 w newfile เพื่อสร้างไฟล์ใหม่ที่มีข้อความตั้งแต่บรรทัดที่ 5 ถึงบรรทัดที่ 50
  • :'a,'b w newfileเพื่อสร้างไฟล์ใหม่ที่มีข้อความจากเครื่องหมายaเพื่อทำเครื่องหมายb
    • กำหนดเครื่องหมายของคุณโดยใช้maและmbไม่ว่าคุณจะชอบที่ไหน

ด้านบนคัดลอกข้อความเท่านั้นและสร้างไฟล์ใหม่ที่มีข้อความนั้น จากนั้นคุณจะต้องลบภายหลัง

สิ่งนี้สามารถทำได้โดยใช้ช่วงเดียวกันและdคำสั่ง:

  • :5,50 d เพื่อลบข้อความจากบรรทัด 5 ถึงบรรทัด 50
  • :'a,'b dเพื่อลบข้อความจากเครื่องหมายaเพื่อทำเครื่องหมายb

หรือโดยใช้ddสำหรับตัวพิมพ์ใหญ่บรรทัดเดียว

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

:'<,'>

ซึ่งบ่งบอกถึงข้อความที่เลือก จากนั้นคุณสามารถขยายคำสั่งเป็น:

:'<,'>w >> old_file

ซึ่งจะผนวกข้อความไปยังไฟล์ที่มีอยู่ จากนั้นลบตามข้างบน


หนึ่งในสายการบิน:

:2,3 d | new +put! "

รายละเอียด:

  • :2,3 d - ลบบรรทัดที่ 2 ถึง 3
  • | - ในทางเทคนิคแล้วการเปลี่ยนเส้นทางเอาต์พุตของคำสั่งแรกไปยังคำสั่งที่สอง แต่เนื่องจากคำสั่งแรกไม่ได้ส่งออกอะไรเราแค่ผูกมัดคำสั่งไว้ด้วยกัน
  • new - เปิดบัฟเฟอร์ใหม่
  • +put! "- ใส่เนื้อหาของ register ที่ไม่มีชื่อ ( ") ลงในบัฟเฟอร์
    • ปัง ( !) อยู่ที่นั่นเพื่อให้เนื้อหาใส่ก่อนบรรทัดปัจจุบัน นี่เป็นสาเหตุและบรรทัดว่างที่ท้ายไฟล์ หากไม่มีก็จะมีบรรทัดว่างที่ด้านบนของไฟล์

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

@ greg0ire ฉันได้ว่าไปข้างหลังนิดหน่อยฉันจะแก้ไขเพื่ออธิบายให้ดียิ่งขึ้น
embedded.kyle

ฉันเพิ่มตัวอย่างเพื่อทำให้คำถามของฉันชัดเจนขึ้น
greg0ire

@ greg0ire ฉันแก้ไขคำตอบของฉันแล้ว ยังคงมีสองขั้นตอน สำเนาแรกและการเขียน การลบครั้งที่สอง
embedded.kyle

1
เป็นทางออกที่ดี! คุณสามารถเขียน'<,'>d | new | 0put "เพื่อความชัดเจน
atripes

1

จากคำตอบของ @ embedded.kyle และคำถาม &คำตอบนี้ฉันจึงลงเอยด้วยการใช้ตัวย่อตัวนี้เพื่อผนวกส่วนที่เลือกลงในไฟล์และลบออกจากไฟล์ปัจจุบัน หลังจากเลือกบางบรรทัดShift+Vแล้วให้กด:และรัน:

'<,'>w >> test | normal gvd 

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


0

เลือกข้อความในโหมดภาพจากนั้นกดyเพื่อ "ดึง" ลงในบัฟเฟอร์ (คัดลอก) หรือdเพื่อ "ลบ" ลงในบัฟเฟอร์ (ตัด)

จากนั้นคุณสามารถ:split <new file name>แยกหน้าต่างเสียงเรียกเข้าของคุณขึ้นและกดpเพื่อวางในข้อความที่ดึงออก เขียนไฟล์ตามปกติ

:qเพื่อปิดแยกอีกครั้งผ่านแยกที่คุณต้องการใกล้ชิด


1
ฉันมี 4 ขั้นตอน: เลือก, เขียน, เลือก, ลบ ด้วยวิธีการของคุณฉันมี 6 ขั้นตอน: เลือกลบแยกวางเขียนปิด ฉันขอสิ่งที่มีประสิทธิภาพมากขึ้น: P
greg0ire

ถ้าคุณผ่านการแยก:xแทนคุณสามารถรวมการเขียนและการปิดเป็นหนึ่งและทำห้าขั้นตอน : P
Xyon

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