विम में एक नए बफर में शेल कमांड (!) का पाइप आउटपुट


35

मैं विम में एक नए बफर में शेल कमांड के आउटपुट को कैसे पाइप कर सकता हूं? निम्नलिखित स्पष्ट रूप से काम नहीं करेगा, लेकिन आप देख सकते हैं कि मुझे क्या मिल रहा है:

:!echo % | :newtab

जवाबों:


27

आप शेल कमांड के आउटपुट को एक नए बफर को बनाने वाले कमांड में पाइप नहीं कर सकते हैं, लेकिन आप एक नया बफर बना सकते हैं और शेल कमांड के आउटपुट को विम के कमांड लाइन पर एक प्रविष्टि के साथ पढ़ सकते हैं। आपके उदाहरण का एक कार्यशील संस्करण होगा

:tabnew | r !echo <c-r>=bufname("#")<cr>

ध्यान दें कि इस मामले में पाइप का प्रतीक विम पूर्व कमांड के बीच एक विभाजक है, न कि शेल का पाइप। यह भी देखें

:help :tabnew
:help :r!
:help :bar

यह लगभग वही है जो मुझे चाहिए, बस दूसरे तरीके से ताकि मैं वर्तमान बफर के फ़ाइल नाम तक पहुंच सकूं। नोट: वांछित अंतिम परिणाम को स्पष्ट रूप से स्पष्ट करने के लिए प्रश्न को अद्यतन किया।
रिची मार्केज

@ रिचर्ड मार्केज़: मैंने इस उत्तर को अपडेट किया। नया टैब अब "पुराने" फ़ाइल नाम के साथ खोला गया है, इस प्रकार आप कॉल कर सकते हैं:! इको%
अकीरा

लेकिन :r!echoबफर को बदले बिना नहीं ।
ल्यूक हरमिट

2
@garyjohn, अकीरा: मदद के लिए धन्यवाद। "<Cr> = ..." भाग ने विम स्पू त्रुटियां कीं, लेकिन मैं इसे ": tabewew | r! Echo #" के साथ काम करने में सक्षम था।
रिची मार्केज़

1
यह भी नोट करना उपयोगी हो सकता है कि यदि आप इसे अपने .vimrc में कुंजी से मैप करना चाहते हैं, तो आपको इसे बदलना होगा चरित्र के साथ <बार>।
रिची मार्केज़

16

यहाँ मैं क्या कर रहा हूँ। यह उपरोक्त उत्तरों में टिप्पणियों में उल्लिखित है।

: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एक नए टैब के बजाय एक ऊर्ध्वाधर विभाजन चाहते हैं , तो इसका उपयोग करें ।


क्या आप इस प्रश्न का उत्तर यहाँ भी दे पा रहे हैं ? यह %अगले बफर लेकिन E499 के लिए वर्तमान बफर का उपयोग करने की कोशिश कर रहा है ।
hhh


2

यदि आपको वास्तव में परिणाम को एक नए बफर में संग्रहीत करने की आवश्यकता है, लेकिन पुराने वर्तमान बफर से जानकारी की आवश्यकता है, तो आप या तो उपयोग कर सकते हैं system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

या बाद के लिए वर्तमान बफ़र नाम को संग्रहीत करें :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

अन्य उत्तर देखें, आप इसे चर में नाम संचय किए बिना कर सकते हैं। लेकिन वैसे भी अच्छा जवाब।
अकीरा

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