GNU/Linux >> Znalost Linux >  >> Linux

První znaky příkazu se opakovaly na displeji při dokončení?

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í.


Linux
  1. Příkaz Linux ls

  2. Vygenerujte distribuci velikostí souborů z příkazového řádku

  3. Jak rychle změnit první slovo v příkazu Bash?

  1. Jak přesměrovat výstup příkazu do souboru, když příkaz vyzve uživatele k zadání?

  2. Jak zachytit první IP adresu z příkazu ifconfig?

  3. Proč slabtop -o vrací pouze prvních 23 řádků, když je příkaz rourou?

  1. Jak zobrazit řídicí znaky (^c, ^d, ^[, …) odlišně v shellu?

  2. Jak zastavit příkaz Najít po prvním zápase?

  3. Kam jdou soubory, když je vydán příkaz Rm?