Klawisz bash home / end / delete wstawia tyldę lub, jeśli poprzedza ją klawisz Escape, [1 ~ [3 ~

20

W bash klawisz home/ end/ deletewstawia tyldę lub jeśli poprzedza ją klawisz Escape:[1~

Więc piszę echo hellp, przesuwam kursor hel|lpi piszę delete, i tak dalej~tilde

Poza tym piszę echo hellp, przesuwam kursor hel|lpi piszę esc, a następnie usuwam i bam, mam[3~

$ echo hel~lp
hel~lp

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

Moja wersja bash:

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

To czego chcę to zachowanie cmd.exe:

  1. Chcę, aby Esc wyczyścił bieżącą linię / bufor
  2. Chcę, aby strona główna przesunęła kursor na początek linii przed pierwszym znakiem
  3. Chcę, aby End przesunął kursor na koniec linii przed pierwszym znakiem
  4. Chcę usunąć, aby usunąć następny znak (na prawo od kursora) z bieżącej linii / bufora

Co muszę edytować, aby to naprawić? Czy to jest domyślne w twoim bashu?

aktualizacja: pracuję na komputerze z systemem Windows, na którym działa program Windows, sh.exe (jak widać powyżej GNU bash), skompilowany z mingw dla msys:

$ uname -s -m -o
MINGW32_NT-5.1 i686 Msys
opcjonalny
źródło
windows, brak emulatora terminala, msys.bat, gdybym wiedział, jak zgłosić ustawienie, nie pytałbym, jak je ustawić
opcjonalnie

Odpowiedzi:

22

Dostosowujesz bash za pomocą .inputrcpliku w swoim pliku /home/username, możesz skopiować domyślny

cp /etc/inputrc.default   ~/.inputrc

tu jest moje (komentarze zaczynają się od #)

# 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

aby dowiedzieć się, co należy wpisać w inputrc po lewej stronie (kod ucieczki, ponieważ może się różnić w zależności od laptopa / komputera stacjonarnego ...), w wierszu polecenia wpisz echo 'następnie, Ctrl-Va następnie klawisz, np. Homewpisz ' przykład

$ 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
~

następnie zastąpić każdy ^[z \e dodatku \M-do Alt teoretycznie byłoby użyć \C-dla Ctrlale aktualnie nie ma pracy (ograniczenie windows)

dostępne polecenia (jak backward-kill-line) są wymienione w http://www.gnu.org/software/bash/manual/bashref.html#index-backward_002dkill_002dline-_0028C_002dx-Rubout_0029

możesz wyświetlić istniejące skróty / powiązania klawiaturowe za pomocą bind -plub

$ 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".
~

nie zadzieraj z TERMCAP

opcjonalny
źródło
find / -name 'inputrc.default'nic nie znajduje na moim komputerze. Mój dom i koniec kiedyś działały ... :( Również FYI innym: Aby przeładować plik .inputrc, użyj bind -f ~/.inputrc.
aliteralmind
Ach! Korekta: Użyłem twojego .inputrc, z wyjątkiem $if mode=emacsbloku. Dodałem te dwie linie i znów działają !! : D "\e[1~": beginning-of-line ... "\e[4~": end-of-line.
aliteralmind,
na RHL - domyślny plik w / etc / inputrc
Deian
niestety nie mam dostępu do zapisu tego pliku na klastrze.
Herman Toothrot,
5

Cóż, skoro mówisz, że pracujesz w systemie Windows i nie używasz odpowiedniego emulatora terminali, takiego jak PuTTY (z mintty , puttycyg i in. ), Radzę zajrzeć do dokumentacji readline i poznać skróty do readline. Na dłuższą metę będzie lepiej.

Jeśli miałbyś użyć emulatora terminala zamiast okna konsoli (nie mówiąc tu o tłumaczu / powłoce), który jest dostarczany z systemem Windows, uzyskałbyś bardziej konfigurowalną alternatywę. Gdy spróbujesz użyć innych programów, takich jak Vim, sytuacja się pogorszy.

Istota: użyj odpowiedniego emulatora terminala, nawet w systemie Windows, lub naucz się skrótów readline. Przetestowałem te, z których teraz korzystam najczęściej i współpracują msys.bat.

mingw-get install mintty && mintty

Plik do edycji będzie mieć /usr/share/terminfo(co nie istnieje w MinGW) - stosowanie ticzasad „kompilacji” (który nie jest jeszcze włączone, bo każdy wie, że wsparcie będzie poważnie okaleczony). Jednak nie widziałem żadnego przydatnego rozwoju, który sprawiłby, że byłby nawet prawie użyteczny w systemie Windows. Właśnie dlatego powinieneś używać odpowiedniego emulatora terminali. Ale jestem pewien, że chirurg będzie mógł użyć noża kuchennego do operacji, więc dlaczego nie skorzystać z wbudowanych okien konsoli Windows. Powodzenia.

0xC0000022L
źródło
4

Sprawdź instalację Readline

Kiedy dzieje się tak przy minimalnej instalacji najnowszego Debiana / Ubuntu, prawdopodobnie dzieje się tak, ponieważ readline-commonpakiet nie został zainstalowany . Wystarczy zainstalować pakiet, aby go rozwiązać.

Np. W Dockerze z pisaniem Debian Stretch 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

Pamiętaj, że po zainstalowaniu readline-common będzie to miało wpływ tylko na nowe powłoki logowania.

gertvdijk
źródło
exec bashjest sposobem na zastąpienie bieżącej instancji basha nową, bez wychodzenia z terminala (co może być potrzebne podczas gry w kontenerze pTTY).
Kevin
@Kevin Chociaż jest to prawidłowe stwierdzenie, co to ma wspólnego z kontekstem pytań i odpowiedzi tutaj?
gertvdijk
1
dlatego zostawiłem go jako komentarz zamiast sugerować go jako edycję twojej odpowiedzi. Zauważyłeś potrzebę nowej powłoki, aby korzystać ze świeżo zainstalowanego readline-common, i pokazałeś, że zatwierdzenie kontenera jako obrazu jest jednym ze sposobów na osiągnięcie tego. Zwłaszcza, że ​​użyłeś Dockera jako przykładu, myślałem, że mój komentarz jest istotny.
Kevin,
@Kevin Ah, dobrze, więc źle zrozumiałem twój punkt widzenia. Istnieje wiele sposobów na uzyskanie nowej powłoki logowania, twoja jest jedną z nich. :)
gertvdijk,
2

Znalazłem również następujące pomocne: https://wiki.archlinux.org/index.php/Home_and_End_keys_not_working

Konkretnie:

Jeśli klucze nie działają, przyczyną może być to, że dany terminal wysyła kody specjalne, których nie ma na tej liście. Najpierw musisz dowiedzieć się, jakie kody ucieczki są wysyłane. Aby je zobaczyć, możesz użyć polecenia Readline o nazwie „quoted-insert” lub uruchomić polecenie showkey --scancodes, które wypisuje wartość klucza dosłownie. Domyślne powiązanie wstawionego cudzysłowu to Ctrl + V.

Na przykład możesz podać następującą serię danych wejściowych w swoim terminalu:

Ctrl+V
Home
Spacebar
Ctrl+V
End

I uzyskaj jako wynik

$ ^ [[1 ~ ^ [[4 ~

^ [Wskazuje znak ucieczki w twojej powłoce, więc oznacza to, że twój klawisz Home ma kod ucieczki [1 ~, a ty klawisz End ma kod ucieczki [4 ~. Ponieważ te kody ucieczki nie są wymienione w domyślnej konfiguracji Readline, musisz je dodać:

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

Zauważ, że Readline używa \ e do oznaczenia znaku ucieczki.

Odpowiednim fragmentem było umieszczenie tego w inputrc:

"\e[1~": beginning-of-line
"\e[4~": end-of-line
Paweł
źródło