วิธีการส่งออกผลลัพธ์ของคำสั่ง vim เพื่อเปลือก


11

สมมติว่าฉันอยู่ในเชลล์ ( bash) และต้องการดูผลลัพธ์ที่:scriptnamesจะให้ แต่ไม่ต้องการเริ่มเป็นกลุ่มหรือบางทีฉันต้องการที่จะสะท้อนให้เป็นไฟล์อื่น

ฉันก็เลยลงมือทำ

vim +scriptnames

ซึ่งแสดงสคริปต์ทั้งหมดให้ฉัน แต่ฉันจะสะท้อนที่ stdout ของเชลล์ได้อย่างไร

คำตอบ:


10

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

คุณลักษณะนี้มีอธิบายไว้ที่:h xterm-screens (ลิงก์)

ดังนั้นโดยทั่วไปคุณไม่ต้องการสิ่งนั้นและต้องการปิดใช้งานสิ่งนั้น คุณสามารถทำได้โดยการตั้งค่า:set t_ti= t_te=รหัสเทอร์มินัลที่ทำสิ่งนี้ให้ว่างเปล่า

เมื่อรวมทั้งหมดเข้าด้วยกันคุณจะต้องเริ่ม Vim ดังนี้:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

เรากำลังรีเซ็ต'more'ตัวเลือกเพื่อที่คุณจะไม่เห็น hit-enter-prompt


1
นี่คือน่ากลัวขอบคุณมาก! ฉันสงสัยจริงๆว่ามันเป็นไปได้
hgiesel

สิ่งนี้ทำให้เป็นไปได้หรือไม่ที่จะใช้ VimL เป็นภาษาสคริปต์ระบบเต็มรูปแบบโดยปล่อยให้มันเขียนไปยัง stdout (สำหรับผู้ที่มีความร้ายกาจเป็นพิเศษ)
shadowtalker

1
ปัญหาอย่างหนึ่งของเรื่องนี้คือฉันไม่สามารถเลื่อนหน้าจอเครื่องได้ (ถ้าข้อความยาวกว่าความสูงเทอร์มินัลของฉันฉันไม่เห็นด้านบน) ข้อความจะหายไปถ้าฉันเปิดเป็นกลุ่มแล้วออก
FDinoff

@FDinoff นั่นคือสิ่งที่วิทยุติดตามตัวlessมีไว้สำหรับ เพียงแค่ทำให้เป็นท่อน้อยลงเช่นvim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | lessนี้ เลย์เอาต์อาจจะเมาในตอนแรก (มันอยู่ใน terminal ของฉัน) แต่หลังจากกด <CL> ทุกอย่างก็ดีและสวยหรู
hgiesel

ฉันไม่เห็นเอาต์พุตเมื่อทำงานvim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'มีเพียง "แฟลชด่วน" คำสั่งออกด้วยรหัส 0 ไม่มีเอาต์พุต ฉันพลาดอะไรไปรึเปล่า?
TrungDQ

3

นอกจากนี้เรายังสามารถใช้:redirคำสั่งเพื่อเปลี่ยนเส้นทางผลลัพธ์ของคำสั่ง vim เป็นไฟล์

ตัวอย่างเช่น,

vim -c "redir! > vimout | scriptnames | redir END | q"

สิ่งนี้จะเปลี่ยนเส้นทางผลลัพธ์ของscriptnamesไปยังไฟล์ "vimout"


1

ฉันขอขอบคุณคำตอบจาก Christian Brabandt แต่ฉันคิดว่าคำตอบที่ดีกว่าคือการแยกคำสั่ง quit โดยใช้คำสั่ง -c อื่นเช่น:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

การใช้วิธีนี้หมายความว่าคุณสามารถรวมคำสั่งต่าง ๆ เข้าด้วยกันแล้วใช้ 'q!' สุดท้าย เพื่อออกจากกลุ่ม


0

สำหรับสถานการณ์ที่คุณต้องการให้กลุ่มโหลดเต็มเช่นเดียวกับที่คุณเริ่มด้วยตนเองการทำงานนี้:

vim -c "autocmd! CursorHold * <commands to run>"

ตัวอย่างเช่นฉันต้องการเปลี่ยนเส้นทางการส่งออก:mapไปยังไฟล์จากเชลล์ แต่ฉันต้องการจับภาพการแมปที่สายการบิน vimสร้างขึ้นหลังจากที่มันแสดงตารางของมัน (บรรทัดที่ด้านบนแสดงบัฟเฟอร์ทั้งหมดที่เปิด) เพราะดูเหมือนว่าจะทำ แบบอะซิงโครนัสเพียงแค่เรียกใช้การ-cเปลี่ยนเส้นทางไปยังไฟล์ไม่ได้ให้เวลาในการทำการแมป อาจเป็นวิธีที่ดีกว่า แต่วิธีนี้ใช้ได้ผลกับฉันโดยเฉพาะเมื่อฉันupdatetimeตั้งไว้ที่100(0.1 วินาที) ซึ่งมีผลต่อระยะเวลาจนกว่าCursorHoldเหตุการณ์จะเริ่มขึ้น โดยค่าเริ่มต้น vim ตั้งค่าเป็น 4 วินาที

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.