Komutun ilk karakterleri, tamamlandığında ekranda tekrarlandı.


21

Ben Tabtamamlamayı yaparken ilk iki karakter tekrarlandı . Aşağıdaki ekran görüntüsünde cd, tekrarlanır.

görüntü tanımını buraya girin

Rxvt-unicdoe, xterm, terminator'ü denedim. Bütün bu terminal emülatörleri bu konuda var.

Zsh sürüm 5.0.2, yapılandırma dosyası -my-zsh


Zsh'nin yürüttüğü komutta karakterler tekrarlanıyor mu, yoksa sadece gösteriliyor mu? Komut iki karakterden uzunsa karakter sayısı değişiyor mu? Geçerli dizin değiştiğinde sayı değişiyor mu?
Gilles 'SO- kötülükten vazgeç'

@Gilles Tekrarlanan karakter komutta mevcut değil. Komutu çalıştırabilirim.
jilen

Yanıtlar:


32

Komut satırınızdaki karakterler bazen bir ofsette görüntüleniyorsa, bunun nedeni genellikle zsh isteminin yanlış genişliğini hesaplamış olmasıdır. Belirtiler, imleci hareket ettiren diğer komutları ( Home, tamamlama, vb. ) Kullandığınızda karakter eklediğiniz veya karakter karakter taşıdığınız sürece ekranın iyi görünmesi ancak bozuk (bazı karakterlerin olması gerekenden daha doğru görünmesi) olur . ) veya komut ikinci bir satıra geçtiğinde.

Zsh komutun karakterlerinin nereye yerleştirildiğini bilmek için istemin genişliğini bilmelidir. Aksi söylenmediği sürece her karakterin bir pozisyon işgal ettiği varsayılmaktadır.

Bir olasılık, isteminizin uygun şekilde sınırlandırılmayan kaçış dizileri içermesidir. Metnin rengini veya diğer biçimlendirme yönlerini değiştiren veya pencere başlığını veya diğer efektleri değiştiren çıkış dizileri sıfır genişliğe sahiptir. Onlar bir yüzde parantez yapı içinde yer alması gerekir%{…%} . Daha genel olarak, benzeri bir kaçış dizisi %42{…%}, zsh'a parantezlerin içindekilerin 42 karakter genişliğinde olduğunu varsaymasını söyler.

Bu yüzden bilgi istemi ayarlarınızı ( PS1, PROMPTya da referans gösterdikleri değişkenleri) kontrol edin ve tüm çıkış dizilerinin ( \e[…mmetin özelliklerini değiştirmek gibi - bunun gibi bir değişken aracılığıyla bulunabileceğini unutmayın $fg[red]) içeride olduğundan emin olun %{…%}. Oh-my-zsh kullandığınız için, hem kendi ayarlarınızı hem de oh-my-zsh'dan kullandığınız tanımları kontrol edin.

Aynı sorun bashta da ortaya çıkıyor. İçinde bulunması gereken bir istemde sıfır genişlikte diziler var \[…\].

Başka bir olasılık, isteminizin ASCII olmayan karakterler içermesi ve zsh'nin (veya başka herhangi bir uygulamanın) ve terminalinizin ne kadar geniş oldukları konusunda farklı bir fikre sahip olmasıdır. Bu, terminalinizin kodlaması ile kabukta belirtilen kodlama arasında bir uyumsuzluk varsa ve iki kodlama belirli bayt dizileri için farklı genişliklerle sonuçlanırsa olabilir. Genellikle, Unicode olmayan bir terminal kullanırken, ancak bir Unicode yerel ayarı veya tam tersini bildirirken bu sorunla karşılaşabilirsiniz.

Uygulamalar yerel ayarları bilmek çevre değişkenlerine dayanır; İlgili ayardır LC_CTYPEortam değişkenleri belirlenir, hangi LANGUAGE, LC_ALL, LC_CTYPEve LANG(set olduğunu Bunlardan ilki geçerlidir). Komut locale | grep LC_CTYPEsize mevcut ayarlarınızı gösterir. Genellikle yerel sorunlardan kaçınmanın en iyi yolu, terminal emülatörünün set etmesine izin vermektir LC_CTYPE; ancak bu sizin için işe yaramazsa, ayarladığınızdan emin olun LC_CTYPE.

Aynı komut, önceki komut yeni bir satırda bitmeyen bazı çıktılar gösterdiğinde ortaya çıkar, böylece bilgi istemi satırın ortasında görüntülenir, ancak kabuk bunu anlamaz. Bu durumda, böyle bir komutu çalıştırdıktan sonra gerçekleşecek, ısrarla değil.

Bir çizgi düzgün görüntülenmezse, komut redisplayveya clear-screen( varsayılan olarak Ctrl+ ' ya bağlı L) düzeltecektir.


Sanırım muhtemelen ilgili yazı tipini özlüyorum, ilk karakterin garip olduğunu fark ettim. Beklenen ->bence
jilen

@ jilen Ah, bu bahsetmeyi unuttuğum başka bir sorun olabilir: belki de isteminiz ASCII olmayan karakterleri terminalinizden farklı bir kodlamada içerir, kodlamaların biri veya ikisi birden çok baytlı olur. Yanında yardım istiyorsanız, çıktısını gönderebilir localeve echo $PS1 | od -t x1(tarafından kullanılan diğer değişkenle ve aynı şeyi $PS1).
Gilles 'SO- kötülük' dur

2
Yerel ayarı ayarlamayı unuttum (archlinux kullanıyorum, yerel ayar varsayılan olarak ayarlanmadı). Yerel ayarlandıktan sonra bu sorun giderildi. Çok teşekkürler, adamım !!!!
jilen

Ben bunu yücelttim çünkü çok güzel. Ancak imleç sayımını kendi başınıza tutarsanız, çıkışların kesinlikle parantez içine alınmasına gerek yoktur. altta kalmış bir işlev aramak geçmişte benim için işe yaradı - ya da hala stdout kullanmadan / dev / tty'ye inen yönlendirmeler işe yarayabilir. Çalışmış olan diğer yöntemler - \e{7,8}imleç durumlarını kaydetmek / geri yüklemek için kullanılır .
mikeserv

Bu LC_CTYPEbenim için düzeltti. Ayarladım C, ayarladıysam , her şey işe yaradı. Teşekkürler.
jmaloney

14

Aynı problemi yaşadım ve çözümümü burada buldum: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Basitçe aşağıdakileri içine koyun ~/.zshrc.

export LC_CTYPE=en_US.UTF-8


1
Tavsiyen için teşekkürler! Ancak, kullandığım bütünü sıfırlamak zorunda kaldım locale, ancak benim için çalıştı. Bu cevap Ubuntu için gerekli adımları sunar.
en fazla

Çok teşekkür ederim! Beni bir çok kırgınlıkla kurtardı
Moshe

1

MacOS'ta iTerm 2'de bu sorunu yaşadım. Tercihler -> Profiller -> Metin bölümüne giderek ve "Unicode Sürüm 9 Genişliklerini Kullan" seçeneğini işaretleyerek çözdüm.


Vay, bu gerçekten işe yaradı. Teşekkürler!
Paul Calabro

1

Bu sorunu ubuntu lts docker image ( ubuntu:latest) kullanarak anladım . İlgili sayfada verilen talimatlarla düzelttim: https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.