Strona główna / Klucze końcowe w zsh nie działają z putty
Uruchamiam zsh jako domyślną powłokę na Ubuntu box i wszystko działa dobrze używając gnome-terminal (który z tego co wiem emuluje xterm). Kiedy loguję się z Okna windows przez ssh i putty (który również emuluje xterm) suddendly klucze home / end nie działają.
Udało mi się to rozwiązać dodając te linie do mojego pliku zshrc...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...ale wciąż się zastanawiam, co jest nie tak. Jakiś pomysł?
7 answers
Znalazłem to połączenie:
Jeden
Programiści ZSH nie uważają, że ZSH powinien definiować działania Home, End, Del ,.. klucze.
Debian i Ubuntu naprawiają to, definiując normalne działania, których przeciętny użytkownik oczekiwałby w globalnym pliku /etc/zsh/zshrc
. Po odpowiednim kodzie (tak samo jest w Debianie i Ubuntu):
if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi
Więc, jeśli łączysz się z pudełkiem Debiana lub Ubuntu, nie musisz zrób cokolwiek. Wszystko powinno działać automagicznie(jeśli nie, patrz poniżej).
Ale... jeśli łączysz się z innym skrzynką (np. FreeBSD), może nie być przyjaznej dla użytkownika domyślnej zshrc
. Rozwiązaniem jest oczywiście dodanie linii z Debian / Ubuntu zshrc
do własnego .zshrc
.
Dwa
Putty wysyła xterm
jako typ terminala do zdalnego hosta. Ale gdzieś się psuje i nie wysyła poprawnych kodów sterujących do domu, End ,... ten oczekiwałby od xterm
. Albo terminal nie powinien ich wysyłać... (del klucz działa w xterm
jednak, jeśli skonfigurujesz go w ZSH). Zauważ również, że Twoje klawisze Numpad działają śmiesznie w Vimie, na przykład z xterm
terminal.
Rozwiązaniem jest skonfigurowanie Putty do wysyłania innego typu terminala. Próbowałem xterm-color
i linux
. xterm-color
Naprawiono Dom/koniec problem, ale Numpad był nadal zabawny. Ustawienie go na linux
Naprawiono oba problemy.
Możesz ustawić typ terminala w Putty w obszarze Connection - > Data. Nie daj się skusić, aby ustawić typ terminala w .zshrc
za pomocą export TERM=linux
, to jest po prostu złe. Typ terminala powinien być określony przez aplikację terminal. Jeśli na przykład połączysz się z komputerem Mac box z klientem Mac SSH, możesz ustawić własny typ terminala.
Zauważ, że termin określa typ terminala i nie ma nic wspólnego z hostem, z którym się łączysz. Mogę ustawić typ terminala na linux
w Putty i połączyć się z serwerami FreeBSD bez problemów.
Więc napraw obie te rzeczy i powinno być dobrze:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-30 21:14:49
W oknie konfiguracyjnym PuTTY przejdź do Connection -> Data i wpisz linux do łańcucha typu terminala przed połączeniem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-19 10:50:46
To działa dla mnie
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 09:08:45
Właściwą odpowiedzią, która powinna być przenośna w wszystkich dystrybucjach (niekoniecznie we wszystkich wersjach zsh, ymmv tutaj) jest użycie narzędzia pomocniczego zkbd z zkbd.
Definicja Klawiatury
Duża liczba możliwych kombinacji klawiatur, stacji roboczych, terminali, emulatorów i systemów okiennych sprawia, że zsh nie ma wbudowanych wiązań klawiszy dla każdej sytuacji. Narzędzie Zkbd, Znalezione w Functions / Misc, może pomóc w szybkim tworzeniu kluczowe wiązania dla Twojej konfiguracji.Uruchom zkbd jako funkcję automatycznie ładowaną lub jako skrypt powłoki:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
Kiedy uruchamiasz zkbd, najpierw prosi Cię o wpisanie typu terminala; jeśli domyślne, które oferuje jest poprawne, po prostu naciśnij return. Następnie poprosi Cię o naciśnięcie kilku różnych klawiszy, aby określić charakterystykę klawiatury i terminala; zkbd ostrzega cię jeśli znajdzie coś niezwykłego, np. klawisz Delete, który nie wysyła ani ^H nor ^?.
Naciśnięcia klawiszy odczytywane przez zkbd są zapisywane jako definicja tablicy asocjacyjnej o nazwie key, zapisanej do pliku w podkatalogu .zkbd w katalogu HOME lub ZDOTDIR. Nazwa pliku składa się z TERM, VENDOR i OSTYPE parametry, połączone myślnikami.
Możesz przeczytać ten plik w swoim .zshrc lub inny plik startowy z
source' or
.'polecenia, a następnie odwoływać się do parametru kluczowego w poleceniach bindkey, jak to:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
Zauważ, że aby' autoload zkbd ' działał, plik zkdb musi znajdować się w jednym z katalogów nazwanych w tablicy fpath (zobacz zshparam(1)). Tak powinno być już w przypadku standardowej instalacji zsh; jeśli tak nie jest, skopiuj Functions/Misc / Zkbd do odpowiedniego katalogu.
Zobacz man -P "less -p 'keyboard definition'"
zshcontrib, lub przeszukaj meta-stronę Man zshall
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-27 14:11:44
Minęło już prawie 11 lat odkąd to pytanie zostało po raz pierwszy opublikowane. W tym czasie niektóre dystrybucje wysyłały z putty
wpisem terminfo, ale w najlepszym razie było to przeciętne. Od tego czasu sytuacja się poprawiła, a hacki, które były konieczne przez ponad dekadę, nie są już potrzebne. PuTTY nadal domyślnie ustawia TERM
na xterm
dla zgodności, ale jeśli łączysz się z nowoczesnymi, aktualnymi systemami, prawdopodobnie będziesz miał szczęście zastąpić to i ustawić go na putty-256color
:
- upewnij się, że host ma wpis terminfo dla
putty-256color
:toe -a | grep -F putty
- Cofnij wszelkie hacki, które możesz włączyć, aby PuTTY działał poprawnie z zsh lub innymi programami.
- upewnij się, że Kit jest aktualny. Nie powiadomi Cię, gdy aktualizacje będą dostępne, a jeśli są nieaktualne, prawdopodobnie napotkasz wiele tych samych problemów. Możesz chcieć automatycznie aktualizować go za pomocą czegoś takiego jak Chocolatey.
- W oknie konfiguracji PuTTY, przejdź do Connection - > Data i ustaw "Terminal-type string" na
putty-256color
. - gdy już to robisz, na tym samym ekranie konfiguracji Dodaj nową zmienną środowiskową, aby włączyć 24-bitowy kolor. Ta zmienna nie jest standaryzowana, ale jest wysyłana przez wiele innych popularnych emulatorów terminali (np. iTerm2) i wiele programów ją rozumie.
- zmienna:
COLORTERM
- wartość:
truecolor
- zmienna:
- podczas pisania nie znalazłem dystrybucji, która akceptuje zmienną COLORTERM domyślnie przez SSH. Musisz edytować konfigurację OpenSSH na hoście, aby na to zezwolić. Na przykład, w dystrybucji podobnej do Debiana, edytuj
/etc/ssh/sshd_config
i dodajCOLORTERM
do liniiAcceptEnv
. - Wszystko powinno teraz "po prostu działać". Jeśli nie:
- upewnij się, że połączyłeś się ponownie po dokonaniu zmiany lub przynajmniej Uruchom
exec zsh
po zmianieTERM
. zsh nie reaguje na zmiany wTERM
podczas pracy. - upewnij się, że
TERM
jest rzeczywiście ustawiony na to, co zamierzałeś:echo $TERM
- są korzystasz z najnowszej wersji swojej dystrybucji? Na przykład, jeśli korzystasz z długoterminowego cyklu życia pomocy technicznej, nawet jeśli Twoja wersja jest nadal obsługiwana technicznie, może nie mieć aktualnych wpisów terminfo.
- używasz
screen
czytmux
? To kolejna puszka robaków. Testuj bez tych pierwszych, aby zawęzić miejsce wystąpienia problemu. W tmux spróbuj ustawićTERM=tmux-256color
. Na ekranie spróbujTERM=screen-256color
. - jesteś na najnowszej wersji PuTTY?
- czy masz RC-pliki, które implementują skróty klawiszowe lub inne hacki? Spróbuj użyć domyślnych plików RC.
- czy zmieniłeś już różne ustawienia PuTTY, aby spróbować rozwiązać problem przed próbą naprawy terminfo? Prawdopodobnie będziesz musiał zresetować te ustawienia.
- upewnij się, że połączyłeś się ponownie po dokonaniu zmiany lub przynajmniej Uruchom
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-26 15:41:11
Wygląda na szpachlówkę. Gnome-terminal wysyła kody ^[OH
i ^[OF
odpowiednio dla Home I End, podczas gdy putty wysyła ^[[1~
i ^[[4~
. Jest opcja w putty, aby zmienić klawisze Home / End z trybu standard na tryb rxvt , i to wydaje się naprawiać klucz Home, ale nie klucz End (który teraz wysyła ^[Ow
). Chyba czas gdzieś zgłosić błąd... :-)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 12:59:56
Te wiązania po prostu nie wydają się być częścią domyślnych wiązań ustawionych w trybie emacs.
Wykonanie "where-is beginning-of-line" przy domyślnej instalacji zsh po uruchomieniu "bindkey-e" pokazuje, że jest on związany tylko z ^a. być może powinieneś zapytać programistów zsh dlaczego: -)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 11:55:42