2010-11-17 19 views
76

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

उत्तर

116

आप Ctrl दबाकर चरित्र अनुक्रम एक प्रमुख द्वारा उत्सर्जित निर्धारित कर सकते हैं -। के लिए F12 आदेश पंक्ति पर वी, तो कुंजी में आपकी रुचि है दबाने अपने सिस्टम पर, मैं ^[[24~ मिलता है। ^[एएससी का प्रतिनिधित्व करता है। विभिन्न प्रकार के टर्मिनलों या टर्मिनल अनुकरणकर्ता एक ही कुंजी के लिए अलग-अलग कोड उत्सर्जित कर सकते हैं।

एक बैश पर संकेत आप इसे बाहर की कोशिश कर सकते कुंजी मैक्रो सक्षम करने के लिए इस तरह एक आदेश डाल सकते हैं।

bind '"\e[24~":"foobar"' 

अब, जब आप प्रेस F12, आप कमांड लाइन आगे संपादन के लिए तैयार पर "foobar" मिल जाएगा। आप तुरंत एक आदेश में प्रवेश के लिए एक कीस्ट्रोक चाहता था, तो आप एक नई पंक्ति जोड़ सकते हैं: अब

bind '"\e[24~":"pwd\n"' 

जब आप प्रेस F12, आप प्रेस करने दर्ज किए बिना वर्तमान निर्देशिका प्रदर्शित किया मिलेगा। क्या होगा यदि आप पहले से ही लाइन पर कुछ टाइप कर चुके हैं और आप इसका उपयोग स्वचालित रूप से निष्पादित करते हैं? यह गन्दा हो सकता है। हालांकि, अगर आप अपने मैक्रो के हिस्से के रूप रेखा को स्पष्ट कर सकते हैं:

bind '"\e[24~":"\C-k \C-upwd\n"' 

अंतरिक्ष यकीन Ctrl कि बनाता है - यू रिंग करने से घंटी रखने के लिए नष्ट करने के लिए कुछ है।

एक बार जब आप मैक्रो जिस तरह से आप चाहते हैं काम कर मिल गया है, आप इसे अपने ~/.inputrc फ़ाइल में जोड़कर लगातार बना सकते हैं।bind आदेश या एकल उद्धरण के बाहरी सेट के लिए कोई ज़रूरत नहीं है:

"\e[24~":"\C-k \C-upwd\n" 

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

तुम भी एक महत्वपूर्ण बाध्यकारी है कि मौजूदा आदेश पंक्ति को परेशान किए बिना कुछ निष्पादित करेंगे बना सकते हैं।

bind -x '"\eW":"who"' 

तब जब आप एक आदेश है कि उदाहरण के लिए एक उपयोगकर्ता नाम की आवश्यकता है, टाइप कर रहे हैं, और आप उपयोगकर्ता के नाम जो लॉग इन होने के पता करने की जरूरत है, तो आप भी दबा सकते हैं Alt - शिफ्ट - डब्ल्यू और who का आउटपुट प्रदर्शित किया जाएगा और प्रॉम्प्ट को आपके आंशिक कमांड बरकरार और कर्सर को लाइन में उसी स्थिति में फिर से जारी किया जाएगा।

दुर्भाग्यवश, यह F12 जैसी चाबियों के लिए ठीक से काम नहीं करता है जो दो से अधिक वर्णों का उत्पादन करता है। कुछ मामलों में इसे चारों ओर काम किया जा सकता है।

कमांड (who इस मामले में) कोई निष्पादन योग्य - एक प्रोग्राम, स्क्रिप्ट या फ़ंक्शन हो सकता है।

+2

क्या होगा यदि मैं "ctrl + q" में बाध्यकारी जोड़ना चाहता हूं? – kubudi

+5

@ कुबड़ी: 'बाइंड' '\ C-q ": मेनू-पूर्ण' उदाहरण के लिए (या आपके' ~/.inputrc': '" \ C-q ": मेनू-पूर्ण' में)। प्रवाह नियंत्रण को अक्षम करने और^एस और^क्यू उपलब्ध कराने के लिए आपको अपने '~/.bashrc' में' stty -ixon' की भी आवश्यकता हो सकती है। –

+0

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

6

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

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

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

+0

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

+0

यह बहुत ही अच्छा होगा, लेकिन ऐसा लगता है कि यह फेडोरा 20 के रूप में काम नहीं करता है। मैंने एफ 12 के लिए पहले (मेरे मामले में, 9 6) के लिए उचित कुंजीकोड खोजने के लिए xev का उपयोग करने का प्रयास किया और 88 के बजाय इसका उपयोग किया। कोई भी काम नहीं करता है। – BobDoolittle

11

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

उदाहरण के लिए

: वाक्य रचना

< keysym या कुंजी नाम > है

Control-o: "> output" 

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

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

होगा जब आप F1 दबाते हैं तो एक मैक्रो बनाएं जो "echo foobar" डालें ... मुझे नहीं पता कि F11 के लिए keyym क्या है।

+0

अच्छा, लेकिन यह सिर्फ "सम्मिलित" है, सही? –

+3

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

+0

यह मेरे लिए बेहतर काम करता है क्योंकि यह टर्मिनल खोलने पर कुंजी मैपिंग को परिभाषित करता है। – Heldraug

संबंधित मुद्दे