शेल का अर्थ "vi" मोड या "emacs" मोड में है?


32

यह प्रश्न सीधे उत्तर से आता है । इस मामले में मैं विशेष रूप से उस भाग को समझने में असमर्थ हूं जो कहता है:

उस संबंध में, इसका व्यवहार bash (वाचलाइन) / ksh / zsh emacs मोड की तुलना में emacs के करीब है, लेकिन टर्मिनल ड्राइवर एम्बेडेड लाइन एडिटर (विहित मोड) से प्रस्थान करता है, जहां Ctrl-Wपिछले शब्द को हटा देता है (वारसे, vi में भी) )।

यहां हम गोले की बात कर रहे हैं न कि संपादकों की जो दो पूरी तरह से अलग कार्यक्रम हैं। यह कहने का क्या मतलब है कि शेल कुछ संपादक मोड में है?

पुनश्च: आप इस आधार पर अपने उत्तर को आधार बना सकते हैं कि मैं समझता हूं कि एक शेल क्या है और बेसिक संपादन के लिए विम का उपयोग कैसे करें।


यह कोर शेल कार्यक्षमता के बारे में नहीं है, बल्कि लाइन संपादन के बारे में है (जब आप टाइपो बनाते हैं और वापस जाते हैं और अपने आप को सही करते हैं)।
एन। 'सर्वनाम' मी।

जवाबों:


27

"Vi" मोड में आप vi संपादक में एक पंक्ति की तरह वर्तमान शेल प्रॉम्प्ट पर संपादित / नेविगेट कर सकते हैं। आप इसे एक-लाइन टेक्स्ट फ़ाइल की तरह देख सकते हैं। "Emacs" मोड में एनालॉग आप Emacs के शॉर्टकट के (कुछ) का उपयोग करके वर्तमान कमांड लाइन को संपादित / नेविगेट कर सकते हैं।

उदाहरण

Vi- मोड में उदाहरण के लिए आप कुछ ऐसा कर सकते हैं जैसे (bash में):

$ set -o vi
$ ls hello world
<ESC>
bbdw # results in
$ ls world

एमएसीएस-मोड में आप एक लाइन की शुरुआत में कूदने के लिए उदा Ctrl+ Aको हिट कर सकते हैं (vi: Ctrl+ [, 0या ESC, 0)। आप set -o emacsएमएसीएस मोड को (बैश, क्श, ज़श आदि में) चालू कर सकते हैं ।

पढ़ने के लिए लाइन

बहुत से इंटरैक्टिव कमांड लाइन प्रोग्राम ( बैश सहित ) रीडलाइन लाइब्रेरी का उपयोग करते हैं । इस प्रकार, आप कॉन्फ़िगर कर सकते हैं कि कौन से इनपुट मोड का उपयोग करना है (vi या emacs) और अन्य विकल्प एक ही स्थान पर जैसे कि रीडलाइन का उपयोग करने वाले प्रत्येक प्रोग्राम का सटीक एक ही संपादन / नेविगेट करने वाला इंटरफ़ेस है।

उदाहरण के लिए मेरा रीडलाइन विन्यास ऐसा दिखता है:

$ cat ~/.inputrc 
set editing-mode vi
set blink-matching-paren on

उदाहरण के लिए, zsh / ksh जहाँ तक मुझे पता है, वहां रीडलाइन का उपयोग नहीं करता है, लेकिन vi / emacs मोड का भी समर्थन करता है जो बैश / रीडलाइन वन को बहुत पसंद करते हैं।

बेशक, एक कमांड लाइन शेल में vi / emacs मोड पूर्ण संपादक फीचर सेट का एक सबसेट है। प्रत्येक सुविधा कमांड लाइन शेल में समझ में नहीं आती है, और कुछ विशेषताएं दूसरों की तुलना में समर्थन के लिए अधिक जटिल हैं।

विहित मोड

इंटरेक्टिव कमांड लाइन के गोले के em / emacs मोड से पहले 'शेल' का आविष्कार किया गया था, जो आपके शेल आपके टर्मिनल के सिर्फ विहित मोड का उपयोग करेगा जो केवल अंतिम आदेश को हटाने के लिए संपादन कमांड का एक सीमित सेट प्रदान करता है (जैसे Ctrl+ W


मान लीजिए मुझे नहीं पता कि मैं किस इनपुट मोड पर हूं। क्या मैं कुछ पाठ दर्ज करके इसे सत्यापित कर सकता / सकती हूं [Ctrl] + [A]? अगर कर्सर अपने emacs को शुरू करने के लिए आगे बढ़ता है तो vi?
लीमोवला

2
@ आलिमोवाला, एक अच्छा सन्निकटन होना चाहिए। आपके शेल के पाठ्यक्रम पर निर्भर करता है - अगर सीटीएल + ए काम नहीं करता है तो संभावना है कि आपके शेल में कोई संपादन मोड शामिल नहीं है। शायद कुछ गोले अन्य संपादन मोड को भी लागू करते हैं। लेकिन व्यवहार में आपकी विधि काफी अच्छी होनी चाहिए। आप वीआई कमांड के साथ परीक्षण भी कर सकते हैं ताकि अधिक सुनिश्चित हो सके। बैश में आप कुछ का उपयोग भी कर सकते हैं set -o | grep 'emacs\|vi'। Zsh में (जहां मेरे पास vi- मोड है) यह काम नहीं करता है, हालांकि।
maxschlepzig

bind -P इस बात का भी अच्छा संकेत देगा कि
Paul

23

आप देखेंगे कि जब आप catएक टर्मिनल पर एक शेल प्रॉम्प्ट पर दौड़ते हैं , तो catस्टडआउट से लिखने के लिए माना जाता है कि यह स्टड से क्या पढ़ता है, और दबाएं a, आपको aटर्मिनल ड्राइवर द्वारा एक गूँजती हुई पीठ दिखाई देती है , लेकिन catवह नहीं लिखता है a(आप देखें केवल एक a, टर्मिनल चालक द्वारा प्रतिध्वनित)।

हालाँकि, यदि आप टाइप करते हैं, तो आपको आउटपुट a Backspace b Enterनहीं दिखता है , लेकिन ( और newline)।cata\010b\015b\012b

ऐसा इसलिए है क्योंकि टर्मिनल ड्राइवर (हम कर्नेल में सॉफ़्टवेयर की बात कर रहे हैं, टर्मिनल एमुलेटर में नहीं xterm) जैसे कि कैनोनिकल मोड में एक बहुत ही बुनियादी लाइन संपादक को लागू करता है। टर्मिनल ड्राइवर को कमांड का उपयोग करते समय सिस्टम कॉल का उपयोग करके कॉन्फ़िगर किया जा सकता है । उदाहरण के लिए, विहित मोड को छोड़ने के लिए, आप कर सकते हैं । यदि तुम करो:ioctl()sttystty -icanon

stty -icanon; cat

फिर, आप दोनों echo(जो आप के साथ अक्षम हो सकते थे stty -echo) और catआउटपुट एक ही समय में देखेंगे ।

वह संपादक एक लाइन संपादक है। यही है, यह उपयोगकर्ता के लिए पाठ की एक पंक्ति को संपादित करने के लिए है जब तक कि इसे दबाने पर टर्मिनल डिवाइस को पढ़ने के लिए आवेदन नहीं भेजा जाता है Enter

उस संपादक की संपादन क्षमताएं बहुत सीमित हैं। अधिकांश कार्यान्वयनों में, केवल 4 संपादन कुंजी (वास्तव में वर्ण) भी इसके साथ विन्यास योग्य हैं stty:

  • मिटा ( ^Hया ^?आमतौर पर): पिछले चरित्र को मिटा दें
  • मार ( ^Uआमतौर पर): खाली (मार) लाइन अब तक दर्ज की गई
  • वासेज़ ( ^W): पिछले शब्द को मिटा दें
  • lnext ( ^V): अगला अक्षर अक्षरशः दर्ज करें (उपरोक्त सभी का विशेष अर्थ रद्द करें)

पुराने दिनों में, यह सोचा गया था कि टर्मिनल चालक लाइन संपादक को कट्टर क्षमताओं के साथ बढ़ाया जाएगा। इसीलिए आरंभिक गोले में से किसी में भी कमांड लाइन संपादन क्षमता नहीं है (आप catऊपर की तरह चलने पर शेल प्रॉम्प्ट पर समान पंक्ति संपादन क्षमता प्राप्त करेंगे )।

हालाँकि, ऐसा वास्तव में कभी नहीं हुआ, हो सकता है कि अलग-अलग टर्मिनलों में गड़बड़ी होने का कारण कुछ प्रमुख प्रेसों पर समान अक्षर न भेजना हो, जिससे यह स्पष्ट हो गया कि इसे कर्नेल स्पेस में लागू नहीं किया जाना चाहिए।

इसलिए कुछ खोलों ने टर्मिनल चालक के विहित मोड को छोड़ना शुरू कर दिया और अपने स्वयं के लाइन संपादक को लागू किया। उस समय, emacsऔर viपूरी तरह से अलग कुंजी बंधन और ऑपरेशन मोड के साथ सबसे लोकप्रिय दृश्य पाठ संपादक थे। में vi, आपके पास पाठ दर्ज करने के लिए एक मोड है, और संपादन के लिए एक है। में emacs, आप हमेशा टेक्स्ट मोड में प्रवेश करते हैं, लेकिन मुख्य संयोजनों को दबाकर संपादन किया जाता है (जैसे ^bचरित्र को पीछे की ओर ले जाना)।

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

Https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a के अनुसार :

बेल प्रयोगशालाओं में सॉफ्टवेयर डेवलपर्स द्वारा ksh की लोकप्रिय इनलाइन संपादन सुविधाएँ (vi और emacs मोड) बनाई गईं; पैट सुलिवन द्वारा vi लाइन संपादन मोड, और माइक Veach द्वारा emacs लाइन संपादन मोड। प्रत्येक ने स्वतंत्र रूप से इन विशेषताओं को जोड़ने के लिए बॉर्न शेल को संशोधित किया था, और दोनों ऐसे संगठनों में थे जो केवल ksh का उपयोग करना चाहते थे यदि ksh उनके संबंधित इनलाइन संपादक थे। मूल रूप से ksh में कमांड लाइन एडिटिंग जोड़ने के विचार को इस उम्मीद में खारिज कर दिया गया था कि लाइन एडिटिंग टर्मिनल ड्राइवर में चली जाएगी। हालांकि, जब यह स्पष्ट हो गया कि यह जल्द ही होने की संभावना नहीं थी, दोनों पंक्ति संपादन मोड को ksh में एकीकृत किया गया और वैकल्पिक बनाया गया ताकि वे उन प्रणालियों पर अक्षम हो सकें जो टर्मिनल इंटरफ़ेस के हिस्से के रूप में संपादन प्रदान करते हैं।

इसलिए इसके बजाय, उन्होंने दोनों के बीच चयन करने के लिए उपयोगकर्ताओं और दोनों के लिए एक इंटरफ़ेस लागू किया। ksh80 के दशक की शुरुआत में शायद सबसे पहले (पुन: उपयोग कोड जिसे अलग से vi मोड और बॉर्न शेल के लिए एक emacs मोड को जोड़ने के लिए अलग से लिखा गया था) उसके बाद) tcsh( tcshशुरुआत में केवल emacsकुंजी बंधन viथा , मोड बाद में जोड़ा गया था) और बाद में bashऔर zsh90 के दशक की शुरुआत में।

आप में दो मोड के बीच स्विच bash, zshया kshके साथ set -o viया set -o emacs, और साथ bindkey -eया bindkey -vमें tcshया zsh

POSIX वास्तव में viमोड को निर्दिष्ट करता है न कि emacsमोड के लिए sh(कहानी है कि रिचर्ड स्टालमैन ने POSIX के लिए emacsमोड को निर्दिष्ट करने पर आपत्ति कीsh )।

के लिए डिफ़ॉल्ट मोड bash, ksh(pdksh, mksh, oksh) के सार्वजनिक डोमेन वेरिएंट , tcshऔर zshemacs मोड है (हालांकि zsh, इसके साथ , viअगर यह आपका $EDITORहै vi), जबकि एटी एंड टी में ksh, यह डंबल मोड है जब तक कि $EDITORया $VISUALइसका उल्लेख नहीं है viया emacs

kshबाद gmacsमें गोस्लिंग के उपयोगकर्ताओं को समायोजित करने के लिए एक मोड जोड़ा गया emacsजो Ctrl+Tअलग तरह से संभाला ।

अब या एमएसीएस मोड ^Wमें हैंडलिंग संभवतः टर्मिनल लाइन संपादक में चरित्र को पूर्व निर्धारित करता है , इसलिए हम वास्तव में उन्हें इसके लिए दोषी नहीं ठहरा सकते हैं और "विदा ..." के बारे में मेरे बयान को भ्रामक के रूप में देखा जा सकता है। यह सिर्फ इतना है कि मुझे यह चिड़चिड़ा लगता है जब चीजें पसंद होती हैं , या जब आप टाइप करते हैं तो बाकी सब चीजों से अलग व्यवहार करते हैं । आप अंदाजा लगा सकते हैं कि जब आपको कुछ टाइप करना था तो कुछ एप्लिकेशन ने अपनी विंडो बंद करना शुरू कर दिया था, तो मैंने इसे और अधिक परेशान कर दिया ।emacstcshweraseemacstcshinfoCtrl-WCtrl-W


1
pdkshस्टार्टअप पर मोड के $EDITORलिए viऔर स्विच भी ; मैंने इसे हटा दिया mksh(विशेषकर जैसा कि मैं वास्तव में वैसे भी Emacs मोड को बनाए रखता हूं)।
mirabilos

बहुत बहुत धन्यवाद, विशेष रूप से विभिन्न गोले के व्यवहार और इतिहास की विस्तृत चर्चा के साथ। किसी ऐसे व्यक्ति के रूप में जिसे नियमित रूप से गोले के साथ अलग-अलग विकृतियों में काम करना पड़ता है जिसे मैंने कॉन्फ़िगर नहीं किया, यह असाधारण रूप से मददगार है।
ब्रायनकैन

उत्कृष्ट ऐतिहासिक संदर्भ के लिए धन्यवाद। यह अफ़सोस की बात है कि उस समय टर्मिनल ड्राइवर में अधिक परिष्कृत इनलाइन संपादन सुविधाएँ नहीं जोड़ी गई थीं। रीडलाइन जैसे पुस्तकालयों को शामिल करने के लिए कार्यक्रमों की कोई आवश्यकता नहीं होगी। मैंने यह भी सोचा था कि Emacs- मोड को POSIX द्वारा निर्दिष्ट नहीं किया गया है ताकि राशनले का लिंक दिलचस्प हो। (मैं भी ^Wविंडो बंद करने के साथ आपकी निराशा साझा करता हूं )।
एंथोनी जी -

1
@AnthonyGeoghegan, हमें अभी भी zle / readline जैसी चीजों की आवश्यकता होगी क्योंकि टर्मिनल ड्राइवर में फ़ाइल नाम / कमांड पूरा होने जैसी चीजें वास्तव में नहीं हो सकती हैं।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.