Jak skonfigurować PuTTY, aby Home / End / PgUp / PgDn działały poprawnie w bash?

122

Klawisze Home, End, PageUp, PageDown wszystkie wpisują a ~w mojej sesji bash zamiast przesuwać kursor / widok. Dlaczego tak się dzieje i które ustawienia muszę zmienić?

GNU bash, version 4.0.28(1)-release (x86_64--netbsd)
PuTTY v0.60

Pytanie pierwotnie brzmiało:

Dlaczego w PuTTY naciśnięcie klawisza „Home” na powłoce (bash) powoduje wpisanie „~”? A raczej, jak sprawić, by przesunął kursor na początek wpisanego polecenia?

(Myślałem, że powodem jest to, że ~ jest katalogiem domowym , ale odpowiedzi mówią, że tak nie jest.)

RomanSt
źródło

Odpowiedzi:

149

Zmień ciąg typu Terminal w zakładce Połączenie> Dane z domyślnego „xterm” na „linux”. To zadziałało dla mnie.

wprowadź opis zdjęcia tutaj

Der Hochstapler
źródło
2
Dzięki! Miałem ten problem po tym, jak postanowiłem, że Ctrl w lewo / w prawo działa przy użyciu tej metody ( superuser.com/a/103097/45410 ).
Edwin Yip,
4
Nacisk: nie Terminal -> Keyboard„Klawisze funkcyjne i klawiatura”.
Elazar
2
Działa, ale stwarza inne problemy, takie jak wyłączenie obsługi myszy. więc jest to dla mnie nie do przyjęcia rozwiązanie
Anton
To rozwiązanie umożliwia także umlauts wewnątrz szpachli podczas łączenia z OS X!
lorem małpa
42

Dzieje się tak, ponieważ nie masz poprawnie ustawionego typu terminala PuTTY lub ponieważ na twoim serwerze nie ma zainstalowanych poprawnych definicji terminfo.

W systemach opartych na Debianie pakiet ncurses-term (wersja 5.7 + 20081213-1) zawiera pliki definicji terminfo dla typów końcówek putty , putty-256color i putty-vt100 . Jeśli masz zainstalowany ten pakiet, możesz ustawić „Ciąg terminala” na „putty” zamiast domyślnego „xterm” w konfiguracji sesji Putty (Połączenie -> Dane).

Stephen Irons wspomina także o „linuksie” jako innym typie terminala, który działa; Uważam, że jest to poprawne z wcześniejszych doświadczeń, ale nie przetestowałem tego ostatnio.

W moich systemach pozwala to na prawidłowe działanie Home i End, chociaż PageUp / PageDown nie przewijają okna konsoli. (Działają poprawnie w aplikacjach ncurses, takich jak aptitude , a Shift-PgUp / Shift-PgDn przewijają okno konsoli.)

quack quixote
źródło
Tak, używanie TERM=puttylub TERM=putty-256colorjest najmądrzejsze, choć niestety w tej chwili wydaje się, że ta ostatnia nie działa poprawnie dla kolorów 8-15 (które mają być jasnymi wersjami 0-7). Inne „rozwiązania” z dużym prawdopodobieństwem mogą się czasem skończyć z rażącym lekceważeniem różnic między zaangażowanymi terminalami.
SamB
yum install ncurses-termposortowałem to dla mnie na CentOS 7 z kitem przy następnym logowaniu, dziękuję.
Wandering Zombie
1
ustawienie typu terminala na puttydziałanie, ale psuje obsługę myszy podobnej do xterm (np. dla Midnight Commander)
Anton
instalacja „ncurses-term” działała dla mnie przy testowaniu Debiana.
hochl
nic z tych nie działa dla mnie, jestem na kitach łączących się z centos i nie mogę uruchomić yum install ncurses-term, ponieważ nie jestem rootem.
Herman Toothrot,
20

Jeśli chcesz sprawdzić, który kod jest wysyłany przez PuTTY do twojego terminala po naciśnięciu klawisza lub kombinacji klawiszy, wystarczy wydać a, Ctrl+Va następnie nacisnąć żądany klawisz.

Na przykład naciśnięcie klawisza Home spowoduje wygenerowanie następującego ciągu na moim terminalu:

^[[1~

Oznacza to, że PuTTY wysyła znak ucieczki ^ [ a następnie ciąg [1 ~ .

Możesz utworzyć ~/.inputrcplik w swoim $HOMEfolderze lub /etc/inputrcplik w zależności od systemu. Następnie wypełnij ten plik kodami PuTTY i pasującymi działaniami Bash, które chcesz uruchomić Bash.

Uwaga: Zamień każdy ^ [ znak na równoważny ciąg \ e

W moim przykładzie dodam wiersz z moim kodem Home i działaniem na początku wiersza (z którym domyślnie jest związane Ctrl+Aw Bash):

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

Do Twojej wiadomości, mój plik inputrc ma następującą treść:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
"\e[1~": beginning-of-line     # Home key
"\e[4~": end-of-line           # End key
"\e[5~": beginning-of-history  # PageUp key
"\e[6~": end-of-history        # PageDown key
"\e[3~": delete-char           # Delete key
"\e[2~": quoted-insert         # Insert key
"\eOD": backward-word          # Ctrl + Left Arrow key
"\eOC": forward-word           # Ctrl + Right Arrow key

Z @Cimbali: Więcej możliwych do powiązania poleceń (takich jak poprzednia historia: Przejdź „w górę” przez listę historii) dostępnych na tej stronie referencyjnej .

Damien Garrido
źródło
TAK ! Wreszcie ! Ciąg końcowy Putty'ego nie zrobił nic dla słowa wstecz i do przodu. To jest świetne !
Cimbali
1
Jest to jedyne dopuszczalne rozwiązanie, ponieważ TERM=linuxlub TERM=puttypsuje obsługę myszy podobnych do Xterm. Dzięki!
Anton
14

Crtl + A zabierze Cię do początku linii

Oto lista skrótów klawiaturowych Bash

Iain
źródło
13
To świetnie i wszystko, ale Home / End są w moim mózgu mocno podłączone, a ponieważ administruję serwerem tylko raz na niebieskim księżycu, szanse na oduczenie się okablowania są niewielkie.
RomanSt
9

To, co faktycznie wysyła, to ^[[1~końcowa sekwencja ucieczki składająca się z:

  • ^ [- ucieczka
  • [- lewy nawias kwadratowy
  • 1 jeden
  • ~ - tylda

Możesz to zobaczyć, naciskając Ctrl+ Vnastępnie Home.

Możesz być w stanie rozwiązać problem, zmieniając ustawienie klawiatury PuTTY dla klawiszy Home i End na rxvt (co tworzy sekwencję ucieczki ^[[Hlub zmieniając $ TERM, którego używasz (lub edytując ~/.inputrc).

Nawiasem mówiąc, nie ma związku między tyldą, którą dostajesz po naciśnięciu, Homea tyldą reprezentującą katalog domowy. Na przykład w moim zestawie Page-Downprodukuje, ^[[6~które drukowałyby tyldę, jeśli nie byłaby odpowiednio interpretowana.

Dennis Williamson
źródło
Dzięki! rxvt naprawił klawisz Home; Klawisz End tworzy teraz ding. PgUp / Down rzeczywiście piszą ~i żadne ustawienia Klawiatury PuTTY nie powodują ich działania. Czy moje bash jest popsute, czy to „normalne”?
RomanSt
Co dostajesz, kiedy piszesz echo $TERM?
Dennis Williamson,
xterm(Limit 15 znaków)
RomanSt
3
Możesz spróbować dodać "\eOw": end-of-line(to jest duża litera O) do swojego ~/.inputrcpliku.
Dennis Williamson,
Naprawiono klucz zakończenia; Rozumiem pomysł. Naprawdę chciałbym, żeby takie hacki nie były konieczne ...
RomanSt
2

Żadna z tych opcji nie działała dla mnie. Korzystam ze starego systemu AIX. Musiałem dodać następujące aliasy do mojego .profile

alias __A=$(print '\0020') # ^P = up = previous command
alias __B=$(print '\0016') # ^N = down = next command
alias __C=$(print '\0006') # ^F = right = forward a character
alias __D=$(print '\0002') # ^B = left = back a character
Samochód ciężarowy
źródło
nie działa dla mnie, bummer
Herman Toothrot 10.09.16
1

Nie mogłem go uruchomić innymi metodami. Jednak stworzyłem ten skrypt AutoHotkey, który działa, o ile twoja powłoka to Bash:

#IfWinActive ahk_class PuTTY
PgUp::Send +{PgUp}
PgDn::Send +{PgDn}
Home::Send ^a   ; beginning of line
End::Send ^e    ; end of line
+^Del::Send ^k  ; delete whole line after cursor
+End::Send ^k   ; delete whole line after cursor
+Home::Send ^u  ; delete whole line before cursor
^Del::Send !d   ; delete word after cursor
^BS::Send ^w    ; delete word before cursor
^Left::Send !b  ; jump word left
^Right::Send !f ; jump word right
#IfWinActive

Należy jednak zachować ostrożność , ponieważ nie wszystkie skróty klawiszowe bash działają w innych programach.

Ciantic
źródło
Spowodowałoby to bałagan z głównym powodem, dla którego patrzę na to: screenco przy ustawieniach domyślnych psuje Ctrl-A, ponieważ używa go jako znaku ucieczki ....
Gert van den Berg