शेल के लिए वीआईएम कमांड का आउटपुट कैसे करें


11

मान लीजिए कि मैं शेल में हूं ( bash) और आउटपुट देखना चाहता हूं जो :scriptnamesदे सकता है, लेकिन विम शुरू नहीं करना चाहता या शायद मैं इसे दूसरी फाइल में इको करना चाहता हूं।

इसलिए मैं अमल करता हूं

vim +scriptnames

जो मुझे सभी लिपियों को दिखाता है, लेकिन मैं इसे शेल के स्टडआउट में कैसे प्रतिध्वनित करता हूं?

जवाबों:


10

ऐसा होता है, क्योंकि आमतौर पर विम वैकल्पिक स्क्रीन पर स्विच करता है और वहां काम करता है। बाहर निकलने पर, विम वापस स्विच हो जाएगा और इसलिए आपको अपने विम सत्र से कुछ भी बचा हुआ नहीं दिखता है, लेकिन विम शुरू करने से पहले ही निष्पादित कमांड का परिणाम।

इस सुविधा को (लिंक) पर समझाया गया है:h xterm-screens

इसलिए आप मूल रूप से ऐसा नहीं चाहते हैं और इसलिए इसे अक्षम करना चाहते हैं। आप ऐसा कर सकते हैं, :set t_ti= t_te=जो खाली करने के लिए टर्मिनल कोड सेट करते हैं।

यह सब एक साथ रखकर, आप इस तरह से विम शुरू करना चाहेंगे:

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

हम 'more'विकल्प को रीसेट कर रहे हैं , ताकि आप हिट-एंटर-प्रॉम्प्ट न देखें।


1
यह बहुत अच्छा है, बहुत बहुत धन्यवाद! मुझे वास्तव में संदेह था कि यह संभव था।
hgiesel

क्या यह VimL को पूर्ण रूप से सिस्टम स्क्रिप्टिंग भाषा के रूप में उपयोग करना संभव बनाता है, जिससे इसे stdout (विशेष रूप से मैसोकिस्टिक के लिए) लिखने की अनुमति मिलती है?
छायाकार

1
इसके साथ एक समस्या यह है कि मैं टर्मिनल को स्क्रॉल नहीं कर सकता। (यदि पाठ मेरी टर्मिनल ऊंचाई से अधिक लंबा है तो मैं शीर्ष नहीं देख सकता हूं) यदि मैं vim खोलता हूं तो पाठ भी गायब हो जाता है।
FDinoff

@ फ़िनडॉफ़ है कि क्या lessवहाँ की तरह pagers के लिए कर रहे हैं। बस इसे इतना कम में पाइप करें vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less। लेआउट शायद पहले खराब हो गया (यह मेरे टर्मिनल में है), लेकिन <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

मैं ईसाई Brabandt द्वारा दिए गए उत्तर की सराहना करता हूं, लेकिन मुझे लगता है कि एक बेहतर उत्तर एक और -c कमांड का उपयोग करके पद छोड़ना होगा:

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

इस विधि का उपयोग करने का मतलब है कि आप एक साथ कई विभिन्न कमांडों को एक साथ जोड़ सकते हैं और फिर अंतिम 'q!' का उपयोग कर सकते हैं। विम से बाहर निकलने के लिए।


0

उन स्थितियों के लिए जहां आपको पूरी तरह से लोड होने के लिए विम की आवश्यकता होती है जैसे कि आपने इसे मैन्युअल रूप से शुरू किया था, यह काम करता है:

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

उदाहरण के लिए, मैं :mapशेल से किसी फ़ाइल के आउटपुट को रीडायरेक्ट करना चाहता था , लेकिन मैं मैपिंग को कैप्चर करना चाहता था, जो विम-एयरलाइन अपनी टैबलाइन प्रदर्शित करने के बाद ही बनाता है। इस अतुल्यकालिक, बस -cएक फ़ाइल पर रीडायरेक्ट चलाने के लिए मैपिंग बनाने के लिए समय नहीं दे रहा था। एक बेहतर तरीका हो सकता है, लेकिन यह मेरे लिए काम करता है, खासकर जब से मैंने पहले से ही (0.1 सेकंड) updatetimeसेट 100किया है, जो कि CursorHoldघटना के आग लगने तक कितनी देर तक प्रभावित करता है । डिफ़ॉल्ट रूप से, विम इसे 4 सेकंड में सेट करता है।

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.