बाश में, मैं एक कमांड के लिए फ़ंक्शन कुंजी कैसे बांधता हूं?


91

उदाहरण: मैं F12कमांड की कुंजी को इस echo "foobar"तरह से बांधना चाहता हूं कि हर बार जब मैं F12"फोबार" संदेश को स्क्रीन पर प्रिंट करूंगा। आदर्श रूप में यह किसी भी मनमाने ढंग से शेल कमांड हो सकता है, न कि केवल बिल्डिंस। इस बारे में कोई कैसे जाता है?

जवाबों:


163

आप एक कुंजी द्वारा उत्सर्जित वर्ण अनुक्रम को निर्धारित कर सकते हैं 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इस मामले में) कोई भी निष्पादन योग्य हो सकता है - एक कार्यक्रम, स्क्रिप्ट या फ़ंक्शन।


2
क्या होगा अगर मैं "ctrl + q" के लिए एक बाध्यकारी जोड़ना चाहता हूं?
कुबुडी

5
@kubudi: bind '"\C-q": menu-complete'उदाहरण के लिए (या अपने ~/.inputrc: "\C-q": menu-complete)। आपको प्रवाह नियंत्रण को अक्षम करने और ^ S और ^ Q उपलब्ध कराने के लिए भी stty -ixonआपकी आवश्यकता हो सकती ~/.bashrcहै।
अगली सूचना तक रोक दिया गया।

आप कहते हैं कि ^[प्रतिनिधित्व करता है escऔर फिर आप इसे \eअपने उदाहरण में स्थानापन्न करते हैं। क्या आप बता सकते हैं कि कृपया क्यों?
रिमूवर

1
@ रिमूवर: ^[आउटपुट प्रतिनिधित्व है। \e(एक तरह से यह दर्ज करने के लिए है ^[कि के लिए काम नहीं करता है)।
अगली सूचना तक रोक दिया गया।

मैं "\ Cz" कैसे बांध सकता हूं? मैं कुछ पाने के लिए प्यार करता हूँ जैसे कि zsh के लिए sheerun.net/2014/03/03/21/how-to-boost-your-vim-productivity
21

19

आप में bash कुंजी बाइंडिंग को परिभाषित कर सकते हैं ~/.inputrc(GNU Readline लाइब्रेरी के लिए कॉन्फ़िगरेशन फ़ाइल)। वाक्य-विन्यास है

<किसमिस या कुंजी नाम>: मैक्रो

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

Control-o: "> output"

जब आप दबाते हैं तो एक मैक्रो बनाता है जो "> आउटपुट" सम्मिलित करता है ControlO

 "\e[11~": "echo foobar"

जब आप दबाते हैं तो एक मैक्रो बनाएगा, जो "इको फोब्बर" सम्मिलित करता है F1 ... मुझे नहीं पता कि इसके लिए क्या कीमिया F11है।

संपादित करें:

.inputrc\nलाइनफीड के लिए भागने के क्रम को समझता है , इसलिए आप उपयोग कर सकते हैं

 "\e[11~": "echo foobar\n"

जो आदेश जारी होने के बाद प्रभावी ढंग से 'प्रेस एंट्री' होगा।


4
आप एक मैक्रो के भीतर "\ n" का उपयोग कर सकते हैं, एक नया वर्ण जोड़ने के लिए:
बार्टन चित्तेंडेन

यह मेरे लिए बेहतर काम करता है क्योंकि यह टर्मिनल खोलने पर मुख्य मानचित्रण को परिभाषित करता है।
हेल्ड्रैग सेप

के लिए Alt, उपयोग \e, जैसे "\eo": "> output";
जानिस एल्मरिस

एक अधिक गहराई के प्रयोग पर ट्यूटोरियल के लिए .inputrcदेखने hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
जोश Habdas

1
@ArthurHenriqueDellaFraga मैंने उत्तर संपादित कर लिया है; यह आपके होम डायरेक्टरी में होगा। यदि यह मौजूद नहीं है, तो आप इसे बना सकते हैं।
बार्टन चित्तेंडेन

7

यह समाधान X11 वातावरण के लिए विशिष्ट है और इसका बैश से कोई लेना-देना नहीं है, लेकिन निम्नलिखित को अपने .Xmodmaps में जोड़ दें

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

टर्मिनल F12 को मारने पर स्ट्रिंग "फोब्बर" को टर्मिनल पर भेज देगा।


ध्यान रखें कि यह शेल कमांड चलाने के समान नहीं है। यदि आप वास्तव में एक कमांड चलाना चाहते हैं, तो आपको एंटर मारना होगा (या आपके लिए भेजे गए स्ट्रिंग को भेजना होगा)। संभवत: पहले भी सुरक्षित और स्पष्ट होना चाहते थे।
Cascabel

2
यह भयानक होगा, लेकिन यह फेडोरा 20 के रूप में वैसे भी काम नहीं करता है। मैंने पहले भी F12 के लिए उचित कीकोड (मेरे मामले में, 96) को खोजने के लिए और 88 के बजाय इसका उपयोग करने के लिए xev का उपयोग करने की कोशिश की। न तो कोई काम करता है।
BobDoolittle

2

मैं Ctrl+Bएक आज्ञा से बंधना चाहता था । ऊपर दिए गए एक उत्तर से प्रेरित होकर, मैंने उपयोग करने की कोशिश की, bindलेकिन यह पता नहीं लगा सका कि क्रिप्टोकरंसी ( \e[24~?) की किस श्रृंखला का अनुवाद करना है Ctrl+B

एक मैक पर, टर्मिनल ऐप की सेटिंग में जाएं, प्रोफाइल -> कीबोर्ड -> +फिर कीबोर्ड शॉर्टकट दबाएं जिसके बाद आप हैं और यह बाहर आता है। मेरे लिए Ctrl+Bजिसके परिणामस्वरूप \002मैं सफलतापूर्वक कमांड के लिए बाध्य था

bind '"\002":"echo command"'

इसके अलावा, यदि आप चाहते हैं कि कमांड को तुरंत निष्पादित किया जाए (न कि केवल प्रॉम्प्ट में डाला जाए), तो आप अपने कमांड के अंत में एंटर को जोड़ सकते हैं, जैसे:

bind '"\002":"echo command\015"'

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