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ł?

Author: Myrddin Emrys, 2008-10-02

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:)

 74
Author: hopla,
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.

 16
Author: Adam Pierce,
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
 6
Author: Rene,
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

 5
Author: Josh McGee,
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:

  1. upewnij się, że host ma wpis terminfo dla putty-256color: toe -a | grep -F putty
  2. Cofnij wszelkie hacki, które możesz włączyć, aby PuTTY działał poprawnie z zsh lub innymi programami.
  3. 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.
  4. W oknie konfiguracji PuTTY, przejdź do Connection - > Data i ustaw "Terminal-type string" na putty-256color.
  5. 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.
    1. zmienna: COLORTERM
    2. wartość: truecolor
  6. 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 dodaj COLORTERM do linii AcceptEnv.
  7. Wszystko powinno teraz "po prostu działać". Jeśli nie:
    1. upewnij się, że połączyłeś się ponownie po dokonaniu zmiany lub przynajmniej Uruchom exec zsh po zmianie TERM. zsh nie reaguje na zmiany w TERM podczas pracy.
    2. upewnij się, że TERM jest rzeczywiście ustawiony na to, co zamierzałeś: echo $TERM
    3. 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.
    4. używasz screen czy tmux? 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óbuj TERM=screen-256color.
    5. jesteś na najnowszej wersji PuTTY?
    6. czy masz RC-pliki, które implementują skróty klawiszowe lub inne hacki? Spróbuj użyć domyślnych plików RC.
    7. 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.
 4
Author: Zenexer,
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... :-)

 3
Author: agnul,
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: -)

 0
Author: Sec,
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