ฉันจะระงับข้อความ“ read from STDIN” จากภายใน Vim ได้อย่างไร?


18

เมื่อใช้ Vim เพื่ออ่านจาก stdin จะพิมพ์ข้อความที่ให้ข้อมูล:

$ echo foo | vim -
Vim: Reading from stdin...

$

นี่เป็นเพียงตัวอย่าง การใช้งานจริงไม่อนุญาตให้สร้างเชลล์ vim <(echo foo)ไม่ใช่ตัวเลือก

ฉันสามารถระงับการว่าการใช้เพียงตัวเลือกที่เป็นกลุ่มและ / หรือการตั้งค่า vimrc?


ในกรณีที่คุณจำเป็นต้องรู้ว่านี่คืออะไรฉันพยายามใช้Vim เพื่ออ่าน manpages (shameless plug) คน GNU ไม่อนุญาตให้สร้างเปลือกในMANPAGERและโดยใช้ftplugin/man.vimและสิ่งอื่น ๆ MANPAGER="vim -"ก็มีการจัดการที่ประสบความสำเร็จจะมีประสบการณ์ที่สะดวกสบายโดยใช้เพียง ความรำคาญที่เหลืออยู่ล่าสุดคือข้อความที่ไม่น่าดูที่พิมพ์หลังจาก manpage ทุกอันที่ฉันดู


ใช้งานexport MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'หรือexport MANPAGER="vim -"ไม่เห็นปัญหาอะไร man lsเปิด manpage ตามที่คาดไว้
Martin Tournoij

@Carpetsmoker และหลังจากที่คุณปิดมันได้หรือไม่
muru

ไม่ไม่เห็นอะไรเลย ...
Martin Tournoij

@Carpetsmoker คุณใช้ Vim เวอร์ชันใด? เกี่ยวกับecho foo | vim -Nu NONE -
muru

ในกลุ่ม: help lessให้ข้อมูลบางอย่างสำหรับใช้เป็นเพจเจอร์
mtklr

คำตอบ:


8

เริ่มต้นด้วยVIM 8.0.1308 (พ.ย. 2017) คุณสามารถใช้--not-a-termตัวเลือกเพื่อระงับข้อความนี้ ตัวอย่างเช่นquit:

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

หรือด้วยexit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello

เช่นนี้เทียบเท่ากับcatแต่ก็ยังคงมีประโยชน์สำหรับการใช้ Vimscript กับอินพุตเช่น+'runtime! syntax/2html.vim'การส่งออกข้อความที่เน้นเป็น HTML สไตล์ (สมมติว่าไฟล์ที่อนุมานหรือระบุไว้) มีตัวเลือกอื่นนอกเหนือจากที่กล่าวถึง สิ่งแรกที่อยู่ในใจคือการใช้mktempเพื่อเก็บเอาต์พุตของคำสั่งและใช้สิ่งนี้เป็นอินพุตของ Vim คุณสามารถเพิ่มคำสั่งการเปลี่ยนเส้นทางและเชลล์ของ Vim เพื่อ 'วาง' ผลลัพธ์ของคำสั่งลงในบัฟเฟอร์ได้ (ไฟล์สคริปต์ที่เป็นกลุ่มสามารถทำการเรียกใช้แบบยาวโดยอัตโนมัติแทนที่จะใช้นามแฝง)
John P

อาจเป็นไปได้ที่จะแก้ไข / วางเอาต์พุตจากซ็อกเก็ตซึ่งอาจมีประโยชน์จริงๆหากเป็นจริง ฉันยังคงบอกว่าตัวเลือกที่ดีที่สุดคือไฟล์ temp เว้นแต่ว่าจะมีคำเตือนที่แย่กว่าคำตอบที่ยอมรับ สำหรับเชลล์ที่กำหนดแม้ว่าอาจมีนามแฝง / บิวด์อิน / ไวยากรณ์ที่มีอยู่แล้วซึ่งทำให้บางส่วนของกระบวนการนี้ง่ายขึ้นเช่นที่อยู่ใน manpage สำหรับ zshmisc (การเปลี่ยนเส้นทาง ฯลฯ ) อีกอย่างหนึ่ง - บางทีคุณอาจหนีอินพุตและจัดหาได้ เป็นอาร์กิวเมนต์หลังจากอาร์กิวเมนต์เข้าสู่โหมดแทรกดังนั้นจึงแยกวิเคราะห์ราวกับพิมพ์?
John P

ฉันเห็น--not-a-termใน Vim 7.4.1689 ใน Ubuntu 16.04 (แต่ไม่ใช่ 7.4.8056 บน Mac) แต่ไม่ได้ระงับข้อความ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@DennisWilliamson :help version8.txtดูการเปลี่ยนแปลงโดย --not-a-termตัวเลือกที่ตัวเองถูกเพิ่มเข้ามาใน7.4.1419และพฤติกรรมของมันได้เปลี่ยนไปยังการปราบปรามการอ่านจาก stdin ...8.0.1308ข้อความใน (โดยวิธีการที่ไม่มีไฟล์ที่จะแก้ไขข้อความยังถูกยับยั้งจาก8.1.1258)
YNN

12

คำตอบสำหรับคำถามที่แน่นอนของคุณ:

ฉันสามารถระงับการใช้ตัวเลือก Vim และ / หรือการตั้งค่า vimrc เท่านั้นได้หรือไม่

คือไม่มีก็ไม่ได้เพราะของส่วนต่อไปนี้ของรหัส

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

ซึ่งหมายความว่าหากคุณให้-เหตุผลเพื่อเป็นกลุ่มแล้วมันจะแสดงข้อความนั้นโดยอัตโนมัติ

แม้ว่าเป็นวิธีแก้ไขหากคุณใช้การเปลี่ยนเส้นทางไฟล์แทนการ-โต้แย้งคุณจะได้รับข้อความ:

echo "foo" | vim < /dev/tty

และนี่คือตัวอย่างของMANPAGEการตั้งค่าที่เพิ่งใช้งาน™ (นำมาจาก intertubes):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'

2
เมื่อมีการ ALWAYS_USE_GUIกำหนดคุณรู้หรือไม่?
muru

2
ดู feature.h (มันทำเมื่อ ALWAYS_USE_GUI ไม่ได้ถูกกำหนดดังนั้นโดยทั่วไปสำหรับรุ่น unix ทั้งหมด)
Christian Brabandt

2
ฉันไม่สามารถecho "foo" | vim < /dev/ttyทำงานได้ตามปกติ [2]+ Stopped echo "foo" | vim < /dev/ttyทำมันให้
LéoLéopold Hertz 준영

2
เช่น @ LéoLéopoldHertz준영เคล็ดลับ tty ใช้งานไม่ได้สำหรับฉัน (gvim ให้เอกสารเปล่า vim สับสนจริงกับอินพุตคีย์บอร์ด แต่อย่างน้อยก็ไม่ได้รับ SIGSTOP) ผมเคยมีโชคมากขึ้นด้วยecho "foo" | gvim /dev/stdin(ถึงแม้จะไม่ใช่ GUI เป็นกลุ่มจะยังคงออกร้องเรียนเกี่ยวกับว่า: Vim: Warning: Input is not from a terminal)
Adam Katz

2
ดีลืมข้อความก่อนหน้าของฉัน เคล็ดลับในการตอบเป็น<(col -b)ส่วนหนึ่ง นั่นคือรุ่นที่ซับซ้อนบางส่วนcatสำหรับการพิมพ์หน้าคนและในที่สุดคุณก็สามารถกำจัดข้อความของกลุ่มด้วยecho test | vim < /dev/tty <(cat>
Alexander Solovets

1

ใน Vim ปัญหานี้ได้รับการแก้ไขแล้วใน234d162กระทำ (> = v8.0.1387)

การแก้ไข: อย่าแสดงข้อความที่มี--not-a-termการใช้งาน

ดังนั้นข้อความจะปรากฏขึ้นเฉพาะเมื่อผู้ใช้ไม่ได้เปลี่ยนเส้นทาง stdin


ปัญหาที่คล้ายกันได้รับการแก้ไขในNeovimรุ่นล่าสุด( > = v0.2.2-dev ) ซึ่งคุณสามารถใช้แทน Vim ได้

เมื่อ NVim v0.2.2 ถูกปล่อยออกมาคุณควรจะสามารถเรียกใช้:

$ echo foo | nvim -

โดยไม่ต้องมีข้อความ


0
  1. ด้วยกลุ่มเวอร์ชัน8.0.1387และใหม่กว่าคุณสามารถใช้--not-a-termตัวเลือก

  2. สำหรับรุ่นเก่าใช้เคล็ดลับต่อไปนี้: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

อาร์กิวเมนต์แรกใช้กล/dev/ttyอุบายเป็นกลุ่มเพื่อคิดว่าอินพุตมาจากแป้นพิมพ์ ฉันเดาว่าเป็นเพราะisatty (3)ส่งคืน True สำหรับไฟล์นั้น และอาร์กิวเมนต์ที่สองนั้นจะส่งผ่านทุกอย่างจากอินพุตมาตรฐานไปจนถึงอินพุตมาตรฐานของ Vim ท้ายสุดbash -cจำเป็นต้องใช้คำนำหน้าเพื่อให้โครงสร้างพิเศษ<(...)ทำงานหากเชลล์ไม่รองรับ ในbashโซลูชันดั้งเดิมนั้นสามารถทำให้ง่ายขึ้น $ echo foo | vim < /dev/tty <(cat)


ทั้งสองสิ่งนี้อยู่ในคำตอบที่มีอยู่หรือคำถามนั้นเอง มีอะไรใหม่ที่นี่?
muru

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