Ctrl + w से पिछड़े-मार-शब्द को बांधना


21

मैं बश के हाल के अन्वेषण के लिए टीसीएस के लंबे समय तक उपयोग से स्विच करने का प्रयास कर रहा हूं।

मैं अपने सभी पसंदीदा फीचर्स को पोर्ट करने में कामयाब रहा हूं, सिवाय Ctrl + w के जो शब्द सीमाओं के रूप में रिक्त स्थान और स्लैश को मानता है, सबसे अधिक संभावना पिछड़े-किल-वर्ड। हालांकि बैश में रीडलाइन पहले स्थान के सभी रास्तों को हटा देती है, बीच में सभी स्लैश को हटा देती है।

मैंने कई विभिन्न संयोजनों की कोशिश की है \ C-w: .inputrc और .bashrc दोनों में बाइंड का उपयोग करते हुए बैकवर्ड-किल-वर्ड, लेकिन मैं इसे अपने इच्छित तरीके से काम नहीं कर सकता।

काम पर विंडोज से पुट्टी के माध्यम से मज़ेदार, मैं Alt + Backspace का उपयोग कर सकता हूं, जो मैन्युअल रूप से कहता है कि मैं जो चाहता हूं वह सटीक व्यवहार का उत्पादन करने के लिए डिफ़ॉल्ट बंधन है। लेकिन घर पर मेरे मैक पर Terminal.app में यह काम नहीं करता है। वही किसी भी FreeBSD या लिनक्स सर्वर के लिए जाता है जो मुझे टर्मिनल.app से लॉग इन करने के लिए होता है।

इसलिए मैं मदद के लिए सुपरयुसर की ओर मुड़ता हूं।

जवाबों:


38

readline नहीं बांधता है Ctrl - डब्ल्यू चूंकि यह डिफ़ॉल्ट रूप से टर्मिनल चालक द्वारा नियंत्रित किया जाता है:

$ stty -a
(...) werase = ^W; (...)

इसे अक्षम करने के लिए, आपको (इन) चलाना होगा ~/.bashrc ):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrc जब यह पढ़ा है तब से यहाँ मदद नहीं करेगा Ctrl - डब्ल्यू अभी भी सौंपा गया है werase

यह भी ध्यान दें \C-w प्रारूप कीसेक को दोहरे उद्धरण चिह्नों में संलग्न किया जाना चाहिए, जैसा कि ऊपर दिया गया है।


अलग-अलग टर्मिनल संभाल सकते हैं ऑल्ट - बैकस्पेस अलग ढंग से।

  • PuTTY और GNOME टर्मिनल (डिफ़ॉल्ट सेटिंग्स के साथ) भेजें 1b 7f ( ESC DEL )
  • Xterm के साथ metaSendsEscape: true भेजता है 1b 08 ( ESC BS )।
  • टर्म के बिना metaSendsEscape भेजता है 88 ( HTS, या BS उच्चतम बिट सेट के साथ)।

Xterm के व्यवहार को नियंत्रित करने के लिए कुछ सेटिंग्स हैं ऑल्ट कुंजी (कहा जाता है मेटा Xterm और X11 सामान्य रूप से)। साथ में metaSendsEscape, पकड़े हुए ऑल्ट कुंजी के साथ एक उपसर्ग उपसर्ग करेगा ESC (हेक्स 1b )। सेटिंग के बिना (डिफ़ॉल्ट मोड), ऑल्ट इनपुट वर्ण का उच्चतम बिट सेट करेगा, जिसके परिणामस्वरूप विशेष वर्ण होंगे। (उदाहरण के लिए, ऑल्ट - एन का परिणाम ESC n तथा î क्रमशः।)

जहाँ तक मुझे याद है, मेटा / ऑल्ट / जो भी मैक-उपयोग करते हैं, उनके व्यवहार को नियंत्रित करने के लिए Terminal.app की भी एक समान सेटिंग है।


यह न केवल सबसे अच्छा उत्तर है, बल्कि अत्यंत जानकारीपूर्ण है, धन्यवाद!
Stefan M

1
@ शौर्यन: द werase "शब्द मिटा" क्रिया, सामान्य मिटा (बैकस्पेस) की तरह, ओएस द्वारा ही लागू की जाती है, "ट्टी डिवाइस" ड्राइवर में - ध्यान दें कि वे ऐसे कार्यक्रमों में भी उपलब्ध हैं जो केवल स्टड से नेत्रहीन पढ़ते हैं, उदा। cat। सभी यूनिक्स पर, stty इन विशेष कुंजी सहित विभिन्न tty मापदंडों को नियंत्रित करने के लिए उपयोग किया जाता है (ऐसे UNIX 7 वां संस्करण stty की तरह देखा।)
grawity

1
@ शशुरेन: इस बीच, पढ़ने के लिए लाइन एक यूजरस्पेस लाइब्रेरी है जो मूल रूप से इसके लिए लिखी गई है दे घुमा के शेल (हालांकि अब कई कार्यक्रमों द्वारा उपयोग किया जाता है)। यह संभव है कि अन्य कार्यों में लागू किया गया था पढ़ने के लिए लाइन ट्टी ड्राइवर को फुलाने से बचने के लिए (जिसमें पहले से ही काफी मात्रा में झंडे और टॉगल थे, जैसा कि देखा गया था stty मैनुअल)। इसके अलावा, दे घुमा के मूल रूप से के लिए करना था GNU OS और केवल बाद में अन्य यूनिक्स में पोर्ट किया गया; कई अलग-अलग कर्नेल की तुलना में एकल लाइब्रेरी में संपादन सुविधाओं को बनाए रखना बहुत आसान है।
grawity

3
@ शौर्यन: तकनीकी रूप से, हालांकि, सब ये कार्य, शब्द मिटाएँ सहित, द्वारा कार्यान्वित किए जाते हैं पढ़ने के लिए लाइन - सक्रिय होने पर, यह टर्मिनल ड्राइवर द्वारा बैकस्पेस और Ctrl + W को पूरी तरह से निष्क्रिय कर देता है। पढ़ने के लिए लाइन बस सम्मान करता है stty सादगी के लिए विन्यास, लेकिन यह द्वारा overriden किया जा सकता है पढ़ने के लिए लाइन स्वयं की सेटिंग (जैसा कि मैट डे के उत्तर में वर्णित है)।
grawity

3
यह सूचना, उत्थान के लिए एक शानदार उत्तर है। हालांकि, यह ध्यान दिया जाना चाहिए कि यह सभी कार्यक्रमों के लिए Ctrl-w को निष्क्रिय कर देता है जब तक कि वे रीडलाइन का उपयोग नहीं करते हैं, जो कि शायद कोई भी नहीं चाहता है ..., इसलिए @fjarlq का उत्तर आज़माएं।
0fnt

18

ग्रैविटी ने लिखा कि इसे नियंत्रित नहीं किया जा सकता .inputrc फ़ाइल, लेकिन यह गलत है।

अगर तुम set bind-tty-special-chars off अपने में .inputrc, तो आप विशेष टर्मिनल चार्ट के व्यवहार को अनुकूलित कर सकते हैं।

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

set bind-tty-special-chars off
"\C-u": kill-whole-line
"\C-w": backward-kill-word

1
और यह उन सभी कार्यक्रमों के लिए काम करने का लाभ है जो रीडलाइन का उपयोग करते हैं - जैसे। python
wchargin

3

रिकॉर्ड के लिए, iTerm2 पर लागू होने वाला उत्तर सेट करना है ऑल्ट - बैकस्पेस (या ऑप्ट ⌥ - मैक पर) हेक्स कोड भेजने के लिए 0xb1 तथा 0x7f प्रदर्शन करने के लिए backward-kill-word कार्रवाई जो गैर-अल्फ़ान्यूमेरिक वर्णों को सीमांकक मानता है।

भेद के लिए, यहां वह व्यवहार बताया जा रहा है, जिसमें दबाव डाल रहा हूं ऑप्ट ⌥ - एक बार यह बदल जाता है:

echo "/example/filepath/with_non-alpha.characters@blah:meh

इसके लिए:

echo "/example/filepath/with_non-alpha.characters@blah:

और बाद के प्रेस ऑप्ट ⌥ - :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

यहाँ iT iT2 में सेटिंग कैसी दिखती है: enter image description here

तो, पोटीन और टर्मिनल के लिए विशिष्ट, ग्रैविटी का जवाब महान है। लेकिन iTerm2 में सेटिंग को लागू करने के तरीके की तलाश में शर्मनाक समय बिताने के बाद, यह सुपरसुअर पोस्ट सबसे अधिक बार आता है, इसलिए यह प्रासंगिक जानकारी प्रदान करने के लिए ज़िम्मेदार लग रहा था क्योंकि यह iTerm2 पर इस प्रश्न से जुड़े एक उत्तर के रूप में लागू होता है।


यह पता लगाने के लिए मुझे वास्तव में एक लंबा समय लगा, और यह समाधान वास्तव में ओएस एक्स (iTerm2 के साथ) पर काम करता है जब एक रिमोट बैश शेल पर लॉग इन किया जाता है। धन्यवाद!
Martijn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.