मैं विम के भीतर "STDIN से पढ़ने" संदेश को कैसे दबा सकता हूं?


18

स्टिम से पढ़ने के लिए विम का उपयोग करते समय, यह एक सूचनात्मक संदेश प्रिंट करता है:

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

$

यह सिर्फ एक उदाहरण है। वास्तविक उपयोग शेल निर्माणों की अनुमति नहीं देता है। vim <(echo foo)एक विकल्प नहीं है।

क्या मैं केवल Vim विकल्पों और / या vimrc सेटिंग्स का उपयोग करके इसे दबा सकता हूं ?


मामले में आपको यह जानने की जरूरत है कि यह किस लिए है, मैं विम्प को मैनपेज (बेशर्म प्लग) पढ़ने के लिए उपयोग करने की कोशिश कर रहा हूं । GNU मैन शेल कंस्ट्रक्शन की अनुमति नहीं देता है MANPAGER, और उपयोग करके ftplugin/man.vimऔर अन्य चीजों से, मैं सफलतापूर्वक सिर्फ एक आरामदायक अनुभव का उपयोग करने में कामयाब रहा हूं MANPAGER="vim -"। अंतिम शेष झुंझलाहट हर उस मैनपेज के बाद छपा हुआ भद्दा संदेश है जिसे मैंने देखा था।


उपयोग करने export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'या export MANPAGER="vim -"मुझे कोई समस्या नहीं दिख रही है? man lsअपेक्षित रूप से मैनपेज खोलता है।
मार्टिन टूरनोइज

@Carpetsmoker और आप इसे बंद करने के बाद?
मुरु

नहीं, कुछ नहीं देखा ...
मार्टिन Tournoij

@Carpetsmoker आप किस संस्करण का उपयोग कर रहे हैं? क्या के बारे मेंecho foo | vim -Nu NONE -
muru

विम में, : help lessपेजर के रूप में उपयोग करने के लिए कुछ जानकारी देता है।
mtklr

जवाबों:


8

Vim 8.0.1308 (Nov 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, लेकिन यह अभी भी इनपुट के लिए विम्सस्क्रिप्ट लागू करने के लिए उपयोगी हो सकता है, उदाहरण के +'runtime! syntax/2html.vim'लिए हाइलाइट किए गए टेक्स्ट को स्टाइल किए गए HTML के रूप में निर्यात करने के लिए (मान लिया गया या निर्दिष्ट फ़िलाटाइप मानकर)। अब तक उल्लिखित के अलावा कुछ विकल्प हैं; पहली बार जो मन में आता है mktempवह कमांड के आउटपुट को स्टोर करने के लिए उपयोग कर रहा है और इसे विम के इनपुट के रूप में उपयोग कर रहा है। आप Vim के पुनर्निर्देशन और शेल कमांड को बफर में कमांड परिणाम को 'पेस्ट' करने के लिए जोड़ सकते हैं, लेकिन यह कुछ और काम करता है। (विम स्क्रिप्ट फ़ाइलें उपनामों का उपयोग करने के बजाय लंबे समय तक चालान को स्वचालित कर सकती हैं।)
जॉन पी

एक सॉकेट से आउटपुट को संपादित / पेस्ट करना संभव हो सकता है, जो वास्तव में उपयोगी हो सकता है अगर यह सच था। मैं अभी भी कहता हूं कि सबसे अच्छा विकल्प एक अस्थायी फाइल है, जब तक कि स्वीकृत उत्तर के लिए इससे भी ज्यादा खराब न हों। किसी दिए गए शेल के लिए, एक मौजूदा उपनाम (बिलियन / सिंटैक्स) हो सकता है जो इस प्रक्रिया के कुछ हिस्से को सरल करता है, जैसे कि zshmisc (पुनर्निर्देशन, आदि) के लिए मैनपेज में सूचीबद्ध हैं। एक और - शायद आप इनपुट से बच सकते हैं और इसकी आपूर्ति कर सकते हैं। एक तर्क डालने मोड में प्रवेश करने के बाद एक तर्क के रूप में, इसलिए यह टाइप किया जाता है?
जॉन पी

मैं --not-a-termUbuntu 16.04 में विम 7.4.1689 (लेकिन मैक पर 7.4.8056 नहीं) में देखता हूं, लेकिन यह संदेश को दबाता नहीं है।
अगली सूचना तक रोक दिया गया।

@DennisWilliamson द्वारा चैंज देखें :help version8.txt--not-a-termविकल्प में ही इसे जोड़ा गया था 7.4.1419और इसके व्यवहार को स्टडिन से रीडिंग को दबाने के लिए बदल दिया गया ... संदेश में 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कि बस काम करता है ™ (इंटरब्यूटल्स से लिया गया):

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 परिभाषित, तुम जानते हो?
मूरू

2
फ़ीचर देखें ।h (यह तब किया जाता है जब ALWAYS_USE_GUI परिभाषित नहीं होता है, इसलिए मूल रूप से सभी यूनिक्स संस्करणों के लिए)।
क्रिश्चियन ब्रेबांट

2
मुझे वर्कअराउंड वर्क नहीं मिल सकता है echo "foo" | vim < /dev/tty। करने से मिलता है [2]+ Stopped echo "foo" | vim < /dev/tty
लेओ लेपोल्ड हर्ट्ज़ o

2
@ LéoLéopoldHertz é की तरह, ट्टी ट्रिक ने मेरे लिए काम नहीं किया (gvim एक खाली दस्तावेज़ देता है, vim कीबोर्ड इनपुट के साथ वास्तविक भ्रमित हो जाता है, लेकिन कम से कम यह एक SIGSTOP प्राप्त नहीं करता है)। मेरे पास और अधिक किस्मत है echo "foo" | gvim /dev/stdin(हालांकि गैर-जीयूआई विम अभी भी उस बारे में शिकायत जारी करेगा:) Vim: Warning: Input is not from a terminal
एडम काटज़

2
खैर, मेरे पिछले संदेश को भूल जाओ। उत्तर में चाल <(col -b)भाग में है। यह अनिवार्य रूप से catमैन पेजों को प्रिंट करने के लिए कुछ परिष्कृत संस्करण है , और आप आखिरकार विम के संदेश से छुटकारा पा सकते हैंecho test | vim < /dev/tty <(cat>
अलेक्जेंडर सॉल्वेटर्स

1

विम में, इस मुद्दे को 234d162प्रतिबद्ध (> = v8.0.1387) में संबोधित किया गया है ।

समाधान: --not-a-termउपयोग किए गए संदेश को न दिखाएं ।

इसलिए संदेश केवल तभी प्रदर्शित होता है जब उपयोगकर्ता ने स्टड पुनर्निर्देशित नहीं किया है।


इसी तरह के मुद्दे को Neovim ( > = v0.2.2-dev ) के हालिया संस्करण में संबोधित किया गया है जिसे आप विम के बजाय उपयोग कर सकते हैं।

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 है। और दूसरा तर्क बस अपने मानक इनपुट से विम के मानक इनपुट तक सब कुछ गुजरता है। यदि शेल इसका समर्थन नहीं करता है, तो bash -cविशेष रूप <(...)से काम करने के लिए अंत में उपसर्ग आवश्यक है। में बैश मूल समाधान करने के लिए सरल किया जा सकता $ echo foo | vim < /dev/tty <(cat)


ये दोनों मौजूदा उत्तर या प्रश्न में ही शामिल हैं। यहाँ नया क्या है?
मूरू

@muru यह नहीं बताया गया कि दूसरा मामला कैसे काम करता है, और लोग सोच रहे थे कि यह केवल MANPAGE में ही क्यों काम करता है।
अलेक्जेंडर सोलोवेटस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.