คัดลอกและวางเนื้อหาจากไฟล์หนึ่งไปยังไฟล์อื่นใน vi


256

ฉันกำลังทำงานกับสองไฟล์และฉันต้องการคัดลอกสองสามบรรทัดจากไฟล์หนึ่งและวางลงในไฟล์อื่น ฉันรู้วิธีคัดลอก (yy) และวาง (p) ในไฟล์เดียวกัน แต่นั่นไม่ได้ผลกับไฟล์ที่แตกต่างกัน สิ่งนี้ทำได้อย่างไร

นอกจากนี้ยังมีวิธีการตัดแปะด้วยหรือไม่? ฉันลองใช้ Google แล้ว แต่ทรัพยากรส่วนใหญ่พูดคุยเกี่ยวกับการคัดลอกวางเท่านั้น


คุณแน่ใจหรือว่ามันใช้ไม่ได้ ฉันใช้มันค่อนข้างบ่อยในการคัดลอกบรรทัดระหว่างไฟล์
sjngm

เมื่อฉันทำเช่นนั้นฉันจะได้รับเครื่องหมายคำพูดเท่านั้น?
ชา

4
คำสั่ง dd ทำงานเหมือนถูกตัด
Martin Stålberg

คำตอบ:


218

เนื่องจากคุณรู้วิธีตัด / ดึงข้อความต่อไปนี้เป็นแนวคิดบางประการสำหรับการวางกลับเข้าไปในไฟล์อื่น:

  • แก้ไขไฟล์แรกโดย yanking ข้อความที่คุณต้องการ จากนั้นเปิดไฟล์ที่สองจากภายใน vi ( :e /path/to/other/file) แล้ววาง
  • เปิดไฟล์ทั้งสองเข้าด้วยกันในหน้าต่างแยกและนำทางโดยใช้Ctrl+ w, Up/ Downโดย:

    • vi -o /path/to/file1 /path/to/file2
    • จากภายในไฟล์แรก, Ctrl+ w,s

ฉันมีหน้าต่างโป๊วเปิดอยู่ฉันกำลังทำ "v สำหรับโหมดภาพก่อนแล้วจึงเลือกทุกบรรทัดและทำ" y "สำหรับ yanking ไม่ใช่ฉันกำลังทำแท็บ alt + เพื่อไปยังไฟล์อื่นและเมื่อฉันทำ เครื่องหมาย "p" สำหรับใส่ก็จะพิมพ์เฉพาะเครื่องหมายคำพูด
ชา

10
หากคุณทำงานกับ windows 2 putty คุณจะต้องใช้วิธี putty / windows ในการคัดลอก / วาง ง่ายมาก ทำเครื่องหมายสิ่งที่คุณต้องการคัดลอกด้วยเมาส์ (คุณไม่ต้องทำอะไรเลยตอนนี้ข้อความที่ทำเครื่องหมายจะถูกคัดลอกไปยังคลิปบอร์ดแล้ว) สลับไปที่หน้าต่างโป๊วอื่นของคุณ เข้าสู่โหมดแทรกในกลุ่ม (กด i) กดปุ่มเมาส์ขวา - เมาส์ขวาในหน้าต่างโป๊วจะวางสิ่งที่อยู่ในคลิปบอร์ด
nos

3
สิ่งที่คุณกำลังทำไม่ได้ผล: Yanking in vi จะไม่วางข้อความลงในคลิปบอร์ด Windows ของคุณและบัฟเฟอร์ yank จะไม่ถูกแชร์ระหว่างอินสแตนซ์ vim ที่เปิดอยู่
Adam Batkin

1
ฉันไม่เข้าใจสิ่งที่จุดสุดท้ายที่ควรจะทำ: * จากภายในแฟ้มแรกCtrl+ ,w s
svassr

1
สำหรับฉันมันแยกหน้าต่าง แต่เปิดไฟล์เดียวกันแน่นอน คุณจะเลือกไฟล์ที่จะเปิดได้อย่างไร? ฉันเห็นคำสั่ง:sp myfileที่แยกในแนวนอนและเปิดไฟล์ที่ระบุ แต่ฉันจะทำอย่างไรถ้าฉันต้องการแยกหน้าต่างในแนวตั้ง
svassr

50

หากคุณใช้ Vim บน Windows คุณสามารถเข้าถึงคลิปบอร์ด (MS copy / paste) โดยใช้:

"*dd - ตัดเส้น (หรือ 3dd เพื่อตัดสามบรรทัด)

"*yy - คัดลอกบรรทัด (หรือ 3yy เพื่อคัดลอกสามบรรทัด)

"*p - วางบรรทัดต่อท้ายเคอร์เซอร์

"*P - วางบรรทัดในบรรทัดก่อนเคอร์เซอร์

ช่วยให้คุณวางระหว่างหน้าต่าง Vim ที่แยกจากกันหรือระหว่างแอปพลิเคชัน Vim และพีซี ( Notepad , Microsoft Word , ฯลฯ )


17
ใช้+เป็นการลงทะเบียนคลิปบอร์ดระบบข้ามแพลตฟอร์ม (Windows และ Linux) *ซึ่งเป็น Windows เท่านั้น (ใช้+งานได้เหมือนกันใน Windows เป็น*)
Stephen Swensen

42

ใช้รูปแบบที่dต้องการddตัด

หากต้องการเขียนช่วงของบรรทัดไปยังไฟล์อื่นคุณสามารถใช้:

:<n>,<m> w filename

ที่ไหน<n>และ<m>เป็นตัวเลข (หรือสัญลักษณ์) ที่กำหนดช่วงของเส้น

สำหรับการใช้คลิปบอร์ดเดสก์ทอปดูที่+gคำสั่ง


การทำเช่นนี้กับเครื่องหมายสร้างสองเครื่องหมาย (A และ B เป็นต้น) รอบข้อความที่คุณต้องการที่จะเขียนไปยังแฟ้ม: ย้ายไปบรรทัดแรก, ย้ายไปที่บรรทัดสุดท้ายma mbจากนั้นเติม a 'ถึงตัวอักษรของเครื่องหมายเมื่อคุณใช้คำสั่งด้านบน::'a,'b w filename
EchoLynx

ทางออกที่ดีสำหรับช่วงกว้าง
Yasin Okumuş

29

คุณสามารถเปิดไฟล์อื่น ๆ :r file_to_be_copied_fromและพิมพ์ หรือคุณสามารถบัฟเฟอร์ หรือไปที่ไฟล์แรกไปในบรรทัดที่คุณต้องการคัดลอกพิมพ์ไปที่ไฟล์ที่คุณต้องการที่จะวางและประเภท"qY"qP

"buffer_name คัดลอกไปที่บัฟเฟอร์ YงัดแงะและPใส่ หวังว่าจะช่วย!


ขอบคุณ! สิ่งนี้ช่วยฉันได้มาก
อัตสึชิยามาโมโตะ

28

นี่คือวิธีหนึ่งในการทำ

  • เริ่มเป็นกลุ่มและเปิดไฟล์ 1 ซึ่งเป็นไฟล์ที่คุณกำลังทำงานอยู่
  • :e file2 ซึ่งจะแสดงไฟล์ file2 ซึ่งเป็นไฟล์ที่คุณต้องการคัดลอกบรรทัด
  • ค้นหาบรรทัดที่คุณต้องการคัดลอก ถ้ามันเป็นสามบรรทัดคุณจะตี3yy
  • :b1 สิ่งนี้จะเปลี่ยนเป็นบัฟเฟอร์ 1 โดยที่ file1 คือ
  • คิดออกว่าคุณต้องการแทรกบรรทัดที่คุณดึงแล้วกด p

คุณสามารถดูไฟล์ทั้งสองได้เช่นกัน แยกหน้าจอด้วยเช่น+Ctrlw s

สำหรับการตัดการdตัดและการวางสิ่งที่ตัดในบัฟเฟอร์งัด ddจะ "ตัด" บรรทัด


2
ปิดหัวข้อ: ฉันจะนำสิ่งต่าง ๆ ที่คล้ายกับปุ่มบนคีย์บอร์ดได้อย่างไร
eckes


สิ่งที่เกี่ยวกับไฟล์สองไฟล์นั้นอยู่บนเซิร์ฟเวอร์ ssh ที่ต่างกันสองตัวซึ่งไคลเอนต์เดียวกันใช้ในสองเทอร์มินัลที่แตกต่างกันใน Linux / MacOS ฉันหมายถึงไม่มีการใช้ผงสำหรับอุดรูและไฟล์สองไฟล์ไม่สามารถเปิดได้ในเซสชัน vi เดียวกันในเทอร์มินัลเดียว
Qiang Xu

1
หากไคลเอนต์สามารถ ssh ในเซิร์ฟเวอร์ที่สองมันยังสามารถใช้ scp หรือ sftp เพื่อเซิร์ฟเวอร์ทั้งสองนั้น ดังนั้นวิธีที่เร็วที่สุดคือการคัดลอกไฟล์จากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งเพื่อให้พวกเขาอยู่บนเซิร์ฟเวอร์เดียวกันแก้ไขไฟล์เหล่านั้นตามที่อธิบายไว้และคัดลอกไฟล์กลับไปยังเซิร์ฟเวอร์อื่นเมื่อเสร็จสิ้นหากคุณต้องการ
nos

16

ทั้งหมดนี้เป็นคำแนะนำที่ดี แต่ถ้าคุณรู้ตำแหน่งของข้อความในไฟล์อื่นให้ใช้อย่างง่ายดาย :r! sed -n '1,10 p' < input_file.txtสิ่งนี้จะแทรก 10 บรรทัดในไฟล์ที่เปิดอยู่แล้วที่ตำแหน่งปัจจุบันของเคอร์เซอร์


ฉันได้รับรหัสทางออก 1 เมื่อใช้งานนี้โชคไม่ดีที่ os x ไม่แน่ใจว่าทำไม
jayunit100

1
ขอบคุณสำหรับคำแนะนำนี้! ฉันใช้หัวแทน sed เพราะฉันต้องการ 2 บรรทัดแรก::r ! head -n2 file.py
Federico Ponzi

7

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

ma- ตั้งaเครื่องหมาย

mb- ตั้งbเครื่องหมาย

จากนั้นหากต้องการคัดลอกไปยังไฟล์อื่นเพียงใช้wคำสั่ง:

:'a,'bw /name/of/output/file.txt

7

อัพเดต 2017-05:

ฉันเพิ่งพบว่าถ้าคุณเพิ่มบรรทัดต่อไปนี้ในไฟล์ vimrc ของคุณ

ตั้งคลิปบอร์ด = ไม่มีชื่อ

เป็นกลุ่มแล้วใช้คลิปบอร์ดของระบบ


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

วิธีงัดใช้งานได้เฉพาะกับวิธีการเปิดไฟล์หลายไฟล์ในหน้าต่างเดียวกันตามการทดสอบของฉัน

หากคุณต้องการทำเช่นนั้นคุณควรใช้ระบบตัดต่อคัดลอกเช่นCtrl+ x, Ctrl+ c(ใน Windows)


5

remaps เหล่านี้ทำงานเหมือนมีเสน่ห์สำหรับฉัน:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

ดังนั้นเมื่อฉันอยู่ในโหมดมองเห็นฉันเลือกเส้นที่ฉันต้องการและกดCtrl+ cแล้วCtrl+ vเพื่อแทรกข้อความในไฟล์ตัวรับ คุณสามารถใช้ "* y ได้เช่นกัน แต่ฉันคิดว่านี่ยากที่จะจำได้ในบางครั้ง

นอกจากนี้ยังมีประโยชน์ในการคัดลอกข้อความจาก Vim ไปยังคลิปบอร์ด

ที่มา: คัดลอกและวางระหว่างเซสชันโดยใช้ไฟล์ชั่วคราว


4

การคัดลอกข้อความระหว่างสองบัฟเฟอร์ (== ไฟล์) ที่เปิดในอินสแตนซ์เดียวกันของ Vim ไม่มีปัญหา:

เพียงแค่งัดในบัฟเฟอร์ด้วยy(สมมติว่าคุณทำเครื่องหมายพื้นที่ในการคัดลอกในโหมดภาพก่อน) แล้ววางลงในบัฟเฟอร์อื่น ๆ pที่มี มันยังใช้งานได้กับแท็บต่าง ๆ ตราบเท่าที่พวกมันอยู่ในอินสแตนซ์เดียวกันของ Vim

วิธีเปิดไฟล์สองไฟล์ในอินสแตนซ์เดียวกันของ Vim ขึ้นอยู่กับระบบของคุณ:

  • บน Win32 มีตัวเลือกในเมนูบริบทว่าแก้ไขด้วยเสียงเรียกเข้าเดียวหากคุณเลือกไฟล์สองไฟล์ขึ้นไป
  • เมื่อคุณอยู่บนคอนโซลคุณสามารถทำได้ด้วย vim file1 file2
  • หากคุณใช้ Vim เป็นเครื่องมือสำหรับเครื่องมืออื่นให้แน่ใจว่าได้ระบุ--remote-silentตัวเลือกเพื่อให้แน่ใจว่าไฟล์ทั้งหมดจะถูกเปิดในอินสแตนซ์เดียวกัน

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


: tabedit filenameสามารถใช้เปิดไฟล์เป้าหมายแล้วเพียงแค่pเพื่อวางบรรทัดของคุณ ฉันคิดว่ามันเร็วกว่า
jabalv

4

เป้าหมาย : บันทึกไฟล์หนึ่งไฟล์เป็นไฟล์อื่น

วิธีแก้ปัญหา :

  1. เลือกข้อความที่คุณต้องการบันทึก:
    • วางเคอร์เซอร์ในตำแหน่งที่คุณต้องการเริ่มการเลือก
    • กดvเพื่อเลือกอักขระหรือตัวพิมพ์ใหญ่Vเพื่อเลือกทั้งบรรทัด
    • เลื่อนเคอร์เซอร์ไปที่ส่วนท้ายของสิ่งที่คุณต้องการเลือก
  2. บันทึกข้อความที่เลือกลงในไฟล์ใหม่ พิมพ์:wSpaceและชื่อของไฟล์ใหม่ ที่จริงแล้วคุณจะเห็น

    :'<,'>w new.txt

    จากนั้นกด Enter


จะวางกลับจากไฟล์ temp ได้อย่างไร
Vineet

3

สถานการณ์ของฉันคือฉันต้องคัดลอก n จำนวนบรรทัดกลางไม่ทราบ n จากไฟล์ 1 ถึงไฟล์ 2

:'a,'bw /name/of/output/file.txt

2
  1. ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชัน Vim ที่คอมไพล์ด้วยการสนับสนุนคลิปบอร์ด
    • :echo has('clipboard') ควรกลับมา 1
    • ถ้ามันกลับมา0(เช่น Mac OS X อย่างน้อยv10.11 (El Capitan), v10.9 (Mavericks) และv10.8 (Mountain Lion) - มาพร้อมกับรุ่น Vim ที่ขาดการสนับสนุนคลิปบอร์ด) คุณต้องติดตั้ง เวอร์ชันเป็นกลุ่มพร้อมการสนับสนุนคลิปบอร์ดพูดผ่านbrew install vim(อย่าลืมเปิดใช้งานเทอร์มินัลของคุณหลังการติดตั้ง)
  2. เข้าสู่โหมดภาพ ( V- หลาย, v- ธรรมดาหรือCtrlv - บล็อกภาพ)
  3. เลือกบรรทัดที่คุณต้องการคัดลอก
  4. "*y - เพื่อคัดลอกรายการที่เลือก
  5. "*p - เพื่อวางคัดลอก

PS:

  • คุณสามารถแทนที่ขั้นตอนที่ 2-5 ด้วยคำแนะนำจากคำตอบของJayGหากคุณต้องการคัดลอกและวางบรรทัดเดียว
  • เพื่อความสะดวกในการเลือกสายคุณสามารถเพิ่มset mouse+=aที่คุณ.vimrc- มันจะช่วยให้คุณสามารถเลือกเส้นในกลุ่มใช้เมาส์ในขณะที่ไม่เลือกองค์ประกอบภายนอก (เช่นหมายเลขบรรทัด ฯลฯ ) ข้อสังเกต: มันจะปิดกั้นความสามารถในการคัดลอกข้อความเมาส์เลือก ไปที่คลิปบอร์ดระบบจากกลุ่ม

1

ตัวอย่าง: fileA และ fileB - เริ่มใน fileA ที่บรรทัด 25 คัดลอก 50 บรรทัดและวางไปที่ fileB

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

ตัวเลือกด้านล่างใช้งานได้เป็นส่วนใหญ่และใช้เพื่อวางในภายหลัง

 "xnyy
x - buffer name
n - number of line to Yank - optional

'x'เส้นกระชากจะถูกเก็บไว้ในบัฟเฟอร์ มันสามารถใช้งานได้ทุกที่ในการแก้ไข

ในการวางบรรทัดในไฟล์อื่น

:e filename&location

ตัวอย่าง: พิมพ์คำสั่งด้านล่างในการแก้ไขปัจจุบัน

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

ดำเนินการให้เสร็จสมบูรณ์

เปิดไฟล์ 1:

vi Test1.sh

a10yy

-Yanked 10 lines

- เปิดไฟล์ที่สองจากการแก้ไขปัจจุบัน

*:e /u/test/Test2.sh*

ย้ายเคอร์เซอร์ไปที่บรรทัดที่คุณต้องวาง

*"ap*

- ไลน์จากบัฟเฟอร์'*a*'จะถูกคัดลอกหลังจากเคอร์เซอร์ pos ปัจจุบัน


1

หากคุณต้องการคัดลอกส่วนหนึ่งของไฟล์และวางเนื้อหานั้นไว้ตรงกลางของไฟล์อื่นคุณสามารถทำได้ด้วยวิธีนี้

:linenumber,linenumber write newfile

ตัวอย่าง:

:2,34 write temp1

หรือ

:'mark, 'mark write newfile

ตัวอย่าง:

:'a,'b write temp1

ตอนนี้เส้นจะถูกคัดลอกไปยังไฟล์อื่น หากคุณต้องการลบบรรทัดเหล่านั้นหลังจากการคัดลอกคุณสามารถทำได้

:linenumber1,linenumber2 d

หรือ

:'mark1,'mark2 d

ตอนนี้ไปที่ไฟล์อื่น จากนั้นให้วางเคอร์เซอร์ไว้บนบรรทัดที่คุณต้องการวาง

ชนิด

:r!cat temp1

ตอนนี้เนื้อหาของไฟล์ temp จะถูกวางที่นี่ คุณสามารถลบไฟล์ temp ออกจากบรรทัดคำสั่งได้เองหลังจากวางเนื้อหาแล้ว

:!rm temp1

สิ่งนี้จะช่วยได้หากคุณต้องการคัดลอกและวางหลายครั้ง


0

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

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

เข้าสู่โหมดคำสั่งและเรียกใช้

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

เช่นเพื่อแยกบรรทัด20-30จากfilenameลงในไฟล์ที่เปิดในปัจจุบัน

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