क्या Ex मोड का कोई व्यावहारिक उपयोग है?


115

विम में एक पूर्व मोड है जिसे दर्ज करके प्रवेश किया जा सकता है Q, और एक कमांड लाइन मोड जिसे दर्ज किया जा सकता है q:। नए विम उपयोगकर्ताओं के बीच एक आम शिकायत यह है कि वे विम को छोड़ने की कोशिश करते समय गलती से इन मोड में प्रवेश करते हैं। जैसे, मैं इन कुंजियों को अपने ~/.vimrcआप में अक्षम कर देता हूं ताकि खुद को गलती से मारना बंद कर सकें (विशेष रूप से q:):

map q: <Nop>
nnoremap Q <nop>

हालाँकि मैंने vim प्रलेखन को Ex पर पढ़ा है, मैं एक अनुभवी अनुभवी Vim उपयोगकर्ता हूँ, और इसके पीछे के मूल विचार को समझता हूँ, फिर भी मैं अपने दैनिक vim उपयोग में इसके लिए कोई उपयोग खोजने के लिए संघर्ष करता हूँ। सामान्य तौर पर, यह केवल एक मानक vim कमांड-लाइन कमांड के साथ उपसर्ग में प्रवेश करने से कम उपयोगी लगता है :, क्योंकि परिवर्तन सीधे रूप से प्रतिध्वनित नहीं होते हैं।

क्या Ex में आधुनिक Vim का कोई व्यावहारिक रोजमर्रा का उपयोग होता है? क्या ऐसा कुछ है जो मानक आदेशों की तुलना में Ex मोड में करना आसान है? कमांड लाइन मोड और पूर्व मोड के बीच अंतर क्या है?


13
Qऔर q:काफी अलग हैं। आप केवल Qसही की बात कर रहे हैं ?
जैमेसन

@jamessan, वास्तव में, यह पता चला है कि मुझे यकीन नहीं था ... आप सही हैं, वे अलग-अलग काम करते हैं, हालांकि मैंने माना था कि वे मूल रूप से एक ही थे। यदि आप इस प्रश्न का उत्तर देते हैं, तो यह वहां स्पष्ट करने में मदद कर सकता है, क्योंकि मैं स्पष्ट रूप से भ्रमित हूं।
एंड्रयू फेरी

इस सवाल पर मेटा पर चर्चा की जा रही है ।
२००

1
@AndrewFerrier आपने q:विशेष रूप से इसके बारे में पूछा , और इसका उल्लेख किया, दो प्रमुख अनुक्रमों में से, आपके पास सबसे अधिक समस्या है। और यहां दिए गए दो उत्तर उन लोगों के लिए उपयोगी हो सकते हैं जो सही अवधि तक इसे खोज रहे हैं।
रैंडम 832

4
जब आप सीखते हैं कि क्या q/और क्या q:करते हैं, तो आप शायद उन्हें विम में सबसे उपयोगी कमांडों में से कुछ पर विचार करेंगे। और हाँ, आप पहले से ही जानते हैं कि उनका उपयोग कैसे करना है, आप अभी तक नहीं जानते कि वे क्या करते हैं। यह जानने के लिए यह पेंचकस देखें ।
सातो कैटसुरा

जवाबों:


81

Qजैसा कि आपने पाया, पूर्व मोड। यह अंतःक्रियात्मक रूप से उपयोग करने के लिए पूरी तरह से उपयोगी नहीं है, लेकिन यह मौजूद है क्योंकि पुरानी exबाइनरी का अनुकरण करने के लिए विम का उपयोग किया जा सकता है । वास्तव में, कई प्रणालियाँ exइसे केवल सहानुभूति देकर कमांड प्रदान करती हैं vim

q:, या :<C-f>, इसके बजाय अपने कमांड-लाइन इतिहास को ब्राउज़ करने और इसे एक सामान्य बफर की तरह संपादित करने का एक तरीका प्रदान करता है। इससे आपके द्वारा चलाए गए पिछले कमांड को ढूंढना आसान हो जाता है, इसे सामान्य Vim कमांड के साथ संपादित करें, और फिर संशोधित कमांड चलाएं। q/और q?आदेशों खोज इतिहास के लिए एक ही सुविधा प्रदान करने के लिए मौजूद हैं।


63

पूर्व मोड में विम उपयोगी है जब:

  • आपको गैर-अंतःक्रियात्मक (स्क्रिप्ट के भाग के रूप में) फ़ाइलों के संपादन की आवश्यकता है।
  • आपका कनेक्शन बहुत धीमा है या स्क्रीन आपके कार्यों के बाद अपडेट नहीं की गई है।
  • मैपिंग और संक्षिप्तियाँ अक्षम हैं।
  • सामान्य कुंजी जैसे कि Escapeया Controlठीक से काम नहीं करती है।

मूल रूप viसे दृश्य विधा है, exइसलिए विम एक्ज़ मोड केवल ex(वे अभी भी समान कोड चलाते हैं) का अनुकरण है , इसलिए यह exvi और इसके विपरीत से कमांड मोड में आना संभव है। वास्तव में दो मोड हैं: एक्स मोड ( vim -e) और बेहतर एक्स मोड जो vi संगत एक्स-मोड ( vim -E) की तुलना में अधिक उन्नत कमांड के लिए अनुमति देता है । देखें: एक्स मोड और बेहतर एक्स मोड के बीच क्या अंतर है?

पूर्व संपादकों के एक परिवार की जड़ है: edit, exऔर vi। पूर्व का एक सुपर सेट है ed, जिसमें सबसे उल्लेखनीय विस्तार एक प्रदर्शन संपादन सुविधा है। पूर्व (1)

संपादन फ़ाइलें गैर सहभागी है सबसे आम उपयोग और के रूप में समान तरीके से यह उपयोग करने वाले लोगों sedऔर awk, लेकिन वे उन्मुख अधिक धारा रहे हैं कर रहे हैं - वे केवल समाप्त करने के लिए शुरू से ही आगे फ़ाइल को पढ़ने (वे कई लाइनों के साथ काम करने के लिए तैयार किया गया है नहीं कर रहे हैं ) जबकि vimबफर ओरिएंटेड है - आप फ़ाइल में आगे और पीछे की ओर बढ़ सकते हैं जैसे कि आप इसे इतना शक्तिशाली बनाते हैं।

मूल रूप से:

sedएक है एस tream प्रवर्तन निदेशालय itor, न कि एक फ़ाइल संपादक।

फिर भी, लोग फ़ाइलों को संपादित करने की कोशिश करने के लिए इसका दुरुपयोग करने लगते हैं और सच्चाई यह है कि यह फ़ाइलों को संपादित नहीं करता है। दूसरे इसके विकल्प जैसे कि इन-प्लेस ( -i) गैर-मानक FreeBSD एक्सटेंशन हैं और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकते हैं। इसलिए यदि आप गैरवाजिब कोड से बचना चाहते हैं, तो I / O ओवरहेड और खराब साइड इफेक्ट्स (जैसे कि सिम्बलिंक्स को नष्ट करना) आपको उपयोग करना चाहिए exजो कि मानक UNIX कमांड-आधारित संपादक (साथ में ed) BashFAQ है


अन्य चीजें जो मुझे Ex मोड में उपयोगी लगती हैं, इसे एक खेल के मैदान ( pythonकंसोल के समान ) के रूप में उपयोग करने के लिए है, जहां आप एक पंक्ति में कई कमांड निष्पादित कर सकते हैं, नियमित अभिव्यक्ति डिबग कर सकते हैं, वीआईएम कॉन्फ़िगरेशन की जांच कर सकते हैं, बाहरी कमांड निष्पादित कर सकते हैं या रजिस्टरों के साथ काम कर सकते हैं, आदि। ।

उदाहरण के लिए:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

जो सामान्य मोड की तुलना में एक्स मोड में अधिक आसान है (जहां आप केवल अपनी अंतिम कमांड देख सकते हैं)।


व्यावहारिक उपयोग

मेरे पास निम्नलिखित उपनाम हैं .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

नोट: का उपयोग करना bufdoनहीं है exPOSIX अनुरूप विधि (अनुसार मैनुअल ), तो फिर उसे अपने साथ उपयोग करने पर विचार कर सकते हैं findबजाय। !बचत (अन्यथा चेतावनी उत्पन्न होता है) के बिना बफ़र्स स्विचिंग मजबूर करने के लिए प्रयोग किया जाता है।

पहली बार मैं अपने सभी स्रोत फ़ाइलों में अनुगामी रिक्त स्थान को ट्रिम करने के लिए उपयोग कर रहा हूं, जैसे:

trim **/*.php

दूसरा व्यक्ति सभी टैब को रिक्त स्थान में बदल देता है (उदाहरण के लिए):

retab **/*.php

मेरे लिए उपयोग retabकरना काफी है, लेकिन यहां कुछ डाउनसाइड्स का वर्णन किया गया है-Vवर्बोसिटी आउटपुट में वृद्धि के लिए अतिरिक्त जोड़ें ।

नोट zsh / bash4 का उपयोग कर कि उपरोक्त उदाहरण ग्लोबिंग ( **), तो सुनिश्चित करें कि आपके खोल इसका समर्थन करता है और यह सक्षम है बनाते हैं।

अधिक व्यावहारिक उदाहरणों (जैसे HTML फ़ाइलों को पार्स करना) के लिए, जाँच करें:

पूर्व मोड के बारे में और भी जानें:


आप "संपादन (एकाधिक) फ़ाइलों को गैर-सहभागी" आपरेशन कि है के साथ प्राप्त करने के लिए सरल का एक उदाहरण पोस्ट कृपया exकी तुलना में यह साथ है ed, sedया awk?
सातो सतसुरा

1
@SatoKatsura ने दो व्यावहारिक उपयोग जोड़े जो कई फ़ाइलों से संबंधित हैं।
kenorb

मैं exमोड पर एक बेहतर समझ पाने के लिए प्रलेखन के माध्यम से खुदाई कर रहा हूं । मुझे नहीं पता कि !आपके trimउपनाम bufdoआदेश में आपके पास बैंग ( ) क्यों है । पिछले एक को छोड़कर सभी फ़ाइलों में सभी परिवर्तनों को छोड़ दें? यदि नहीं, तो क्यों नहीं?
वाइल्डकार्ड

@Wildcard बिना !मूल रूप से काम नहीं करेगा, जब हर बार जब बफर स्विच किया जाता है, exतो गैर-सहेजे गए परिवर्तनों के बारे में शिकायत करेगा (और हम बहुत अंत में परिवर्तन सहेज रहे हैं xa)। चेतावनी को अक्षम किया जा सकता है, लेकिन इसे जोड़ना बहुत आसान है !
केनोरब

मैं देख रहा हूं ... मुझे लगता है कि मैं दस्तावेज को गलत बता रहा हूं; यह बताता है कि बिना! आदेश बफर परित्यक्त नहीं किया जा सकता है, तो विफल हो जाएगा, लेकिन यह स्पष्ट रूप से वह निर्दिष्ट नहीं है !कारण होगा बफर करने के लिए नहीं खारिज किया जा .... तो, "परित्यक्त" करता है इस मामले में मतलब "गिरा , क्योंकि इसमें ऐसा कुछ भी नहीं है जो डिस्क पर नहीं लिखा है ”? और क्या? (मैं देख रहा हूँ :help bufdo)
वाइल्डकार्ड

18

मैं शायद ही कभी पूर्व मोड का उपयोग करता हूं, लेकिन जब मुझे इसकी आवश्यकता होती है तो मैं इसके अस्तित्व के लिए आभारी हूं।

मैं कभी-कभी वीपीएन पर ssh के माध्यम से सिस्टम का उपयोग करता हूं, और ये कनेक्शन कभी-कभी धीमा हो सकते हैं। समस्या को और बदतर बनाते हुए, मुझे कभी-कभी दूरस्थ पक्ष पर एक फ़ाइल को संपादित करने की आवश्यकता होती है, जो कि ssh और VPN के पीछे होने के अलावा, एक धीमी धारावाहिक कनेक्शन पर है (इसलिए, 9600 बॉड और बहुत अधिक नेटवर्क विलंबता)।

यह कई बार ऐसा होता है कि दृश्य प्रतिक्रिया और स्क्रीन अपडेट अधिक बाधा बन जाते हैं क्योंकि मुझे जो दिखाई देता है उसमें देरी होती है (प्रभाव एक माइक में बात करने की तरह होता है, लेकिन दूर के स्पीकर के साथ, खेल स्टेडियम की तरह। एक व्यक्ति की हरकतें तड़क-भड़क वाली हो जाती हैं। और कभी-कभी देरी की प्रतिक्रिया के कारण भ्रमित)।

इस मामले में, परिवर्तन वापस नहीं किया जाना एक उपयोगी लाभ है, क्योंकि मैं कम समय में अधिक काम कर सकता हूं जब मैं स्क्रीन को अपडेट करने के लिए इंतजार नहीं कर रहा हूं।

जब मैं संपादन कर रहा होता हूं, मैं अपने काम की समीक्षा करने के लिए एक बार के स्क्रीन अपडेट के लिए विजुअल मोड पर वापस जाता हूं। फिर मैं एक्स-मोड पर वापस जा सकता हूं या सहेज सकता हूं क्योंकि मैं कर रहा हूं।


13

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

कहते हैं कि आप एक लंबे प्रतिस्थापन कमांड को संपादित करना चाहते हैं जिसे आपने एक बार चलाया था, लेकिन एक गलती की थी:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

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

एक बेहतर तरीका: q:कमांड-लाइन विंडो kमें जाने के लिए, अंतिम कमांड तक जाने के लिए, और आप जिस कमांड को बदलना चाहते हैं, उसके सामान्य गतियों के साथ नेविगेट करें। एक पूरे शब्द को बदलना चाहते हैं, कोई समस्या नहीं ciw:।


ठीक है धन्यवाद। क्या आपको यकीन है q: है पूर्व आदेश-पंक्ति? मदद केवल "एक्स" वाक्यांश का उपयोग करती है Q, जो उसके द्वारा लाया गया मोड है , लेकिन यह आपके द्वारा संदर्भित मानक vim संपादन का समर्थन नहीं करता है - केवल q:करता है, जो मदद को केवल 'कमांड लाइन मोड' कहता है। मुझे पता है कि मैंने पहले दोनों को भ्रमित किया था, लेकिन हमें यह सुनिश्चित करना चाहिए कि हम यहां के भेद के बारे में स्पष्ट हैं।
एंड्रयू फेरियर

1
मैंने :help q:उस वाक्यांश का उपयोग करने का निर्णय लेने से पहले खोज की , लेकिन मैं शब्दावली के बारे में भ्रमित हो सकता हूं।
bsmith89

1
मैं इस शब्दावली के बारे में भी उलझन में हूँ। मैं आमतौर पर निम्नलिखित के रूप में एक पूर्व कमांड टाइप करने के बारे में बात करता :हूं, लेकिन मैं उस गलत का उपयोग कर सकता हूं।
bsmith89

3
आपके उत्तर की सामग्री सभी सही है, लेकिन आप शब्दावली का उपयोग कर रहे हैं (मेरे लिए) थोड़ा भ्रमित है। मुझे लगता है कि आप दस्तावेज़ को थोड़े गलत तरीके से व्याख्या कर रहे हैं। q:एक पूर्व कमांड लाइन नहीं खुलती है। यह कमांड हिस्ट्री विंडो को खोलता है , जिसमें करंट और पिछली एक्स कमांड को एडिट किया जा सकता है। Ex कमांड लाइन वह है जो आपको :नॉर्मल मोड में दबाने पर मिलती है।
रिच

3
FWIW मुझे लगता है कि विम प्रलेखन थोड़ा उलझन में है, जैसा कि स्थानों में यह :'पूर्व' कमांड के रूप में सभी आदेशों को संदर्भित करता है । IMHO वास्तव में केवल पूर्व में उपलब्ध कमांड को पूर्व कमांड माना जाना चाहिए।
रिच

6

मुझे आंशिक दृष्टि वाले एक व्यक्ति द्वारा बताया गया था जो अंधा हो रहा है कि वह पूर्व में स्विच कर रहा है, इसलिए इसका एक उपयोग है। मैं खुद भी vi से काफी उम्र का हूँ, और मैंने ed से एक लंबे समय पहले ex किया था (हाँ, मुझे पता है, "ed is standard standard editor")। केवल एक चीज जो मैं vi मोड में करता हूं, वह है लिस्प कोड लिखते समय परेंस से मिलान करने के लिए।


इस साक्षात्कार की याद दिलाता है । मुझे याद नहीं अगर exविशेष रूप से उल्लेख किया गया था।
मार्टिन टूरनोइज जूल

उत्कृष्ट अंतर्दृष्टि, मैंने ऐसा कभी नहीं सोचा होगा। बहुत बहुत धन्यवाद, शानदार जवाब।
एंड्रयू फेरियर

2

पहले से ही यहां बताई गई usages के अलावा, पूर्व भी linux कंसोल पर फ़ाइलों को संपादित करने का एक तरीका है यदि ऐसा S / 390 प्लेटफ़ॉर्म पर होता है और कंसोल स्क्रीन-ओरिएंटेड के बजाय लाइन-ओरिएंटेड होता है।


-1

मूल "पूर्व" यूनिक्स में "एड" पाठ संपादक का उन्नत संस्करण था। 2BSD में एक दृश्य मोड जोड़ा गया था, और नए संपादक को "vi" कहा गया था।

यदि कोई पूर्व कमांड लाइन का उपयोग करना चाहता है, तो वह ":" कुंजी के साथ कमांड मोड में जाएगा। तो मेरी सबसे अच्छी समझ पूर्व में वास्तव में उदासीनता के लिए नहीं है, यह कमांड मोड प्रदान करने का हिस्सा है।

आप इसके इन्सर्ट मोड में भी प्रवेश कर सकते हैं

 :i 

फिर "एंटर करें और अपना टेक्स्ट टाइप करें। ^ c से बाहर निकलें। या यह सब एक कमांड लाइन पर टाइप करें, जैसे

 :i my multiline text \with a second line.^c

1
यह देखते हुए कि Ex-mode कमांड-लाइन-मोड के समान नहीं है , यह प्रश्न का उत्तर नहीं देता है। और एक अतिरिक्त साइड नोट के रूप में: कमांड-मोड सामान्य मोड के लिए एक दुर्भाग्यपूर्ण पर्याय है, कमांड-लाइन मोड नहीं।
8bittree

"कमांड मोड" बिंदु लिया गया। केवल बहाना, जब हम vi में बदल गए नए जोड़ के रूप में हम "दृश्य" (वर्तमान vim दृश्य मोड नहीं) के रूप में "कमांड" के विपरीत थे - अब पूर्व। दूसरी ओर कमांड-लाइन उसी do_cmdline () को पूर्व की तरह लागू करती है। ऐसा नहीं है कि यह किसी भी "व्यावहारिक उपयोग" का सुझाव देता है, मैं मानता हूं।
if2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.