ไพพ์เอาต์พุตของคำสั่งเชลล์ (!) ไปยังบัฟเฟอร์ใหม่ใน Vim


35

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

:!echo % | :newtab

คำตอบ:


27

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

:tabnew | r !echo <c-r>=bufname("#")<cr>

โปรดทราบว่าสัญลักษณ์ไพพ์ในกรณีนี้คือตัวคั่นระหว่างคำสั่ง Vim ex ไม่ใช่ไพพ์ของเชลล์ ดูสิ่งนี้ด้วย

:help :tabnew
:help :r!
:help :bar

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

@Richard Marquez: ฉันได้อัพเดตคำตอบนี้แล้ว แท็บใหม่เปิดขึ้นพร้อมชื่อไฟล์ "เก่า" ดังนั้นคุณสามารถโทร:! echo%
akira

แต่ไม่ใช่:r!echoโดยไม่มีการแก้ไขบัฟเฟอร์
Luc Hermitte

2
@garyjohn, akira: ขอบคุณสำหรับความช่วยเหลือ ส่วน "<cr> = ... " ทำให้เกิดข้อผิดพลาด Spew แต่ฉันก็สามารถทำงานกับ ": tabnew | r! echo #"
Richie Marquez

1
อาจมีประโยชน์ที่จะทราบว่าหากคุณต้องการแมปนี้กับคีย์ใน. vimrc ของคุณคุณจะต้องแทนที่ | ตัวละครที่มี <bar>
Richie Marquez

16

นี่คือสิ่งที่ฉันทำ มันพูดถึงในความคิดเห็นในคำตอบข้างต้น

: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สำหรับแท็บใหม่


คุณสามารถตอบคำถามนี้ได้ที่นี่เช่นกัน? มันเกี่ยวกับการพยายามใช้บัฟเฟอร์ปัจจุบันด้วย%สำหรับบัฟเฟอร์ถัดไป แต่ E499
hhh


2

หากคุณต้องการเก็บผลลัพธ์ไว้ในบัฟเฟอร์ใหม่ แต่ต้องการข้อมูลจากบัฟเฟอร์ปัจจุบันเก่าคุณสามารถใช้system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

หรือเก็บชื่อบัฟเฟอร์ปัจจุบันไว้ใช้ภายหลัง :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

เห็นคำตอบอื่น ๆ คุณสามารถทำได้โดยไม่ต้องเก็บชื่อไว้ในตัวแปร แต่คำตอบที่ดีอยู่ดี
akira

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