Ctrl-Backspace और Ctrl-bash में हटाएँ


14

Debian 8.3 पर डाल रहा है

stty werase '^H'

या आर्क लिनक्स 2/2016 पर

stty werase '^?'

in .bashrc(उदाहरण के लिए) बनाता है Ctrl- Backspaceटर्मिनल में अंतिम शब्द हटाएं। फिर भी यह आधुनिक जीयूआई अनुप्रयोगों (जैसे फ़ायरफ़ॉक्स) के समान ही व्यवहार नहीं है: यह पिछले हटाता खाली स्थान के -separated शब्द, और नहीं अंतिम शब्द खाली स्थान के द्वारा अलग या जैसे पात्रों . : , ; " ' & / ( )

इसे बनाने के लिए संभव है Ctrl- Backspaceआधुनिक जीयूआई अनुप्रयोगों के लिए टर्मिनल समान व्यवहार करते? इसके अलावा, वहाँ बनाने के लिए किसी भी तरह से है Ctrl- Deleteकर्सर से ठीक पहले शब्द हटाना चाहते हैं?


1
आपका शेल उन कार्यों का समर्थन कर सकता है, जो किसी दिए गए कुंजी के लिए बाध्य हो सकते हैं।
थॉमस डिकी

@ThomasDickey: मैं बैश का उपयोग कर रहा हूं। यह ठीक है अगर यह बस में काम करता है।
भेड़िया-रेवो-बिल्लियों

जवाबों:


27

यहाँ पर दो लाइन संपादक हैं: कर्नेल (कैनोनिकल मोड ट्टी लाइन एडिटर) द्वारा प्रदान की गई बुनियादी लाइन संपादक, और बैश लाइन संपादक (रीडलाइन लाइब्रेरी के माध्यम से कार्यान्वित)। इन दोनों में इरेज़-टू-पिछला-वर्ड कमांड है, जो डिफ़ॉल्ट रूप से Ctrl+ के लिए बाध्य है W। कुंजी को विहित विधा के लिए कॉन्फ़िगर किया जा सकता है tty लाइन संपादक stty werase; बैश कुंजी बंधन की नकल करता है जिसे वह तब तक सेटिंग में पाता है जब तक कि उसके अपने कॉन्फ़िगरेशन में ओवरराइड नहीं किया जाता है।

weraseTty लाइन संपादक में कार्रवाई कॉन्फ़िगर नहीं किया जा सकता है। यह हमेशा (ASCII) व्हाट्सएप-सीमांकित शब्दों को मिटा देता है। यह tty लाइन संपादक के साथ बातचीत करने के लिए दुर्लभ है - जब आप catबिना किसी तर्क के टाइप करते हैं तो यह आपको मिलता है। यदि आप वहां फैंसी कुंजी बाइंडिंग चाहते हैं, तो आप कमांड को rlwrap जैसे टूल के तहत चला सकते हैं जो रीडलाइन का उपयोग करता है।

बैश पिछले शब्द को हटाने के लिए दो कमांड प्रदान करता है : unix-word-rubout( Ctrl+ wया के माध्यम से सेट stty werase), और backward-kill-word( M-DELयानी, Esc Backspace) जो शब्द को वर्तमान स्थान में अल्फ़ान्यूमेरिक वर्णों के अनुक्रम के रूप में मानता है_ । यदि आप चाहते हैं Ctrl+ Backspaceअक्षरांकीय अक्षर के पिछले अनुक्रम को मिटाने के लिए, निर्धारित नहीं करते हैं stty werase, बल्कि आपका में निम्नलिखित लाइन डाल .inputrc:

"\C-h": backward-kill-word

नोट इस मानता है कि अपने टर्मिनल के लिए Ctrl + H चरित्र भेजता है Ctrl+ Backspace। दुर्भाग्य से यह बिना मानक बाइंडिंग वाली उन कुंजियों Backspaceमें से एक है (और विशेष रूप से ऐतिहासिक कारणों के लिए एक गड़बड़ है)।

एक सममित कमांड भी है kill-wordजो डिफ़ॉल्ट रूप से M-d( Alt+ D) के लिए बाध्य है । इसे Ctrl+ से बाँधने के लिए Delete, आपको सबसे पहले यह पता लगाना होगा कि आपका टर्मिनल किस एस्केप सीक्वेंस को भेजता है, फिर अपने में एक संबंधित लाइन जोड़ें .inputrc। टाइप Ctrl+ Vतब Ctrl+ Delete; यह कुछ ऐसा सम्मिलित करेगा ^[[3;5~जहां प्रारंभिक ^[भागने के चरित्र का एक दृश्य प्रतिनिधित्व है। फिर बंधन है

"\e[3;5~": kill-word

यदि आप किसी शब्द की परिभाषा से खुश नहीं हैं, तो आप अपना स्वयं का प्रदान कर सकते हैं: bash में emacs- शैली कीबाइंडिंग का भ्रामक व्यवहार देखें


2
उत्कृष्ट व्याख्या! Ctrl+Delअच्छी तरह से काम किया। हालाँकि, मुझे Ctrl+Backspaceकाम नहीं मिल रहा है । के लिए Ctrl+v, Ctrl+Backspaceमेरी टर्मिनल कहते हैं ^?। मुझे क्या करना चाहिए .inputrc? धन्यवाद
सिपरियन Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordया जो भी रीडलाइन फ़ंक्शन आप चाहते हैं। लेकिन आप केवल Ctrl + बैकस्पेस के लिए एक बंधन को परिभाषित कर सकते हैं जो कि बैकस्पेस के लिए बाइंडिंग से अलग है यदि वे अलग-अलग वर्ण भेजते हैं। यदि आपका टर्मिनल ^?बैकस्पेस और Ctrl + बैकस्पेस दोनों के लिए भेजता है , तो टर्मिनल में चल रहे एप्लिकेशन के पास उन्हें अलग करने का कोई तरीका नहीं है। कुछ टर्मिनलों को कॉन्फ़िगर किया जा सकता है (जैसे xterm, urxvt), अन्य (जैसे VTE- आधारित टर्मिनल एमुलेटर) नहीं कर सकते हैं।
गिल्स एसओ- बुराई को रोकना '

4
यह ध्यान रखना महत्वपूर्ण है कि ~/.inputrcडिफ़ॉल्ट को परिभाषित करना अक्षम है /etc/inputrc। इसे ठीक करने के लिए आपको उस फ़ाइल को शामिल करना होगा: $include /etc/inputrc( यहाँ से )
सिप्रियन टोमोयाग

एस्क + बैकस्पेस के लिए +1
सेलाल एर्गन

7

प्रयत्न

alt+backspace

प्राथमिक OS में यह आपके इच्छित तरीके की तरह काम करता है (जैसे ctrl+ backspace)


1

पकाया मोड टर्मिनल प्रसंस्करण में WERASE चरित्र के व्यवहार है hardcoded लिनक्स में कम से कम,:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

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

रीडलाइन का संस्करण (बैश और अन्य द्वारा प्रयुक्त) कर्नेल के संस्करण की तुलना में थोड़ा अलग लगता है, लेकिन यह हार्डकोड भी लगता है :

शब्द अक्षरों और अंकों से बने होते हैं।

लेकिन यह bashमेरे लिए वास्तव में क्या करता है, यह मेल नहीं खाता है: foo+bar^Wसब कुछ मिटा देता है, न कि सिर्फ barयहाँ उस बारे में अधिक जानकारी है


1. vi उपयोगकर्ता शायद इसके बजाय backward-kill-word(डिफ़ॉल्ट बाइंडिंग M-DEL) की तलाश कर रहा है unix-word-rubout
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.