मेरे पास एक बैश फ़ंक्शन है जो मेरे वर्तमान बैश सत्र की निर्देशिका को बदलता है। मैं Alt-M दबाकर फ़ंक्शन को कॉल करना चाहता हूं और इस मैपिंग को बनाने के लिए bind -x का उपयोग कर रहा हूं। मेरे कीबोर्ड पर Alt-M दर्ज करने के बाद, मेरे बैश प्रॉम्प्ट में कुछ भी नहीं होता है - कोई नई लाइन नहीं है क्योंकि यदि कोई फ़ंक्शन टाइप किया जाता है और फिर एंटर दबाया जाता है। नई लाइन पर नया प्रॉम्प्ट प्राप्त करने के लिए मुझे फिर से एंटर दबाना होगा।

मैं एक नई लाइन पर एक नया संकेत होने के लिए कैसे मजबूर कर सकता हूं? अगर मैं सीधे/सामान्य रूप से फ़ंक्शन को कॉल करता हूं (यानी foo टाइप करके और फिर एंटर दबाकर), कमांड अपेक्षित काम करेगा और एक नई लाइन पर एक ताज़ा PS1 के साथ एक बैश प्रॉम्प्ट होगा।

फ़ंक्शन में echo या printf कमांड का उपयोग करना काम नहीं करता है - यह एक नई लाइन प्रिंट करता है, लेकिन बैश प्रॉम्प्ट के ऊपर, और बैश प्रॉम्प्ट रीफ्रेश नहीं होता है। यहाँ वास्तव में क्या नहीं हो रहा है जो मैं होना चाहता हूँ?

foo(){
    dir="/some/path"
    cd $dir
}

bind -x '"\em": foo'
0
lsimmons 17 मार्च 2021, 03:34
मुझे संदेह है कि : वर्ण की अनुमति नहीं है - help bind -x keyseq:shell-command कहता है।
 – 
l0b0
17 मार्च 2021, 05:03
मुझे नहीं लगता कि यह संभव है। प्रॉम्प्ट उपयोगकर्ता द्वारा कमांड इनपुट करने की प्रतीक्षा कर रहा है। जब तक ENTER दबाया नहीं जाता तब तक यह पुन: संकेत नहीं देगा।
 – 
pynexj
17 मार्च 2021, 05:05

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप शेल फ़ंक्शन के बजाय मैक्रो का उपयोग करते हैं, तो आप रिटर्न कीप्रेस इंजेक्ट कर सकते हैं:

bind '"\em": "\C-ex\C-u foo\C-m\C-y\C-b\C-d"'
  • \C-e पंक्ति के अंत में चला जाता है
  • x यह सुनिश्चित करने के लिए कुछ जोड़ता है कि लाइन खाली नहीं है
  • \C-u लाइन को हटाता है और किल रिंग में सहेजता है
  • foo कमांड है - प्रमुख स्थान इसे इतिहास में जोड़ना बंद कर देता है (यह मानते हुए HISTCONTROL=ignorespace)
  • \C-m रिटर्न कीप्रेस इंजेक्ट करता है
  • \C-y मूल पंक्ति को पुनर्स्थापित करता है
  • \C-b\C-d हमारे द्वारा जोड़े गए बाहरी x को हटा देता है

मैं नहीं जानता कि कर्सर को उसकी मूल स्थिति में वापस कैसे ले जाया जाए यदि वह पंक्ति के अंत में नहीं था। साथ ही किल रिंग भी प्रदूषित हो जाती है।

1
jhnc 17 मार्च 2021, 06:54