बैश करने के लिए विम एडिटर और पाइप आउटपुट कैसे आमंत्रित करें


34

कभी-कभी मुझे पाठ लिखने की आवश्यकता होती है और फिर उस पाठ को दूसरे आदेश में पाइप कर देता है। मेरा सामान्य वर्कफ़्लो कुछ इस तरह से जाता है:

vim
# I edit and save my file as file.txt
cat file.txt | pandoc -o file.pdf # pandoc is an example 
rm file.txt

मुझे यह बोझिल लगता है और बैश स्क्रिप्टिंग सीखने की कोशिश करता हूं, मैं एक कमांड लिखकर प्रक्रिया को बहुत सरल बनाना चाहता हूं जो एक एडिटर को खोलती है और जब एडिटर एडिटर के आउटपुट को स्टडआउट करने के लिए पाइप को बंद कर देता है। तब मैं कमांड चलाने में सक्षम था quickedit | pandoc -o file.pdf

मुझे यकीन नहीं है कि यह कैसे काम करेगा। मैंने पहले से ही कुछ जोड़ के ऊपर सटीक वर्कफ़्लो का पालन करके इसे स्वचालित करने के लिए एक फ़ंक्शन लिखा था। यह फ़ाइल नाम के रूप में कार्य करने के लिए एक यादृच्छिक स्ट्रिंग उत्पन्न करता है और जब फ़ंक्शन को लागू किया जाता है तो उसे विम करने के लिए पास करता है। जब उपयोगकर्ता फ़ाइल को सहेजकर विम से बाहर निकलता है, तो फ़ंक्शन फ़ाइल को कंसोल पर प्रिंट करता है और फिर फ़ाइल को हटा देता है।

function quickedit {
    filename="$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32)"
    vim $filename
    cat $filename
    rm $filename
}
# The problem:
# => Vim: Warning: Output is not to a terminal

मुझे जल्द ही जो समस्या आई वह यह है कि जब मैं quickedit | commandविम जैसा कुछ करता हूं तो उसे संपादक के रूप में इस्तेमाल नहीं किया जा सकता क्योंकि सभी आउटपुट पाइप के लिए विवश हैं।

मुझे आश्चर्य हो रहा है कि क्या इसमें कोई वर्कअराउंड है, ताकि मैं अपने quickeditफ़ंक्शन के आउटपुट को पाइप कर सकूं । उप-विषयक विकल्प एक अलग संपादक को आग देना है, उदात्त पाठ कहते हैं, लेकिन मैं वास्तव में टर्मिनल में रहना चाहता हूं।


Vim के भीतर से, कमांड जारी करें :w !pandoc -o file.pdf? (नोट: बीच का स्थान wऔर !आवश्यक है।)
जॉन १०२४२४

ठीक है वो बहुत बढ़िया है। मुझे नहीं पता था कि आप vim से ही vim आउटपुट को पाइप कर सकते हैं। यह मेरे उद्देश्यों को पूरा करता है, लेकिन मेरे भविष्य के ज्ञान के लिए, क्या मेरी समस्या को हल करना संभव है कि कैसे मैं इसे हल करने का इरादा रखता हूं?
theideasmith

क्या आप अपना कार्य पोस्ट कर सकते हैं? जब आप उस समस्या के बारे में बात करते हैं जिसका आप जल्द ही सामना करते हैं (दूसरा अंतिम पैराग्राफ)? मुझे वह नहीं मिला।
लुकास

5
एक तरफ के रूप में, आपको असुरक्षित फैशन में इसे रोकने के बजाय उपयोगmktemp करना चाहिए ।
वाइल्डकार्ड

एक नए बैश उपयोगकर्ता के रूप में, मक्तम को रोकने के सुरक्षा खतरे क्या हैं?
theideasmith

जवाबों:


42

vipe पाइपलाइनों को संपादित करने का एक कार्यक्रम है:

command1 | vipe | command2

आपको संपूर्ण आउटपुट के साथ एक संपादक मिलता है command1, और जब आप बाहर निकलते हैं, तो सामग्री को command2पाइप के माध्यम से पारित किया जाता है ।

इस मामले में, कोई नहीं है command1 । तो, आप कर सकते हैं:

: | vipe | pandoc -o foo.pdf

या:

vipe <&- | pandoc -o foo.pdf

vipe पर उठाता है EDITORऔर VISUALचर , तो आप इसका उपयोग वेम खोलने के लिए कर सकते हैं।

यदि आपने इसे स्थापित नहीं किया है, vipeतो moreutilsपैकेज में उपलब्ध है ; sudo apt-get install moreutils, या जो कुछ भी आपके flavour के समतुल्य है।


1
मैक उपयोगकर्ताओं के लिए जो यहां आ चुके हैं: moreutilsहोमब्रे में उपलब्ध है।
vergenzt

FreeBSD उपयोगकर्ताओं के लिए: pkg (8) केmoreutils माध्यम से स्थापित करने के लिए उपलब्ध है ।
माटूस पिओत्रोस्की

20

आप इसे विम के भीतर से कर सकते हैं:

:w !pandoc -o file.pdf

या बफर को एक जटिल पाइपलाइन में भी लिखें:

:w !grep pattern | somecommand > file.txt

और फिर आप बचत के बिना विम से बाहर निकल सकते हैं:

:q!

हालांकि, आपके विशिष्ट उपयोग के मामले को देखते हुए, संभवतः viआपके कमांड लाइन संपादक के रूप में उपयोग करके एक बेहतर समाधान है । मान लें कि आप उपयोग करते हैं bash:

set -o vi

इससे आपकी कीबाइंडिंग सेट हो जाती है vi। तो अगर आप बुनियादी के साथ कमांड लाइन पर सही अपने आदेश संपादित कर सकते हैं viदबाकर कीबाइंडिंग <Esc>और फिर टाइप viजैसे आदेशों x, cwआदि (आप दबाकर डालने मोड में वापस प्राप्त कर सकतेi ।)

इस सवाल से भी बेहतर और अधिक प्रासंगिक, आप सीधे अपनी कमांड लाइन सामग्री बनाने के लिए विम खोल सकते हैं। बस टाइप करें <Esc>vऔर आपको एक खाली विम बफर मिलेगा। आप को बचाने के लिए और बाहर निकलने के दौरान, कि है अपने कमांड लाइन पर आदेश और इसे तुरंत चलाया जाता है। यह कमांड लाइन पर सीधे संपादित करने की तुलना में बहुत अधिक लचीला है क्योंकि आप चाहें तो एक पूरी मिनी-स्क्रिप्ट लिख सकते हैं।


इसलिए, उदाहरण के लिए, यदि आप कुछ मुश्किल पाठ लिखना चाहते हैं और इसे तुरंत पंडोक में भेजना चाहते हैं, तो आप बस टाइप कर सकते हैं:

<Esc>v

तब विम बफर को संपादित करें जब तक आपके पास कुछ ऐसा न हो:

cat <<EOF | pandoc -o file.pdf
stuff for pandoc
more stuff for pandoc
EOF

फिर सहेजें और बाहर निकलें (के साथ) :x ) और पूरी चीज़ शेल कमांड के रूप में चलाई जाएगी।

यह आपके शेल के कमांड हिस्ट्री में भी उपलब्ध होगा।


1
यदि आप Emacs कुंजी बाइंडिंग रखना पसंद करते हैं, तो आप कमांड लाइन को संपादित करते समय EDITORपर्यावरण चर को सेट करने vimऔर दबाने के Ctrl-Xबाद कमांड लाइनों को संपादित करने के लिए Vim का उपयोग कर सकते हैं Ctrl-E
एंथोनी जी - मोनिका के लिए न्याय

18

एक पाइपलाइन में चल रहा है

प्रयत्न:

quickedit() (  trap 'rm ~/temp$$' exit; vim ~/temp$$ >/dev/tty; cat ~/temp$$ )

कुंजी यह है कि, vimसामान्य रूप से उपयोग करने में सक्षम होने के लिए , vimटर्मिनल होने के लिए stdout की आवश्यकता होती है। हम इसे पुनर्निर्देशित के साथ पूरा करते हैं >/dev/tty

सुरक्षा के उद्देश्यों के लिए, मैंने उपयोगकर्ता के होम डायरेक्टरी में अस्थायी फ़ाइल डाल दी है। इस पर अधिक जानकारी के लिए, ग्रेग के प्रश्न 062 देखें । यह अस्पष्ट फ़ाइल नाम का उपयोग करने की आवश्यकता को समाप्त करता है।

उदाहरण:

जब vimखुलता है, मैं टाइप This function succeeded.और फ़ाइल सहेजें। स्क्रीन पर परिणाम इस तरह दिखता है:

$ quickedit | grep succeeded
This function succeeded.

भले ही आउटपुट quickeditको एक पाइपलाइन पर पुनर्निर्देशित किया जाता है, फिर vimभी सामान्य रूप से काम करता है क्योंकि हमने इसे सीधे एक्सेस दिया है/dev/tty

विम के भीतर से एक कार्यक्रम चल रहा है

जैसा कि मैंने टिप्पणियों में उल्लेख किया है, विम एक फाइल को कमांड में पाइप कर सकता है। उदाहरण के लिए विम के भीतर से, कमांड जारी करें :w !pandoc -o file.pdf(ध्यान दें: w और (आवश्यक है) के बीच का स्थान)।


2
अच्छा जवाब। यह सीधे उपयोगकर्ता के प्रश्न को संबोधित करता है, और एक त्वरित और सुरुचिपूर्ण समाधान प्रदान करता है: रीडायरेक्ट विम टू / डेव / ट्टी! सरल!
माइक एस

मैं Zsh का उपयोग कर रहा हूं; trap '...' exitविफल रहता है लेकिन trap '...' EXITकाम करने के लिए प्रकट होता है। मैं फंसने के बारे में ज्यादा नहीं जानता, लेकिन अस्थायी फ़ाइलों के लिए मेरा सामान्य दृष्टिकोण उपयोग करना है mktmp [--suffix=...]। साथ ही, vim <outfile> -c '...' >/dev/ttyफ़ाइल लोड होने तक सामान्य रूप से चलता है, फिर दिए गए कमांड चेन को निष्पादित करता है, :wqयदि आप संपादन चरण को छोड़ना चाहते हैं। मैंने भी इस्तेमाल किया set | grep -a EXITऔर पाया signals=(EXIT ... DEBUG)
जॉन पी।

5

सुनिश्चित करें कि vimयह आपके डिफ़ॉल्ट संपादक के रूप में सेट किया गया है (जैसे export EDITOR=vimआपके .bash_profileया में .bashrc। फिर, किसी भी संकेत पर, आप टाइप कर सकते हैं Ctrl- Xइसके बाद Ctrl- E। यह आपके कॉन्फ़िगर संपादक में आपकी वर्तमान कमांड लाइन को खोलेगा (उदाहरण के लिए vim)। अपना संपादन करें, सहेजें। बाहर निकलें और कमांड को निष्पादित किया जाएगा, क्योंकि आपने इसे कमांड लाइन पर टाइप किया था, जिसमें पाइपलाइन और जैसे भी शामिल हैं।

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