Používám FreeBSD 11 s PuTTY pro SSH. Zdá se, že kódy kláves klávesnice nejsou vůbec správně nastaveny – například pípá při šipce nahoru a vkládá znak „~“ pro většinu navigačních kláves, včetně základních, jako jsou šipky a klávesa Delete. Klávesnice je standardní britská anglická klávesnice. Psaní je skutečná bolest.
Četl jsem řadu vláken o nastavování kódů klíčů, jak v rc, tak v shellu, takže vím, že to tak můžu nastavit jako poslední možnost.
Bylo by ale velmi zvláštní, aby klient s tolik konfigurovatelností a OS s tak širokým využitím neměl společnou nějakou možnost/nastavení terminálu, které oba „prostě chápou“, které mohu nastavit na obou a voila – klávesy všechny (nebo většinou) fungují. Problém je v tom, že nevím, jak to najít, a když to najdu, jak to nastavit pro všechny budoucí relace.
Rozumím tomu, jak najít kód odesílaný terminálem pro jednotlivý klíč, takže jsem mohl své klíče nastavit tak, jeden po druhém. Ale rád bych našel základní nastavení terminálu pro můj shell rc a pro PuTTY, aby oba pochopili co nejvíce klíčů, takže musím nastavit jen pár výjimek, pokud je budu potřebovat.
Jak to mohu udělat?
Přijatá odpověď:
Existuje tolik knoflíků, které lze otáčet a otáčet. A mnoho rad na internetu lidé slepě následují. Jako vždy mnoho cest do Říma, ale když víte, jak spolu věci souvisí, jsou velmi jednoduché.
Ultra krátká odpověď zní:
Změňte řetězec terminálu v Putty z xterm
na putty
(v části Připojení -> Data -> Řetězec typu terminálu).
Typické úskalí, kterému je třeba se vyhnout:
Ujistěte se, že nenastavujete TERM
jinde ve vašich rc souborech.
Trochu delší odpověď:
Nejprve bych se ujistil, že skutečně používáte výchozí nastavení. Ze svého osobního notebooku s Windows 10 pomocí klávesnice DK (a mapování) se připojuji k nastavení FreeBSD 11.1 s mapováním DK. V mém případě klávesy se šipkami fungují podle očekávání na příkazovém řádku. Pohyb vlevo/vpravo na aktuálním řádku. Nahoru/dolů prochází historií příkazů.
Ověřil jsem to pro /bin/sh (výchozí uživatelský shell) i /bin/tcsh (výchozí kořenový shell). Můžete si přečíst o mušlích.
Píšete, že víte, jak můžete provést mapování kláves v souboru rc shellu. Koluje mnoho návrhů, jak to udělat. Ale obvykle to není to, co byste měli dělat.
Pro klávesové zkratky tcsh naleznete takové návrhy:
# Del(ete), Home and End
bindkey "\e[3~" delete-char
bindkey "\e[1~" beginning-of-line
bindkey "\e[4~" end-of-line
A podobné návrhy pro bash ( ~/.inputrc)
"\x7F": backward-delete-char
"\e[3~": delete-char
"\e[1~": beginning-of-line
"\e[4~": end-of-line
Ale spíše než nastavovat tyto vazby lokálně pro každou relaci a každý shell, měli byste pro tento účel raději použít termcap/terminfo (více o tom později).
V tomto kontextu je Putty vaším terminálem.
Výchozí pro Putty je nastavit TERM pro vaši relaci na „xterm“. Dělá to proto, že je přiměřeně kompatibilní s xterm. xterm
není odkaz na žádný terminál, ale na program Xterm.
Konfigurace PuTTY
Connection -> Data -> Terminal-type string: `xterm`
Když jste přihlášeni, můžete ověřit, že se toto nastavení promítá do vaší relace:
echo $TERM
xterm
Pokud $TERM neodpovídá tomu, co jste nastavili v Putty, možná jste ve svých rc souborech nastavili přepsání. Všimněte si varování pro /bin/sh
v ~/.profile
:
# Setting TERM is normally done through /etc/ttys. Do only override
# if you're sure that you'll never log in via telnet or xterm or a
# serial line.
# TERM=xterm; export TERM
Protože již nepoužíváme mnoho fyzických DEC VT100 xterm
je to, co uvidíte na mnoha místech.
I když ponecháte pouze TERM
jako xterm
získáte barevný výstup s výchozím Putty a FreeBSD jako ls -G
bude fungovat.
Někteří doporučují nastavit TERM
na xterm-color
, xterm-256
nebo rxvt-256color
získat „správnou“ podporu barev.
Ale pamatujte: Všechny tyto magické TERM
hodnoty jsou pouze mapování v databázi. Důvod xterm
je dnes tak rozšířené, že některé programy a skripty kontrolují, zda $TERM
začíná xterm
(což je hrozná představa).
To nás přivádí zpět k termcapu, který je výchozím nastavením na FreeBSD. Pokud chcete používat terminfo, budete si muset nainstalovat devel/ncurses. Více o tom viz:Jak mohu použít položky terminfo na FreeBSD?
Zdroj databáze termcap naleznete v textovém souboru /usr/share/misc/termcap
. Pokud v tomto souboru provedete změny, musíte spustit cap_mkdb
aby systém potvrdil změnu. Zde najdete odpověď na svůj hlavolam. Existuje explicitní TERM
nastavení pro Putty s názvem:putty
.
FreeBSD se pak rozhodlo neměnit nastavení pro xterm
aby odpovídalo chování Puttyho (pravděpodobně kvůli obavám o bojovnost). Ale byly dost pěkné, aby poskytly nastavení pro Putty.
Pokud tedy změníte výchozí nastavení Putty pro Terminal-type string:
z xterm
na putty
pak se to odráží v TERM
když se přihlásíte. A výchozí termín FreeBSD má pro toto položku.
A kouzlem a bez dotyku spousty rc souborů nyní máte funkční klávesy se šipkami (měl jsem to také s xterm), ale také Home/End se přesouvá na začátek/konec řádku a Del(ete) maže.
Bonus:
Zdá se, že výchozí definice tmelu nepodporuje všech 256 barev. Poté můžete upravit svůj termcap a přidat tyto dva řádky (a spustit cap_mkdb):
putty-256color:\
:pa#32767:Co#256:tc=putty:
Poté můžete nastavit TERM
na putty-256color
. Scott Robison navrhl, že by to mělo být přidáno – ale tuto změnu nezachytilo FreeBSD. Toto PR již nemohu najít v databázi.
Bonus 2:
Pokud chcete zachovat TERM
jako xterm
pak byste měli věnovat čas konfigurování Putty tak, aby odpovídalo tomu, co FreeBSD očekává od terminálu xterm.
Pokud přejdete do nastavení Terminál -> Klávesnice v nastavení Klávesy Home a End můžete změnit „Standardní“ na „rxvt“.
Díky této změně si všimnete, že klávesa Home funguje na příkazovém řádku (přesune se na začátek řádku). Ale End now nedělá nic.
Je tedy otázkou, jak přimět Putty, aby souhlasil s tím, co FreeBSD očekává od xtermu. Jen pro ukázku, že můžete jít i obráceně.
Související:jak správně nakonfigurovat příliv?