उदाहरण: मैं F12कमांड की कुंजी को इस echo "foobar"तरह से बांधना चाहता हूं कि हर बार जब मैं F12"फोबार" संदेश को स्क्रीन पर प्रिंट करूंगा। आदर्श रूप में यह किसी भी मनमाने ढंग से शेल कमांड हो सकता है, न कि केवल बिल्डिंस। इस बारे में कोई कैसे जाता है?
जवाबों:
आप एक कुंजी द्वारा उत्सर्जित वर्ण अनुक्रम को निर्धारित कर सकते हैं Ctrl- vकमांड लाइन पर, फिर उस कुंजी को दबाएं जिसमें आप रुचि रखते हैं। मेरे सिस्टम पर F12, मुझे मिलता है ^[[24~। का ^[प्रतिनिधित्व करता है Esc। विभिन्न प्रकार के टर्मिनल या टर्मिनल एमुलेटर एक ही कुंजी के लिए अलग-अलग कोड का उत्सर्जन कर सकते हैं।
बैश प्रॉम्प्ट पर आप कुंजी मैक्रो को सक्षम करने के लिए इस तरह से एक कमांड दर्ज कर सकते हैं ताकि आप इसे आज़मा सकें।
bind '"\e[24~":"foobar"'
अब, जब आप दबाते हैं F12, तो आपको आगे के संपादन के लिए तैयार कमांड लाइन पर "फोब्बर" मिलेगा। यदि आप तुरंत एक कमांड दर्ज करने के लिए कीस्ट्रोक चाहते थे, तो आप एक नई पंक्ति जोड़ सकते हैं:
bind '"\e[24~":"pwd\n"'
अब जब आप दबाते हैं F12, तो आपको प्रेस किए बिना वर्तमान निर्देशिका प्रदर्शित होगी Enter। क्या होगा अगर आपने पहले से ही लाइन पर कुछ टाइप किया है और आप इसका उपयोग करते हैं जो स्वचालित रूप से निष्पादित होता है? यह गड़बड़ हो सकता है। हालाँकि, आप अपने मैक्रो के भाग के रूप में लाइन को साफ़ कर सकते हैं:
bind '"\e[24~":"\C-k \C-upwd\n"'
यह सुनिश्चित करता है कि घंटी बजने से रोकने के लिए Ctrl- uकुछ को हटाना है।
एक बार जब आप अपने इच्छित तरीके से काम करने वाले मैक्रो को प्राप्त कर लेते हैं, तो आप इसे अपनी ~/.inputrcफ़ाइल में जोड़कर इसे लगातार बना सकते हैं । bindकमांड या सिंगल कोट्स के बाहरी सेट की कोई आवश्यकता नहीं है :
"\e[24~":"\C-k \C-upwd\n"
संपादित करें:
आप एक कुंजी बाइंडिंग भी बना सकते हैं जो वर्तमान कमांड लाइन को परेशान किए बिना कुछ निष्पादित करेगा।
bind -x '"\eW":"who"'
तब जब आप एक कमांड टाइप कर रहे होते हैं, जिसके लिए एक उपयोगकर्ता नाम की आवश्यकता होती है, उदाहरण के लिए, और आपको उस उपयोगकर्ता के नाम को जानना होगा जो लॉग इन हैं, आप दबा सकते हैं Alt- Shift- Wऔर आउटपुट whoप्रदर्शित किया जाएगा और फिर से जारी किया जाएगा अपने आंशिक कमांड अक्षुण्ण और कर्सर को लाइन में उसी स्थिति में रखें।
दुर्भाग्य से, यह कुंजियों के लिए ठीक से काम नहीं करता है जैसे कि F12दो वर्णों से अधिक आउटपुट। कुछ मामलों में इसके आसपास काम किया जा सकता है।
कमांड ( whoइस मामले में) कोई भी निष्पादन योग्य हो सकता है - एक कार्यक्रम, स्क्रिप्ट या फ़ंक्शन।
bind '"\C-q": menu-complete'उदाहरण के लिए (या अपने ~/.inputrc: "\C-q": menu-complete)। आपको प्रवाह नियंत्रण को अक्षम करने और ^ S और ^ Q उपलब्ध कराने के लिए भी stty -ixonआपकी आवश्यकता हो सकती ~/.bashrcहै।
^[प्रतिनिधित्व करता है escऔर फिर आप इसे \eअपने उदाहरण में स्थानापन्न करते हैं। क्या आप बता सकते हैं कि कृपया क्यों?
^[आउटपुट प्रतिनिधित्व है। \e(एक तरह से यह दर्ज करने के लिए है ^[कि के लिए काम नहीं करता है)।
आप में bash कुंजी बाइंडिंग को परिभाषित कर सकते हैं ~/.inputrc(GNU Readline लाइब्रेरी के लिए कॉन्फ़िगरेशन फ़ाइल)। वाक्य-विन्यास है
<किसमिस या कुंजी नाम>: मैक्रो
उदाहरण के लिए:
Control-o: "> output"
जब आप दबाते हैं तो एक मैक्रो बनाता है जो "> आउटपुट" सम्मिलित करता है ControlO
"\e[11~": "echo foobar"
जब आप दबाते हैं तो एक मैक्रो बनाएगा, जो "इको फोब्बर" सम्मिलित करता है F1 ... मुझे नहीं पता कि इसके लिए क्या कीमिया F11है।
संपादित करें:
.inputrc\nलाइनफीड के लिए भागने के क्रम को समझता है , इसलिए आप उपयोग कर सकते हैं
"\e[11~": "echo foobar\n"
जो आदेश जारी होने के बाद प्रभावी ढंग से 'प्रेस एंट्री' होगा।
Alt, उपयोग \e, जैसे "\eo": "> output";
.inputrcदेखने hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
यह समाधान X11 वातावरण के लिए विशिष्ट है और इसका बैश से कोई लेना-देना नहीं है, लेकिन निम्नलिखित को अपने .Xmodmaps में जोड़ दें
% loadkeys
keycode 88 = F12
string F12 = "foobar"
%
टर्मिनल F12 को मारने पर स्ट्रिंग "फोब्बर" को टर्मिनल पर भेज देगा।
मैं Ctrl+Bएक आज्ञा से बंधना चाहता था । ऊपर दिए गए एक उत्तर से प्रेरित होकर, मैंने उपयोग करने की कोशिश की, bindलेकिन यह पता नहीं लगा सका कि क्रिप्टोकरंसी ( \e[24~?) की किस श्रृंखला का अनुवाद करना है Ctrl+B।
एक मैक पर, टर्मिनल ऐप की सेटिंग में जाएं, प्रोफाइल -> कीबोर्ड -> +फिर कीबोर्ड शॉर्टकट दबाएं जिसके बाद आप हैं और यह बाहर आता है। मेरे लिए Ctrl+Bजिसके परिणामस्वरूप \002मैं सफलतापूर्वक कमांड के लिए बाध्य था
bind '"\002":"echo command"'
इसके अलावा, यदि आप चाहते हैं कि कमांड को तुरंत निष्पादित किया जाए (न कि केवल प्रॉम्प्ट में डाला जाए), तो आप अपने कमांड के अंत में एंटर को जोड़ सकते हैं, जैसे:
bind '"\002":"echo command\015"'