UNIX में शेल कमांड्स को संपादित करने के लिए VI कुंजियों का उपयोग करना


28

मेरे पास एक सहकर्मी था जो वास्तव में UNIX में अच्छा था।

उसने मुझे दिखाया कि कैसे अपने शेल कमांड्स को एडिट करने के लिए Vi की बाइंडिंग का इस्तेमाल किया जाए।

उन्होंने हर बार मेरे लॉग इन करने पर कमांड को एक फाइल में रखा।

तब से, मैं एक अलग परियोजना में चला गया हूँ।

दुर्भाग्य से मुझे याद नहीं है कि इसे कैसे स्थापित किया जाए।

क्या यहाँ कोई है जो जानता है कि टर्मिनल में कमांड को संपादित करने के लिए वीआई कुंजी बाइंडिंग का उपयोग कैसे किया जाता है?

मैं उस सेटिंग को स्थायी कैसे बना सकता हूं?

जवाबों:


31

आप सबसे बड़ी विशेषता के बारे में बात कर रहे हैं!

आप इसे अपनी .bashrcफ़ाइल में जोड़कर शेल कमांड (और कमांड इतिहास) को संपादित करने के लिए vi कमांड्स का उपयोग कर सकते हैं :

set -o vi

आप केवल अपने वर्तमान सत्र को प्रभावित करने के लिए कमांड लाइन से उस कमांड को चला सकते हैं।

यदि आप बैश का उपयोग नहीं करते हैं, तो अपने शेल के लिए उपयुक्त आरसी फ़ाइल को प्रतिस्थापित करें।


यह आपको किसी भी कमांड को संपादित करने के लिए vi कमांड का उपयोग करने की अनुमति देता है ...

आप अपने इतिहास के माध्यम से (दबाने के बाद ) भी उपयोग jऔर kस्थानांतरित कर सकते हैं ESC

आप पुरानी कमांड्स को खोजने के लिए /(हिट ESCकरने के बाद ) भी उपयोग कर सकते हैं ।

दूसरे शब्दों में, उस सुपर-लॉन्ग cpकमांड को खोजने के लिए जिसे आपने दस मिनट पहले किया था:

ESC/cpENTER

तो फिर तुम साथ अपने इतिहास में सभी मिलान आदेशों के माध्यम से चक्र कर सकते हैं nऔर N

यह सब मुझे कमांड लाइन पर 10 ट्रिलियन गुना अधिक उत्पादक बनाता है!


4
खैर, यह वास्तव में vi का उपयोग नहीं कर रहा है, यह लाइन संपादन के लिए vi-style कीबोर्ड कमांड का उपयोग कर रहा है।

4
ज़रूर ... मुझे लगता है कि उपयुक्त शब्दावली यह है कि vi bindings in the shellअब तक की सबसे बड़ी विशेषता है!
जहारॉय

अगर मोड को प्रदर्शित करने का कोई तरीका होता तो मैं एमएसी बाइंडिंग से वी बाइंडिंग पर स्विच करता। क्या आप ऐसा करने का एक तरीका जानते हैं?
आइकनोकॉस्ट

वे, वहाँ के jjसाथ बाँधने का एक तरीका है ESCजैसा कि हम आमतौर पर विम में करते हैं?
स्टीवेयांग

@yangchenyun - हो सकता है कि यह प्रश्न उस के साथ मदद करेगा: stackoverflow.com/questions/844862/… मैं व्यक्तिगत रूप से किसी भी आदेश को नहीं बाँधता / बदल देता हूँ, इसलिए मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं।
जहारॉय

12

यदि आप बैश का उपयोग कर रहे हैं, जैसा कि जहरॉय और बुराई ओटो ने पहले ही उत्तर दिया है, तो आप उपयोग कर सकते हैं

set -o vi

vi- शैली संपादन आदेशों का उपयोग करने के लिए बैश का कारण बनें।

एक बार जब आप ऐसा कर लेते हैं, तो आप Esc vvi संपादक को वर्तमान कमांड लाइन की एक कॉपी वाली अस्थायी फ़ाइल के साथ लॉन्च करने के लिए टाइप कर सकते हैं । आप कमांड को संपादित कर सकते हैं, यहां तक ​​कि इसे कई लाइनों के साथ बदल सकते हैं; जब आप फ़ाइल को सहेजते हैं ( :wq), शेल संपादित कमांड को निष्पादित करेगा।

आप चाहें तो

set -o emacs

आप Ctl-XCtl-Eएक ही काम करने के लिए उपयोग कर सकते हैं । यह आपके पसंदीदा संपादक का उपयोग करेगा $EDITOR, जरूरी नहीं कि यह खाली हो।

(व्यक्तिगत रूप से, मैं अपने अधिकांश संपादन के लिए vi (वास्तव में विम) का उपयोग करता हूं, लेकिन मैं set -o emacsशेल में पसंद करता हूं, सम्मिलित मोड में स्विच करना और संपादन फ़ाइलों के लिए बहुत अच्छा है, लेकिन इंटरैक्टिव कमांड्स के लिए अजीब है। YMMV।)


क्या आपको पता है कि vi-style से बचने के लिए सामान्य संपादन मोड में वापस लौटने का तरीका क्या है? मुझे याद है कि ब्लम नॉम के साथ सफल होना, लेकिन अब और नहीं; मुझे किसकी याद आ रही है?
पियोटनी

@ पियर्टोनी: set -o emacsआप जो चाहते हैं वह नहीं करते हैं?
कीथ थॉम्पसन

हाँ, यह काम करता है, मैं इस बिंदु को याद किया, धन्यवाद
भेदी 8

10

आप set -o viअपनी लाइन एडिटिंग कमांड्स को @jahroy पोस्ट करने के लिए बदल सकते हैं , लेकिन आप fcकमांड के बारे में सोच सकते हैं (bash में उपलब्ध है और मुझे लगता है कि ksh, लेकिन शायद tcsh नहीं), जो पिछले कमांड को एडिटर (FCEDIT / EDITOR) में डाल देगा। , जो आपने शायद vi पर सेट किया है) और जब आप संपादक से बाहर निकलते हैं, तो कमांड निष्पादित करते हैं। मैनपेज देखें या help fcविवरण के लिए, या बस इसे आज़माएँ।


5
alias r='fc -e -'पिछले आदेशों को पुन: चलाने के लिए एक मूल्यवान उपनाम है। fcकोर्न शेल में उत्पन्न हुआ, मुझे विश्वास है। आप fc 123 129संख्याओं को कमांड द्वारा निर्दिष्ट कर सकते हैं ( कमांड संख्या को संपादित करने के लिए इतिहास में 123 से 129)। आप सापेक्ष संख्या निर्दिष्ट कर सकते हैं ( fc -10 -1दर्ज किए गए अंतिम 10 आदेशों को संपादित करने के लिए)। आप के साथ पिछले आदेशों को सूचीबद्ध कर सकते हैं fc -l। आप rउपनाम के साथ उपसर्ग द्वारा एक कमांड निर्दिष्ट कर सकते हैं ( r makeअंतिम आह्वान चलाता है make; ऐसा इसलिए करता है r mयदि mvआपने पिछले भाग के बाद से कमांड नहीं चलाया है make, आदि)।
जोनाथन लेफलर

6

सबसे हाल ही में उपयोग की गई कमांड को vim में एडिट करने के लिए और एडिटर के सेव होने और बाहर निकलने के बाद एडिट किए गए वर्जन को इनवॉइस करने के लिए, fcशेल बिल्ट-इन का उपयोग करें । बिना किसी तर्क के यह निम्नलिखित कार्य करेगा:

  1. एक अस्थायी फ़ाइल बनाता है /tmpऔर इसे सबसे हाल ही में टाइप की गई कमांड के साथ पॉप्युलेट करता है
  2. संपादक द्वारा सामान्य रूप से बाहर निकलने के बाद (निकास कोड 0 के साथ) यह उस अस्थायी फ़ाइल में पाई गई कमांड को निष्पादित करता है और इस फ़ाइल को हटा देता है। संपादित संस्करण को एक सामान्य कमांड (कम से कम zsh में) के रूप में इतिहास में सहेजा गया है। यह कुछ भी निष्पादित नहीं करता है अगर संपादक कोड अन्य के साथ बाहर निकलता है तो शून्य (यह विम में इसे मारने या उपयोग करके प्राप्त किया जा सकता है :cquit)।

कमांड बाश और zsh दोनों में काम करता है।


5

वास्तव में, यह वास्तव में अब तक की सबसे बड़ी विशेषता है। हालांकि अधिक है:

नाम से एक फ़ाइल बनाएँ

.editrc

लाइन युक्त

bind -v

एडिटलाइन , एक बीएसडी लाइसेंस प्राप्त संस्करण पुस्तकालय है जो रीडलाइन जैसी सेवाएं प्रदान करता है। वह .editrc आपके Keybindings को MySQL के कमांड लाइन शेल, या किसी भी एप्लिकेशन में रीडलाइन का उपयोग नहीं करने के लिए सेट करेगा।

मैं वर्षों के बीतने के साथ कुछ हद तक भुलक्कड़ हो गया हूं, इसलिए मेरे .zshrc सूत्रों ने vi मोड के लिए कुछ रैपर दिए हैं , मुझे यह दिखाने के लिए कि मैं कमांड लाइन पर किस मोड में हूं। यह अच्छा है।

मुझे पता है zsh में आप टाइप कर सकते हैं

bindkey -L

और कीबाइंडिंग की सूची प्राप्त करें। मुझे यकीन है कि बैश में भी कुछ ऐसा ही होना चाहिए। Vi कुंजी के सभी डिफ़ॉल्ट रूप से बाध्य नहीं हैं। उन्हें बांधें कि आप कैसे फिट दिखते हैं और आप दौड़ से दूर हैं।


काश मैं इस 5 बार MySQL में vi बाइंडिंग के लिए upvote कर सकता!
जहारॉय

1

अपने टर्मिनल, प्रकार में export EDITOR=vi

इस सेटिंग को बचाने के लिए। इस लाइन को फाइल में डालें ~ / .profile


5
यह आपके डिफ़ॉल्ट संपादक (आदेशों पर ध्यान देने के लिए $EDITOR) को सेट करता है vi। यह आपको शेल कमांड viको कम से कम (सीधे नहीं) संपादित करने नहीं देता है।
कीथ थॉम्पसन

2
@KeithThompson Zsh $EDITORमें यदि संपादन हो तो vi संपादन मोड में चूक जाता है vi। मुझे लगता है कि यह एकमात्र शेल है जो ऐसा करता है।
गिलेस एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.