První dva znaky se opakovaly, když jsem používal Tab provést dokončení. Na níže uvedeném snímku obrazovky cd
se opakuje.
Zkoušel jsem rxvt-unicdoe, xterm, terminator. Všechny tyto emulátory terminálu mají tento problém.
Zsh verze 5.0.2, konfigurační soubor on-my-zsh
Přijatá odpověď:
Pokud se znaky na vašem příkazovém řádku někdy zobrazují posunuté, je to často proto, že zsh vypočítal špatnou šířku výzvy. Příznaky spočívají v tom, že displej vypadá dobře, pokud přidáváte znaky nebo přesouváte znak po znaku, ale je zkomolený (některé znaky se zobrazují více vpravo, než by měly), když používáte jiné příkazy, které pohybují kurzorem (Home , dokončení atd.) nebo když příkaz překrývá druhý řádek.
Zsh potřebuje znát šířku výzvy, aby věděl, kde jsou umístěny znaky příkazu. Předpokládá, že každá postava zaujímá jednu pozici, pokud není uvedeno jinak.
Jednou z možností je, že vaše výzva obsahuje únikové sekvence které nejsou správně ohraničeny. Escape sekvence, které mění barvu nebo jiné formátovací aspekty textu nebo které mění nadpis okna nebo jiné efekty, mají nulovou šířku. Musí být zahrnuty do konstrukce se závorkami procent %{…%}
. Obecněji, escape sekvence jako %42{…%}
říká zsh, aby předpokládal, že to, co je uvnitř složených závorek, má šířku 42 znaků.
Zkontrolujte tedy nastavení výzvy (PS1
, PROMPT
, nebo proměnné, na které odkazují) a ujistěte se, že všechny escape sekvence (jako \e[…m
změnit textové atributy – všimněte si, že může být přítomen prostřednictvím nějaké proměnné, jako je $fg[red]
) jsou uvnitř %{…%}
. Protože používáte oh-my-zsh, zkontrolujte jak svá vlastní nastavení, tak definice, které používáte z oh-my-zsh.
Stejný problém nastává v bash. Sekvence s nulovou šířkou ve výzvě musí být uzavřeny v \[…\]
.
Další možností je, že vaše výzva obsahuje jiné než ASCII znaky a že zsh (nebo jakákoli jiná aplikace) a váš terminál mají odlišnou představu o jejich šířce. K tomu může dojít, pokud existuje nesoulad mezi kódováním vašeho terminálu a kódování, které je deklarováno v shellu, a tato dvě kódování mají za následek různé šířky pro určité sekvence bajtů. Obvykle můžete narazit na tento problém, když používáte terminál bez Unicode, ale deklarujete národní prostředí Unicode nebo naopak.
Aplikace spoléhají na proměnné prostředí, aby znaly národní prostředí; relevantní nastavení je LC_CTYPE
, která je určena z proměnných prostředí LANGUAGE
, LC_ALL
, LC_CTYPE
a LANG
(platí první z nich, která je nastavena). Příkaz locale | grep LC_CTYPE
sděluje vaše aktuální nastavení. Obvykle je nejlepším způsobem, jak se vyhnout problémům s místním nastavením, nechat emulátor terminálu nastavit LC_CTYPE
, protože ví, jaké kódování očekává; ale pokud vám to nefunguje, nezapomeňte nastavit LC_CTYPE
.
Stejné příznaky se mohou objevit, když předchozí příkaz zobrazil nějaký výstup, který nekončil novým řádkem, takže výzva se zobrazí uprostřed řádku, ale shell si to neuvědomuje. V tomto případě by k tomu došlo pouze po spuštění takového příkazu, nikoli trvale.
Související:Přesměrování IO a příkaz head?
Pokud se řádek nezobrazuje správně, použijte příkaz redisplay
nebo clear-screen
(vázáno na Ctrl +L ve výchozím nastavení) to opraví.