ท่อบัฟเฟอร์ไปยังคำสั่งภายนอกใน Vim


97

ฉันเป็นมือใหม่แบบ Vim ฉันต้องการส่งเนื้อหาของบัฟเฟอร์ปัจจุบันไปยัง stdin ของคำสั่งภายนอก (สมมติว่าเมล) จุดประสงค์สุดท้ายของฉันคือการตั้งค่าทางลัดเพื่อส่งอีเมลจากบัฟเฟอร์ Vim ปัจจุบันอย่างรวดเร็ว ฉันเดาว่านี่น่าจะเป็นเรื่องเล็กน้อย แต่ฉันไม่สามารถหาวิธีส่ง Vim buffer ไปยังคำสั่งภายนอกได้ ขอบคุณล่วงหน้า.


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

คำตอบ:


137

คุณสามารถใช้:w !cmdเพื่อเขียนบัฟเฟอร์ปัจจุบันไปยัง stdin ของคำสั่งภายนอก จาก:help :w_c:

: [range] w [rite] [++ opt]! {cmd}

ดำเนินการ{cmd}โดยใช้[range]บรรทัดเป็นอินพุตมาตรฐาน (สังเกตช่องว่างด้านหน้า'!') {cmd}จะถูกดำเนินการเช่นเดียวกับการ":!{cmd}"ใด ๆ ที่จะถูกแทนที่ด้วยคำสั่งก่อนหน้า'!'|:!|

คำสั่งที่เกี่ยวข้องคือ:%!cmdสิ่งที่ทำในสิ่งเดียวกันแล้วแทนที่บัฟเฟอร์ปัจจุบันด้วยเอาต์พุตของคำสั่ง ดังนั้น:%!sortจะเรียกใช้คำสั่งการเรียงลำดับภายนอกเพื่อจัดเรียงบัฟเฟอร์ปัจจุบันเข้าที่


6
สิ่งนี้มีประโยชน์ในการจัดรูปแบบ json เช่น: :'<,'>!python -mjson.toolหรือ:%!python -mjson.tool
TrinitronX

1
สำหรับการจัดรูปแบบไปให้ใช้:%!gofmtโดยไม่ต้องใช้ครั้งสุดท้าย%เนื่องจากจะทำให้ต้องใช้เวอร์ชันที่บันทึกไว้ (ซึ่งอาจแตกต่างจากบัฟเฟอร์ปัจจุบัน)
thomasrutter

มีวิธีใด ๆ สำหรับการนี้เพื่อแทนที่บัฟเฟอร์ในปัจจุบันที่มีการส่งออกคำสั่งเพียงกับความสำเร็จ? หากคำสั่งส่งคืนค่าไม่ใช่ศูนย์อย่าแทนที่บัฟเฟอร์?
thomasrutter

@thomasrutter หากบัฟเฟอร์ถูกแทนที่ด้วยข้อความแสดงข้อผิดพลาดแทนที่จะเป็นผลลัพธ์ที่ต้องการคุณสามารถกดuเพื่อเลิกทำ
törzsmókus

1

นี่คือตัวอย่างวิธีการส่งบัฟเฟอร์ปัจจุบันไปยัง stdin ภายนอกจากบรรทัดคำสั่ง:

vim -es +"w >> /dev/stdout" -cq! /etc/hosts

มีประโยชน์สำหรับวัตถุประสงค์ในการเขียนสคริปต์

สำหรับเคล็ดลับบรรทัดคำสั่งเพิ่มเติมตรวจสอบ:

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