ฉันจะไพพ์เอาต์พุตของคำสั่งเชลล์ลงในบัฟเฟอร์ใหม่ใน Vim ได้อย่างไร? เห็นได้ชัดว่าต่อไปนี้ใช้งานไม่ได้ แต่คุณสามารถเห็นสิ่งที่ฉันได้รับ:
:!echo % | :newtab
ฉันจะไพพ์เอาต์พุตของคำสั่งเชลล์ลงในบัฟเฟอร์ใหม่ใน Vim ได้อย่างไร? เห็นได้ชัดว่าต่อไปนี้ใช้งานไม่ได้ แต่คุณสามารถเห็นสิ่งที่ฉันได้รับ:
:!echo % | :newtab
คำตอบ:
คุณไม่สามารถไพพ์เอาต์พุตของคำสั่งเชลล์ลงในคำสั่งที่สร้างบัฟเฟอร์ใหม่ แต่คุณสามารถสร้างบัฟเฟอร์ใหม่และอ่านเอาต์พุตของคำสั่งเชลล์ลงในบัฟเฟอร์นั้นด้วยหนึ่งรายการบนบรรทัดคำสั่งของ Vim ตัวอย่างรุ่นที่ใช้งานได้ของคุณจะเป็น
:tabnew | r !echo <c-r>=bufname("#")<cr>
โปรดทราบว่าสัญลักษณ์ไพพ์ในกรณีนี้คือตัวคั่นระหว่างคำสั่ง Vim ex ไม่ใช่ไพพ์ของเชลล์ ดูสิ่งนี้ด้วย
:help :tabnew
:help :r!
:help :bar
:r!echo
โดยไม่มีการแก้ไขบัฟเฟอร์
นี่คือสิ่งที่ฉันทำ มันพูดถึงในความคิดเห็นในคำตอบข้างต้น
:new | r ! <cmd>
:new | r ! <cmd> # (# is replaced with filename)
ตัวอย่างที่ 1 : ค้นหาไฟล์ข้อความทั้งหมดใน/tmp
:new | r ! find /tmp -name '*.txt'
ตัวอย่างที่ 2 : คุณกำลังแก้ไขไฟล์ foo.txt และคุณต้องการเรียกใช้ls -la foo.txt
และรับเอาต์พุตในบัฟเฟอร์:
:new | r ! ls -la #
#
จะถูกแทนที่ด้วยชื่อไฟล์ของเดิม buffer คุณกำลังแก้ไข สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับคำสั่งการควบคุมแหล่งเฉพาะกิจ
:new | r ! hg annotate -un #
:new
สร้างการแบ่งแนวนอนใช้:vnew
ถ้าคุณต้องการการแบ่งแนวตั้งแทนและ:tabnew
สำหรับแท็บใหม่
:tabnew | enew | r ! <your shell cmd>
ทำงานได้สำหรับฉัน
หากคุณต้องการเก็บผลลัพธ์ไว้ในบัฟเฟอร์ใหม่ แต่ต้องการข้อมูลจากบัฟเฟอร์ปัจจุบันเก่าคุณสามารถใช้system()
:
:let res = system('echo '.expand('%'))
:tabnew
:put=res
หรือเก็บชื่อบัฟเฟอร์ปัจจุบันไว้ใช้ภายหลัง :
:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>