एक ही लाइन पर कई कमांड


187

मैं कुछ ऐसा खोजने की कोशिश कर रहा हूं जो मुझे विम / एक ही पंक्ति में एक से अधिक कमांड चलाने देगा, सेमीकॉलन का उपयोग करने के लिए अलग-अलग कमांड * निक्स सिस्टम या &विंडोज में। क्या इसे करने का कोई तरीका है?


2
वाह मैं आपके प्रश्न (जो मैंने किया था) से विम के बारे में जानने की कोशिश कर रहा था और मुझे पता चला कि मैं यूनिक्स के अलग-अलग बलों के ;बजाय भी उपयोग कर सकता हूं &&!

8
@ebyrob मुझे लगता है कि &&'बूलियन' और 'शेल कमांड' में यह नोट करना महत्वपूर्ण है कि यदि आपके पास है command1 && command2, command2तो केवल तभी निष्पादित होगा जब command1सफलतापूर्वक निष्पादित किया गया हो। साथ ;तुम सिर्फ मैन्युअल रूप से पंक्ति के अंत निर्दिष्ट कर रहे हैं और एक नया शुरू। यह एक शेल स्क्रिप्ट में प्रत्येक कमांड को एक अलग लाइन पर लिखने जैसा है।
विल

... और कमांड 1 || कमांड 2 विफल होने पर कमांड 2 केवल कमांड निष्पादित करेगा। ऐसा इसलिए है क्योंकि कंप्यूटर तर्क में || और & बिट बिटवाइज़ हैं, और "&&" से तात्पर्य है कि कमांड 1 और कमांड 2 दोनों को निकाला जाना है, कमांड 1 को फेल होने की आवश्यकता नहीं है, अगर कमांड 1 विफल हो जाता है, क्योंकि कोई भी चीज़ जो cmd2 वापस नहीं आती है, तो यह हमेशा विफल रहेगा क्योंकि पहले वाला झूठा वापस आ जाता है ( 0), और 0 && 1 अभी भी शून्य होगा। यदि कोई कमांड 1 = सही है, तो कमांड 1 के लिए OR मूल्यांकन में कोई कारण नहीं है, क्योंकि उस बिंदु पर यह पहले से ही सच है (1), क्योंकि 1 || 0 1 है, और केवल तभी है || 0, 1 0 की आवश्यकता होगी। 1 (जो अभी भी 1 है)
ओसीरसिगोत्रा

@osirisgothra जिसे शॉर्ट सर्किटिंग / शॉर्ट सर्किट मूल्यांकन के रूप में जाना जाता है।
बोलने वाला

जवाबों:


241

एक बार |आपको ऐसा करने की अनुमति देगा। से:help :bar

'|'कमांड को अलग करने के लिए इस्तेमाल किया जा सकता है, इसलिए आप एक लाइन में कई कमांड दे सकते हैं। यदि आप '|'किसी तर्क में उपयोग करना चाहते हैं , तो इसके साथ पूर्ववर्ती करें '\'

उदाहरण:

:echo "hello" | echo "goodbye"

आउटपुट:

hello
goodbye

NB: आप पा सकते हैं कि आपकी ~/.vimrcमैपिंग का समर्थन नहीं करता है |, या \|। इन मामलों में, <bar>इसके बजाय का उपयोग करने का प्रयास करें ।


8
बस आदेश के साथ काम नहीं करते मुट्ठी भर के लिए बाहर देखो |!
बहुत ज्यादा php

31
जब आप अपने आप को एक mapबयान में कई कमांड का उपयोग करना चाहते हैं (और मेरा विश्वास करो, आप करेंगे), बाहर की जाँच करें :help map_bar
बिल ओडोम जूल

8
यह सच है। मैंने पूछा कि कुछ महीने पहले सुपरयुसर पर बहुत सवाल। मेरा मैपिंग के लिए .vimrcएक बची हुई बार ( \|) का समर्थन नहीं करता है । मैंने सीखा कि मुझे वास्तव में टाइप करना है <bar>
जैल

काम कर रहे समाधान के लिए धन्यवाद! :help barहालांकि कई आदेशों के बारे में और कुछ भी नहीं।
geekQ

1
@geekQ होना चाहिए:help <bar>
श्री कादिमीसेट्टी

90

रखो <CR>के बीच और आदेशों के बाद (कैरिज रिटर्न / दर्ज करें)। उदाहरण के लिए:

map <F5> :w<CR>:!make && ./run<CR>

उपयोग न करें |क्योंकि:

  • यदि आप |उनके बाद उपयोग करते हैं तो कुछ आदेशों में समस्याएं हैं

  • | कॉन्फ़िगरेशन फ़ाइलों में लगातार काम नहीं करता है, देखें :help map_bar


42

आप एक ऐसे फंक्शन को परिभाषित कर सकते हैं जो आपकी आज्ञाओं को क्रियान्वित करता है।

function Func()
     :command
     :command2 
endfunction

और इसको उदाहरण के लिए, अपने vimrc में रखें। साथ फंक्शन चलाएं

exec Func()

1
साफ समाधान। निश्चित रूप से दो या अधिक लंबे आदेशों के लिए उपयोगी होगा।
इलाइमिक्स

1
कोशिश / पकड़ने के साथ त्रुटियों को हाथ लगाने की क्षमता के लिए भी बहुत उपयोगी है।
इमैनुएल वेइनाचटेन

2
यह उपयोग करने के लिए अधिक परंपरागत है :call Func()क्योंकि :execute Func()इसका मतलब कुछ और है। इसका अर्थ है कमांड के रूप में फ़ंक्शन का रिटर्न वैल्यू प्रदर्शन करना। यहां वर्णित फ़ंक्शन में आमतौर पर एक कमांड नहीं होगी जो :returnइसके साथ शुरू होती है , इसलिए इसका वापसी मूल्य शून्य होगा। यह प्रदर्शित करना कि कमांड के रूप में कर्सर को वर्तमान बफ़र की पहली पंक्ति में ले जाएगा, जो हमेशा आपके दिमाग में नहीं था।
मिनोपेट


16

मैंने हमेशा + , + ^Jदबाकर कई कमांड्स को अलग करने की आदत डाली है ।CtrlvCtrlj


यह एकमात्र समाधान प्रतीत होता है जो वास्तव में काम करता है। यदि मैं इसे एक स्ट्रिंग में उपयोग करना चाहता हूं, तो मैं इसे कौन निर्दिष्ट करूं?
डेरह

आप ^Jस्ट्रिंग में कमांड विभाजक के रूप में उपयोग नहीं कर सकते क्योंकि यह स्ट्रिंग को समाप्त करने वाले NULL वर्ण को सम्मिलित कर रहा है। हालाँकि आप <CR> = "\ n" का उपयोग कर सकते हैं।
टिनमारिनो

exe "echo 'foo' \n echo 'bar'"
टिनमारिनो

exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
टिनमारिनो

map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
टिनमारिनो

11

सोचा कि यह किसी को एक श्रृंखला में प्रतिस्थापन करने की कोशिश कर रहा है और एक असफल हो सकता है

एक टिप्पणी से

% s/word/newword/ge | % s/word2/newword2/ge

eस्ट्रिंग नहीं मिलने पर आप त्रुटि को अनदेखा करने के लिए ध्वज का उपयोग कर सकते हैं ।


2

आप एक नई फ़ाइल बना सकते हैं, और उस पर अपनी कमांड लिख सकते हैं। फिर :so %, जिसका मतलब स्रोत वर्तमान फ़ाइल है।

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