घर पर बैश / एंड / डिलीट कीज एक टिल्ड लगा रहा है, या बच निकलने से पहले, [1 ~ 3 ~ ~


20

बैश में, home/ end/ deleteकुंजी एक टिल्ड सम्मिलित कर रहा है, या यदि भागने की कुंजी से पहले:[1~

इसलिए मैं टाइप करता हूं echo hellp, कर्सर को hel|lpहटाता हूं और डिलीट करता हूं, और bam, i got~tilde

इसके अलावा, मैं टाइप करता हूं echo hellp, कर्सर को hel|lpएस्क पर ले जाता हूं और फिर डिलीट करता हूं, और बीएएम, मुझे मिल गया[3~

$ echo hel~lp
hel~lp

$ echo hell[3~o
hell[3~o
~

मार के मेरे संस्करण:

$ bash --version
GNU bash, version 3.1.17(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

मैं जो चाहता हूं वह व्यवहार है cmd.exe:

  1. मैं चाहता हूँ कि Esc वर्तमान लाइन / बफर को खाली कर दे
  2. मैं चाहता हूं कि होम पहले चरित्र से पहले लाइन की शुरुआत के लिए कर्सर ले जाए
  3. मैं चाहता हूं कि पहले चरित्र के अंत में कर्सर को लाइन के अंत तक ले जाएं
  4. मैं वर्तमान लाइन / बफर से अगले वर्ण (कर्सर के दाएं) को हटाना चाहता हूं

इसे ठीक करने के लिए मुझे क्या करना होगा? क्या यह आपके बैश पर डिफ़ॉल्ट है?

अद्यतन: मैं विंडोज़ प्रोग्राम चलाने वाली एक विंडोज़ मशीन पर, sh.exe (जैसा कि आप GNU बैश के ऊपर देख सकते हैं), msys के लिए mingw के साथ संकलित:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys

विंडोज़, कोई टर्मिनल एमुलेटर, msys.bat, अगर मुझे पता था कि सेटिंग कैसे रिपोर्ट करनी है, तो मैं यह नहीं पूछूंगा कि उन्हें कैसे सेट किया जाए
वैकल्पिक

जवाबों:


22

आप .inputrcअपने में एक फ़ाइल के माध्यम से बैश को अनुकूलित करते हैं /home/username, आप डिफ़ॉल्ट को कॉपी कर सकते हैं

cp /etc/inputrc.default   ~/.inputrc

यहाँ मेरा है (टिप्पणियां # से शुरू होती हैं)

# Key-bindings for the command-line editor.

# Ask before displaying >50 items
# Since $WINDIR $PATH var can be in $PATH, this could list
# all window exectables in C:\WINDOWS
set completion-query-items 50

# Ignore case for the command-line-completion functionality
# on:  default to a Windows style console
# off: default to a *nix style console
set completion-ignore-case on

# none, visible or audible
set bell-style audible

# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta off
set convert-meta on

# visible-stats
# Append a mark according to the file type in a listing
set visible-stats off
set mark-directories on

# Show all instead of beeping first
set show-all-if-ambiguous off

# MSYSTEM is emacs based
$if mode=emacs
    # Common to Console & RXVT
    "\C-?": backward-kill-line          # Ctrl-BackSpace
    "\e[2~": paste-from-clipboard       # "Ins. Key"
    "\e[5~": beginning-of-history       # Page up
    "\e[6~": end-of-history             # Page down

    $if term=msys # RXVT
        "\e[7~": beginning-of-line      # Home Key
        "\e[8~": end-of-line            # End Key
        "\e[11~": display-shell-version # F1
        "\e[15~": re-read-init-file     # F5
    #$endif
    #$if term=cygwin # Console
    $else
        "\e[1~": beginning-of-line      # Home Key
        "\e[4~": end-of-line            # End Key


"\e[3~": delete-char            # Delete Key
#~      "\e\e[D": backward-word         # Alt-LeftArrow
#~      "\e\e[C": forward-word          # Alt-RightArrow
            "\M-\e[D": backward-word            # Alt-LeftArrow
            "\M-\e[C": forward-word         # Alt-RightArrow
    `#~`        "\C-\E[D": backward-word        # Ctrl-LeftArrow, nowork, can't be made to work
    #~`enter preformatted text here`        "\C-\E[C": forward-word         # Ctrl-RightArrow, nowork, can't be made to work
    #~ to see current bindings use    bind -q backward-kill-line
            "\e\e": kill-whole-line        # double/triple escape works :) Esc/Escape to delete current line like cmd.exe

        $endif
    $endif

यह जानने के लिए कि आपको बाईं ओर अपने इनपुट आर्क में टाइप करने की क्या ज़रूरत है (एस्केप कोड, क्योंकि यह लैपटॉप / डेस्कटॉप के बीच भिन्न हो सकता है ...), echo 'तो प्रॉम्प्ट प्रकार पर फिर Ctrl-Vकुंजी के Homeबाद टाइप करें , जैसे , फिर ' उदाहरण लिखें

$ echo ' home key ^[[1~  '
 home key
~
$ echo ' end key ^[[4~  '
 end key
~
$ echo ' pg up page up ^[[5~ '
 pg up page up
~
$ echo ' pg dn page down ^[[6~ '
 pg dn page down
~

तब प्रत्येक ^[को सैद्धांतिक रूप से \e जोड़ने के \M-लिए बदलें जिसका Altआप उपयोग \C-करेंगे Ctrlलेकिन यह वर्तमान में काम नहीं करता है (विंडोज़ सीमा)

उपलब्ध कमांड (जैसे backward-kill-line) http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Ratout_0029 पर सूचीबद्ध हैं

आप मौजूदा कीबोर्ड शॉर्टकट / बाइंडिंग के साथ bind -pया देख सकते हैं

$ bind -q backward-kill-word
backward-kill-word can be invoked via "\M-\C-h", "\M-\C-?".
~
$ bind -q backward-word
backward-word can be invoked via "\M-\M-[D", "\M-b", "\C-\E[[D".
~
$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[H".
~

TERMCAP में गड़बड़ न करें


find / -name 'inputrc.default'मेरी मशीन पर कुछ भी नहीं पाता है। मेरा घर और अंत काम करता था ... :( इसके अलावा, दूसरों के लिए FYI करें: .inputrc फ़ाइल को पुनः लोड करने के लिए, उपयोग करें bind -f ~/.inputrc
aliteralmind

आह! सुधार: मैंने आपके .inputrc का उपयोग किया, सिवाय $if mode=emacsब्लॉक के। मैंने इन दो पंक्तियों को जोड़ा, और वे फिर से काम करते हैं !! : डी "\e[1~": beginning-of-line ... "\e[4~": end-of-line
अल्टारिल्मिंड

RHL पर - डिफ़ॉल्ट फ़ाइल / etc / inputrc
Deian

दुर्भाग्य से मेरे पास क्लस्टर मशीन पर उस फ़ाइल तक पहुंच नहीं है।
हरमन टूथ्रोट

5

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

यदि आप कंसोल विंडो (यहां दुभाषिया / शेल के बारे में बात नहीं कर रहे हैं) के बजाय एक टर्मिनल एमुलेटर का उपयोग करने के लिए थे, जो विंडोज के साथ आता है, तो आपको एक अधिक कॉन्फ़िगर करने योग्य विकल्प मिलेगा। एक बार जब आप विम जैसे अन्य कार्यक्रमों का उपयोग करने का प्रयास करते हैं, तो चीजें केवल बदतर हो जाएंगी।

Gist : एक उचित टर्मिनल एमुलेटर का उपयोग करें, यहां तक ​​कि विंडोज पर या रीडलाइन शॉर्टकट सीखें। मैंने उन लोगों का परीक्षण किया जिनका मैं अभी उपयोग करता हूं और वे साथ काम करते हैं msys.bat

mingw-get install mintty && mintty

संपादित करने के लिए फ़ाइल होता हो /usr/share/terminfo(जो MinGW में मौजूद नहीं है) - उपयोग tic"संकलन" नियम (जो भी है क्योंकि हर कोई जानता है कि समर्थन गंभीर रूप से अपंग हो जाएगा शामिल नहीं है)। हालाँकि, मैंने इसे विंडोज पर भी उपयोग करने योग्य बनाने के लिए कोई उपयोगी विकास नहीं देखा है। यही कारण है कि आपको पहली बार में एक उचित टर्मिनल एमुलेटर का उपयोग करना चाहिए। लेकिन मुझे यकीन है कि एक सर्जन सर्जरी के लिए रसोई के चाकू का उपयोग करने में सक्षम होगा, इसलिए आपको विंडोज में निर्मित कंसोल विंडो का उपयोग क्यों नहीं करना चाहिए। सौभाग्य।


4

Readline की स्थापना के लिए जाँच करें

जब यह हाल ही में डेबियन / उबंटू की न्यूनतम स्थापना पर होता है , तो यह संभवतः इसलिए है क्योंकि आपने readline-commonपैकेज स्थापित नहीं किया है । बस पैकेज को स्थापित करने से इसे हल हो जाएगा।

डेबियन स्ट्रेच टाइपिंग के साथ डोकर पर जैसे ls HOME:

$ docker run --rm -it debian:stretch
root@6ae7baea9e5a:/# ls~

$ docker run -it --name=debian-stretch-readline-temp debian:stretch
root@2092cb968232:/# apt-get update
root@2092cb968232:/# apt-get install readline-common

$ docker commit debian-stretch-readline-temp debian-stretch-with-readline
$ docker run --rm -it debian-stretch-with-readline
root@53739343e9f7:/# ls

कृपया ध्यान दें कि रीडलाइन-कॉमन को स्थापित करने के बाद केवल नए लॉगिन गोले पर इसका प्रभाव पड़ेगा।


exec bashटर्मिनल से बाहर निकलने के बिना, एक नए के साथ वर्तमान बैश उदाहरण को बदलने का एक तरीका है (जैसा कि कंटेनर पीटीटीवाई में खेलते समय आवश्यक हो सकता है)।
केविन

@ केविन जबकि यह एक मान्य कथन है, तो इसका प्रश्नोत्तर के संदर्भ में क्या करना है?
gertvdijk

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

@ केविन आह, ठीक है, अच्छी तरह से अपनी बात को गलत समझा। एक नया लॉगिन शेल प्राप्त करने के कई तरीके मौजूद हैं, आपका उनमें से एक है। :)
gertvdijk

2

मुझे निम्नलिखित सहायक भी मिले: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

विशेष रूप से:

यदि आपकी चाबियाँ काम नहीं कर रही हैं, तो यह इसलिए हो सकता है क्योंकि आपका विशेष टर्मिनल इस सूची में नहीं, भागने के कोड भेजता है। सबसे पहले आपको यह पता लगाने की जरूरत है कि भागने वाले कोड क्या भेजे जा रहे हैं। उन्हें देखने के लिए, आप "उद्धृत-इंसर्ट" नामक एक रीडलाइन कमांड का उपयोग कर सकते हैं या कमांड शोकी - सीकेनोड्स चला सकते हैं जो एक प्रमुख शब्दशः के मूल्य को आउटपुट करता है। कोटेड-इंसर्ट के लिए डिफ़ॉल्ट बाइंडिंग Ctrl + V है।

उदाहरण के लिए, आप अपने टर्मिनल में इनपुट की निम्नलिखित श्रृंखला दे सकते हैं:

Ctrl+V
Home
Spacebar
Ctrl+V
End

और आउटपुट के रूप में मिलता है

$ ^ [[1 ~ ^] [[4 ~

^ [[आपके शेल में एक एस्केप कैरेक्टर इंगित करता है, तो इसका मतलब है कि आपके होम कुंजी का एस्केप कोड [1 ~ है और आपके पास एंड का की एस्केप कोड है [4 ~]। चूंकि ये एस्केप कोड डिफ़ॉल्ट रीडलाइन कॉन्फिगर में सूचीबद्ध नहीं हैं, इसलिए आपको इन्हें जोड़ना होगा:

"\e[1~": beginning-of-line
"\e[4~": end-of-line

ध्यान दें कि रीडलाइन एक एस्केप चरित्र को इंगित करने के लिए \ e का उपयोग करता है।

मेरे लिए संबंधित टुकड़ा inputrc में डाल रहा था:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.