मैं विम में एक नए बफर में शेल कमांड के आउटपुट को कैसे पाइप कर सकता हूं? निम्नलिखित स्पष्ट रूप से काम नहीं करेगा, लेकिन आप देख सकते हैं कि मुझे क्या मिल रहा है:
:!echo % | :newtab
मैं विम में एक नए बफर में शेल कमांड के आउटपुट को कैसे पाइप कर सकता हूं? निम्नलिखित स्पष्ट रूप से काम नहीं करेगा, लेकिन आप देख सकते हैं कि मुझे क्या मिल रहा है:
:!echo % | :newtab
जवाबों:
आप शेल कमांड के आउटपुट को एक नए बफर को बनाने वाले कमांड में पाइप नहीं कर सकते हैं, लेकिन आप एक नया बफर बना सकते हैं और शेल कमांड के आउटपुट को विम के कमांड लाइन पर एक प्रविष्टि के साथ पढ़ सकते हैं। आपके उदाहरण का एक कार्यशील संस्करण होगा
:tabnew | r !echo <c-r>=bufname("#")<cr>
ध्यान दें कि इस मामले में पाइप का प्रतीक विम पूर्व कमांड के बीच एक विभाजक है, न कि शेल का पाइप। यह भी देखें
:help :tabnew
:help :r!
:help :bar
:r!echoबफर को बदले बिना नहीं ।
यहाँ मैं क्या कर रहा हूँ। यह उपरोक्त उत्तरों में टिप्पणियों में उल्लिखित है।
:new | r ! <cmd>
:new | r ! <cmd> # (# is replaced with filename)
उदाहरण 1 : सभी पाठ फ़ाइलों को खोजें/tmp
:new | r ! find /tmp -name '*.txt'
उदाहरण 2 : आप फ़ाइल foo.txt का संपादन कर रहे हैं और आप ls -la foo.txtआउटपुट को बफर में चलाना और प्राप्त करना चाहते हैं :
:new | r ! ls -la #
आपके #द्वारा संपादित किए जा रहे मूल बफर के फ़ाइल नाम के साथ प्रतिस्थापित किया गया है। यह विशेष रूप से तदर्थ स्रोत नियंत्रण आदेशों जैसे के लिए उपयोगी है
:new | r ! hg annotate -un #
:newएक क्षैतिज विभाजन बनाता है, :vnewयदि आप :tabnewएक नए टैब के बजाय एक ऊर्ध्वाधर विभाजन चाहते हैं , तो इसका उपयोग करें ।
:tabnew | enew | r ! <your shell cmd>
मेरे लिये कार्य करता है।
यदि आपको वास्तव में परिणाम को एक नए बफर में संग्रहीत करने की आवश्यकता है, लेकिन पुराने वर्तमान बफर से जानकारी की आवश्यकता है, तो आप या तो उपयोग कर सकते हैं system():
:let res = system('echo '.expand('%'))
:tabnew
:put=res
या बाद के लिए वर्तमान बफ़र नाम को संग्रहीत करें :
:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>