वीआईआर को एक्सग्रेस के साथ बुलाने के बाद टर्मिनल ने बोर किया


30

मैंने कभी-कभी xargsइस तरह से विम का उपयोग करने की कोशिश की है :

find . -name '*.java' | xargs vim

... किस तरह का काम करता है:

  1. जैसे ही विम लॉन्च होता है, मुझे निम्नलिखित चेतावनी फ्लैश संक्षेप में दिखाई देती है:

    Vim: Warning: Input is not from a terminal
    
  2. संपादन कार्य - अपेक्षित रूप से :filesसभी .javaफ़ाइलों को सही ढंग से शामिल करता है।
  3. मैं बचा सकता हूं और छोड़ सकता हूं।

हालाँकि, विम से बाहर निकलने के बाद, मेरा टर्मिनल बोर हो गया है:

  • शेल प्रॉम्प्ट पर मैं जो भी टाइप करता हूं, वह प्रतिध्वनित नहीं होता है।
  • कैरिज रिटर्न बिल्कुल दिखाई नहीं देता है, और लाइन फ़ीड केवल कभी-कभी दिखाई देते हैं।

यह तब तक चलता है जब तक मैं reset(1)टर्मिनल को फिर से बनाने के लिए एक आदेश जारी नहीं करता ।

क्या यह विम बग है, या इस तरह से टर्मिनल के साथ बातचीत करने के लिए अधिक संतोषजनक स्पष्टीकरण क्यों है? मैंने देखा है यह लिनक्स और विभिन्न यूनियनों पर संस्करण 7.3 तक (संस्करण को कोई फर्क नहीं पड़ता) विम पर होता है।

मुझे एक वर्कअराउंड के बारे में पता है, अर्थात् vim $(find . -name '*.java')। अन्य कार्यदलों का स्वागत किया जाएगा, हालांकि यह मेरा मुख्य प्रश्न नहीं है।


मैं इस साइट को यथासंभव अधिक से अधिक प्रश्नों के साथ भरने की आपकी इच्छा रखता हूं ... लेकिन उस सवाल का SO / SU और अन्य जगहों पर वर्षों में दर्जनों बार जवाब दिया गया है: xargsएक डमी का उपयोग करता है stdinजिसे विम द्वारा उपयोग नहीं किया जा सकता है और टूट जाता है बाद में सब कुछ।
9

1
@romainl मैं उन साइटों पर सक्रिय नहीं हूं, और मैंने कभी नहीं देखा कि यह वहां पूछा गया - ईमानदार।
200_सेकंड

संबंधित: superuser.com/questions/336016/… - शायद कोई व्यक्ति एक महान जवाब के लिए शीर्ष उत्तर दे सकता है।
मूरू

2
महान प्रश्न - यह मेरे साथ कई बार हुआ है। इसके अलावा, मैं किसी भी अन्य एसओ साइटों का उपयोग नहीं करता हूं - यदि यह विम-संबंधित है, तो मैं इसे यहां खोजना चाहता हूं।
क्रेग

जवाबों:


21

यह तब होता है जब विम को आमंत्रित किया जाता है और यह टर्मिनल के बजाय पिछले पाइपलाइन के आउटपुट से जुड़ा होता है, और इसे अलग-अलग अनपेक्षित इनपुट (जैसे NULs) प्राप्त हो रहे हैं। जब आप दौड़ते हैं तो वही होता है: vim < /dev/nullइसलिए resetइस मामले में आदेश मदद करता है। यह सुपरसुसर में गुरुत्वाकर्षण द्वारा अच्छी तरह से समझाया गया है ।

यदि आप findसंपादित करने के लिए फ़ाइल नामों को पास करने के लिए उपयोग कर रहे हैं , तो आपको उदाहरण की आवश्यकता नहीं है xargs, -execउदाहरण के लिए:

find . -name '*.java' -exec vim {} +

यदि आप xargsयूनिक्स / macOS पर उपयोग करना चाहते हैं , तो आपको -oपैरामीटर का उपयोग करना चाहिए , जैसे:

find . -name '*.java' | xargs -o vim

-oआदेश को क्रियान्वित करने से पहले बच्चे की प्रक्रिया में / देव / टटी के रूप में फिर से खोलना। यदि आप चाहते हैं कि xargs एक इंटरेक्टिव एप्लिकेशन चलाए तो यह उपयोगी है।

या:

find . -name "*.java" -type f -print0 | xargs -o -0 vim

नोट: व्हाट्सएप के साथ फाइलनाम का उपयोग -print0/ -0समर्थन करेगा।


find+ बीएसडीxargs

यूनिक्स / macOS पर आप निम्नलिखित वर्कअराउंड आज़मा सकते हैं:

find . -name '*.java' | xargs -J% sh -c 'vim < /dev/tty $@'

आप उदाहरण के लिए कमांड प्रतिस्थापन सिंटैक्स का उपयोग कर सकते हैं :

vim $(find . -name '*.java')
vim `find . -name '*.java`

वैकल्पिक रूप से , Tty आवंटन parallelके xargsलिए GNU का उपयोग करें , उदाहरण के लिए:

find . -name '*.java' | parallel -X --tty vi

नोट: parallelयूनिक्स / OSX पर काम नहीं करेगा क्योंकि इसके अलग-अलग पैरामीटर हैं और यह tty का समर्थन नहीं करता है।

कई अन्य लोकप्रिय आदेशों के रूप में अच्छी तरह से (जैसे छद्म tty आवंटन प्रदान करता है -tमें ssh), इसलिए मदद के लिए जाँच करें।

अन्य सुझाव का उपयोग करना होगा:

सम्बंधित:


मेरे जीएनयू xargsनहीं है -J। यह एक MacOS (BSD) विकल्प है जो GNU संस्करण में मौजूद नहीं है।
अगली सूचना तक रोक दिया गया।

12

वर्कअराउंड सुझाव: फाइलसिस्टम नेविगेटर के रूप में एक बफर का उपयोग करें

vim -स्टड से पथों की सूची पढ़ने के लिए कमांड का उपयोग करें । विम का :help --यह वर्णन:

एक नया बफ़र संपादित करना शुरू करें, जो स्टड से पढ़े गए पाठ से भरा हुआ है। आमतौर पर स्टड से पढ़ी जाने वाली कमांड को अब स्टडर से पढ़ा जाएगा। उदाहरण:

find . -name "*.c" -print | vim -

फिर आप उसी बफर या क्रमशः एक नई विभाजन विंडो में फ़ाइल पर नेविगेट gfया उपयोग कर सकते Ctrl-wCtrl-fहैं।

वर्कअराउंड सुझाव: तर्क सूची

एक और शानदार तरीका विम की तर्क सूची का उपयोग करना है। :argadd **/*.javaआदेश वर्तमान निर्देशिका रिकर्सिवली के अंदर पाए सभी जावा फाइलों के साथ विम का तर्क सूची बस जाएँगे। इसके बाद आप उपयोग कर सकते हैं :nextऔर :prevफ़ाइलों के बीच ले जाने के लिए।


1 पहला -बताता है विम आप एक कमांड लाइन विकल्प के लिए मदद खोजना चाहते हैं, दूसरा वास्तव में कमांड लाइन झंडा है जिसे आप खोज रहे हैं। ऐसे ही :help help-contextऔर ट्रिक्स के लिए पढ़ें


8

इसके अलावा reset, आप कोशिश कर सकते हैं:

stty sane

जो आपके टर्मिनल को फिर से उपयोग करने योग्य बनाना चाहिए।

स्पष्टीकरण के लिए यहां देखें । और किसी भी तरह यह एक अस्पष्ट दुर्व्यवहार माना जा सकता है, कम से कम नेओविम के पास फिलहाल यह मुद्दा नहीं है।


यह वास्तव में सवाल का जवाब नहीं देता है, लेकिन इससे मुझे मदद मिली, इसलिए +1।
मोनिका iamnotmaynard

यह मेरे प्रश्न का उत्तर देता है;) हालांकि ओपी को पढ़ने के बाद मुझे लगता है कि मुझे resetभी चाहिए।
श्रीधर सरनोबत

1

कारण यह है कि है xargsसेट stdinकरने के लिए /dev/nullहै, जबकि vimजरूरत है stdinहोना करने के लिए /dev/tty


बीएसडी xargs(जैसे मैक) समाधान:

echo -e 'file1\nfile2' | xargs -o vim

-oसेट stdinxarg के बच्चे की प्रक्रिया के ( vimइस मामले में) dev/tty


GNU xargs(जैसे लिनक्स) समाधान:

जीएनयू के xargsपास -oविकल्प नहीं है । इसके बजाय आपको अधिक जटिल वर्कअराउंड का उपयोग करना होगा। (ध्यान दें: अनुगामी zeroस्ट्रिंग का होना बहुत महत्वपूर्ण है , इसे न भूलें।)

echo -e 'file1\nfile2' | xargs bash -c '</dev/tty vim "$@"' zero

आप इसे एक उपनाम भी बना सकते हैं:

alias vimin='xargs bash -c '\''</dev/tty vim "$@"'\'' zero'
echo -e 'file1\nfile2' | vimin

GNU xargs समाधान की विस्तृत व्याख्या

चलिए इसे चरण दर चरण तोड़ते हैं:

echo -e 'file1\nfile2' | xargs bash -c '</dev/tty vim "$@"' zero

1. xargsबस stdinस्ट्रिंग के अंत में जोड़ता है , इसलिए xargsइसे निष्पादित किया जाएगा:

    bash -c '</dev/tty vim "$@"' zero file1 file2

2. के लिए प्रारूप bash -cहै bash -c 'COMMAND_STRING' $0 $1 $2 etc

"$@"पोजिशनल मापदंडों "$1", "$2"आदि का विस्तार करता है, इसमें "$ 0" शामिल नहीं है क्योंकि यह स्क्रिप्ट नाम के लिए एक विशेष पैरामीटर है, न कि पोजिशन पैरामीटर। यही कारण है कि हमें zeroजगह लेने के लिए डमी स्ट्रिंग (यह किसी भी स्ट्रिंग हो सकता है) को जोड़ने की आवश्यकता है $0। अन्यथा, आप पहली फ़ाइल खो देंगे।

इसलिए आपके द्वारा विस्तार करने के बाद "$@", आप समाप्त हो जाते हैं:

    bash -c '</dev/tty vim file1 file2' 

3. bash -cCOMMAND_STRING निष्पादित करेगा:

    </dev/tty vim file1 file2 

</dev/ttyसेट करता stdinहै /dev/ttyताकि vimइंटरैक्टिव मोड में काम कर सके।


+1 यह सबसे अधिक वोटों के साथ उत्तर का एक डुप्लिकेट प्रतीत होगा, लेकिन ऐसा नहीं है। $0प्लेसहोल्डर (यहाँ "शून्य") की कुंजी है।
अगली सूचना तक रोक दिया गया।

0

मैंने इन सभी उत्तरों का अभाव पाया है। Xargs मुद्दे के माध्यम से संघर्ष करने के बाद, मेरे लिए सबसे सरल तरीका है! - एक सामान्य बॉक्स पर ये खोज-और-खोलने के लिए निम्नलिखित है:

vim -O `grep -lir mySearchTerm *`

मैं का उपयोग कर कोई समस्या नहीं है findके साथ xargsऔर grep, लेकिन मैं वाक्य रचना से परेशान हैं। और एक दैनिक कोडर के रूप में जो vimअपने IDE के रूप में टर्मिनल और उपयोग करता है , और लगातार संपत्तियों के लिए फाइलें खोजता है, यह वही है जो मैं उपयोग कर रहा हूं।

find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTermविम और अन्य तरीकों के माध्यम से फाइल खोलने के साथ युग्मित करने के लिए एक समय और स्थान है । मेरे लिए, वह शायद ही कभी हो।

आशा है कि यह किसी की मदद करता है।


2
एफडब्ल्यूआईडब्ल्यू को यह सलाह दी जाती है कि वह विरासत बैकटिक्स संकेतन का उपयोग $(...)न करें और इसके बजाय उपयोग करें । यह एक लिपि में के रूप में अपने आदेश पंक्ति में के रूप में महत्वपूर्ण नहीं है, लेकिन मुझे लगता है कि यह अभी भी बेहतर उपयोग करने के लिए है कि अपने जवाब :) (संदर्भ में यहाँ और यहाँ )
statox
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.