मानक इनपुट से सामग्री को कैसे संपादित करें?


15

मैं उस सामग्री को संपादित करना चाहूंगा, जो डायनामिक रूप से कमांड-लाइन से फाइल के बिना अभी तक उत्पन्न हुई थी।

उदाहरण में:

$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin

लेकिन यह त्रुटियों के साथ असफल हो रहा है:

विम: चेतावनी: इनपुट एक टर्मिनल से नहीं है

विम: त्रुटि इनपुट पढ़ने, बाहर निकलने ...

क्या इसे हासिल करना संभव है?


:help stdin... यह आश्चर्यजनक है कि एक दस्तावेज में निर्मित प्रश्न पूछकर उत्तर कितनी तेजी से मिल सकते हैं।
डैश-टॉम-बैंग

जवाबों:


24

आपको -कमांड लाइन पर फ़ाइल नाम के स्थान पर उपयोग करना होगा :

echo This is example. | vim -

उपरोक्त कमांड मानक इनपुट से पढ़े गए पाठ से भरा एक अनाम बफर खोलेगा।


7
-स्टडिन के लिए कमांडलाइन टूल्स का उपयोग करना बहुत मानक है;
मार्टिन टूरनोइज

6

यह सिर्फ ज्यादातर के बारे में एक मजेदार टिप्पणी है bashऔर readlineहै, लेकिन अगर आप अपने सेट EDITORकरने के लिए वातावरण चर vim, हिटिंग Ctrl+ x+ eमें वर्तमान पंक्ति खुल जाएगा vim। इसके अलावा, यदि आप Meta(Alt/Opt/Esc)+ Ctrl+ टाइप करते हैं, तो ebash वर्तमान कमांड लाइन पर स्थान विस्तार का प्रदर्शन करेगा, अर्थात:

$ echo $EDITOR # Assuming EDITOR was set

साथ Meta(Alt/Opt/Esc)+ Ctrl+ eबन जाएगा

$ echo vim # Assuming EDITOR was set

साथ Ctrl+ x+ eबन जाएगा

1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile

ध्यान दें कि विम को छोड़ने पर, vim बफर की सामग्री को कमांड लाइन पर निष्पादित किया जाता है।

ये सुविधाएँ मेरे लिए तब बहुत उपयोगी हो जाती हैं जब मैं मल्टी-लाइन कमांड को बैश में करना चाहता हूं जैसे कि लूप या प्रोग्राम के लिए यहां स्टेटमेंट की आवश्यकता होती है, और बाद के उपयोग के लिए फाइल करने के लिए कमांड-लाइन हिस्ट्री को बचाने के लिए एक दिलचस्प तरीका प्रदान करता है।

तो मूल प्रश्न का उत्तर देने के लिए, आप भी लिख सकते हैं,

$ This is an example

और फिर इसे लोड करने के लिए Ctrl+ x+ मारा । इसके अलावा, आप कर सकते हैंevim

 $ $(cat /etc/hosts)

और ऐसा Meta(Alt/Opt/Esc)+ Ctrl+ eतो Ctrl+ x+ e, जो एक लाइन पर मेजबान फ़ाइल रख सकते हैं और में यह लोड होगा vim(इन सुविधाओं में से शायद नहीं सबसे अच्छा उपयोग - हालांकि, इन तरीकों की उपयोगिता पर चर्चा की कुछ उदाहरण से वाग्विस्तार किया जा सकता है यहाँ)।

ध्यान दें कि मैं मानता हूं कि आपका मोड readlineसेट emacsहै। यदि आपका मोड readlineसेट vimहै तो आप कमांड का उपयोग करके आसानी से संबंधित बाइंडिंग की खोज कर सकते हैं:

bind -p

और के लिए खोज edit-and-execute-commandया shell-expand-line, जो क्रमशः बाइंडिंग से जुड़े हुए थे Ctrl+ x+ eऔर Meta(Alt/Opt/Esc)+ Ctrl+ e


आप बैश को emacs के बजाय vi कुंजी बाइंडिंग का उपयोग करने के लिए कह सकते हैं। set -o viइसे चालू करने के लिए उपयोग करें । फिर आप बस vअपने संपादक में वर्तमान कमांड को संपादित करने के लिए सामान्य मोड में मैपिंग का उपयोग कर सकते हैं ।
क्विंसी बॉवर

1
यह सुनिश्चित करने के लिए कि vi का उपयोग करके कमांड लाइन को संपादित करने के लिए यह एक शानदार चाल है, लेकिन स्टड से पाठ पढ़ने के लिए इस पद्धति का उपयोग करने में कम से कम दो समस्याएं हैं: 1. shell-expand-lineविस्तारित पाठ से नई सूची निकालें और 2. edit-and-execute-commandबफर में लिखी गई कमांड को निष्पादित करने का प्रयास करें । , जो कुछ भी बचा है या नहीं, जब आप vi छोड़ देते हैं।
toro2k

वाह, यह कमाल है। मैं हर दिन रीडलाइन के बारे में एक नई बात सीखता हूं, ऐसा लगता है ...
डोरकनब

2

बाश में मैंने <(command)सिंटैक्स का उपयोग करके प्रक्रिया प्रतिस्थापन का उपयोग करना उपयोगी पाया है , उदाहरण के लिए:

vim <(echo This is example.)
vim <(cat /etc/hosts)

यह सभी देखें:


4
ध्यान दें कि यह सभी गोले में काम नहीं करेगा । मुझे लगता है कि यह केवल में काम करेंगे bashऔर zsh(और नहीं sh, ksh, dash, fish, csh, tcsh, आदि)
मार्टिन Tournoij

@Carpetsmoker ksh88 और इसके बाद के संस्करण में काम करना चाहिए, मुझे लगता है, लेकिन हां, प्रक्रिया प्रतिस्थापन POSIX नहीं है।
मूरू

4
और ध्यान न दें कि खुद को धोखा न दें! जब आप इस तरह से विम शुरू करते हैं तो यह एक फाइल के लिए एक बफर खोलता है जैसे /proc/PID/fd/FD। यदि आप बफर लिखते हैं और छोड़ देते हैं, विम शिकायत नहीं करता है, लेकिन आपके द्वारा लिखी गई फ़ाइल ओएस द्वारा हटा दी जाएगी। -फ़ाइल नाम के रूप में उपयोग किए गए बफ़र के पास कोई भी फ़ाइल नहीं है, जिसके साथ यदि आप बिना छोड़ने का प्रयास करते हैं (जब तक कि आप धमाकेदार आदेश या समान का उपयोग नहीं करते हैं) तो वीम आपको बचाने की चेतावनी देगा।
toro2k

1
यह अच्छा है क्योंकि यह अच्छी तरह से सामान्यीकृत है vimdiff <(echo foo) <(echo bar)
wchargin

@ toro2k का पालन करने के लिए, इसे प्रयोग की तरह दिखता है :nextऔर :prevधारा फिर से पढ़ता है और कुछ भी नहीं हो जाता है। यह भी ध्यान देने योग्य है कि प्रक्रियाएं एक दूसरे के समानांतर नहीं हैं - उदाहरण के लिए cat <(sleep 3; echo a) <(echo b)प्रिंट करता है - और जबकि catइंटरलेव्स लिखते हैं और पढ़ते हैं, vimफ़ाइल पर "सभी को प्रदर्शित करने से पहले" खत्म पढ़ने "पर इंतजार करते हैं लेकिन बाहरी फ्रेम।
जॉन पी

-1

यदि एक नई विम के लिए एक पाइपलाइन का उपयोग करना एक आवश्यकता नहीं है, तो आप वर्तमान बफर में कमांड के आउटपुट में खींचने के लिए विम की क्षमता का उपयोग कर सकते हैं, एक गैर-फ़ाइल समर्थित बफर के साथ युग्मित ( :newगैर-मौजूद फ़ाइल के साथ या संपादन के रूप में )

:read!cat /etc/hosts कमांड-मोड में आउटपुट को वर्तमान कर्सर स्थिति के नीचे आपके वर्तमान बफर में रखा जाएगा।

खाली बफ़र को हटाने के अलावा जो खाली बफ़र पर किया जाता है, यह अच्छी तरह से काम करता है और विशेष रूप से सुविधाजनक है अगर विम पहले से चल रहा है।


1
यह प्रश्न का उत्तर कैसे देता है?
मुरु

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