Karakter pertama dari perintah diulang di layar saat menyelesaikan

21

Dua karakter pertama diulang sementara saya gunakan Tabuntuk menyelesaikan. Pada tangkapan layar di bawah ini, cddiulangi.

masukkan deskripsi gambar di sini

Saya telah mencoba rxvt-unicdoe, xterm, terminator. Semua emulator terminal ini memiliki masalah ini.

Zsh versi 5.0.2, file konfigurasi on-my-zsh

jilen
sumber
Apakah karakter diulang dalam perintah yang dijalankan zsh, atau hanya ditampilkan? Apakah jumlah karakter berubah jika perintah lebih panjang dari dua karakter? Apakah nomor berubah ketika direktori saat ini berubah?
Gilles 'SO- stop being evil'
@Gilles char berulang tidak ada dalam perintah. Saya bisa menjalankan perintah.
jilen

Jawaban:

32

Jika karakter pada baris perintah Anda kadang-kadang ditampilkan pada offset, ini sering karena zsh telah menghitung lebar yang salah untuk prompt. Gejala-gejalanya adalah tampilan terlihat baik selama Anda menambahkan karakter atau memindahkan karakter demi karakter tetapi menjadi kacau (dengan beberapa karakter muncul lebih jauh dari seharusnya) ketika Anda menggunakan perintah lain yang menggerakkan kursor ( Home, penyelesaian, dll. ) atau ketika perintah tumpang tindih dengan baris kedua.

Zsh perlu mengetahui lebar prompt untuk mengetahui di mana karakter perintah ditempatkan. Diasumsikan bahwa setiap karakter menempati satu posisi kecuali dikatakan sebaliknya.

Satu kemungkinan adalah bahwa prompt Anda berisi urutan melarikan diri yang tidak dibatasi dengan benar. Escape sequence yang mengubah warna atau aspek pemformatan teks lainnya, atau yang mengubah judul jendela atau efek lainnya, memiliki lebar nol. Mereka perlu dimasukkan dalam konstruk persen-kawat gigi%{…%} . Lebih umum, urutan melarikan diri seperti %42{…%}memberitahu zsh untuk mengasumsikan bahwa apa yang ada di dalam kawat gigi itu lebar 42 karakter.

Jadi periksa pengaturan prompt Anda ( PS1,, PROMPTatau variabel yang mereka rujuk) dan pastikan bahwa semua urutan melarikan diri (seperti \e[…muntuk mengubah atribut teks - perhatikan bahwa itu mungkin hadir melalui beberapa variabel seperti $fg[red]) ada di dalam %{…%}. Karena Anda menggunakan oh-my-zsh, periksa pengaturan Anda sendiri dan definisi yang Anda gunakan dari oh-my-zsh.

Masalah yang sama muncul di bash. Ada urutan dengan lebar nol dalam prompt harus disertakan \[…\].

Kemungkinan lain adalah bahwa prompt Anda berisi karakter non-ASCII dan bahwa zsh (atau aplikasi lain) dan terminal Anda memiliki gagasan yang berbeda tentang seberapa lebar mereka. Ini bisa terjadi jika ada ketidaksesuaian antara pengkodean terminal Anda dan pengkodean yang dinyatakan dalam shell, dan dua pengkodean menghasilkan lebar yang berbeda untuk urutan byte tertentu. Biasanya Anda mungkin mengalami masalah ini saat menggunakan terminal non-Unicode tetapi mendeklarasikan lokal Unicode atau sebaliknya.

Aplikasi bergantung pada variabel lingkungan untuk mengetahui lokal; pengaturan yang relevan LC_CTYPE, yang ditentukan dari variabel lingkungan LANGUAGE, LC_ALL, LC_CTYPEdan LANG(yang pertama ini yang ditetapkan berlaku). Perintah locale | grep LC_CTYPEmemberi tahu Anda pengaturan Anda saat ini. Biasanya cara terbaik untuk menghindari masalah lokal adalah membiarkan emulator terminal diatur LC_CTYPE, karena ia tahu apa yang diharapkan oleh pengkodean; tetapi jika itu tidak berhasil untuk Anda, pastikan untuk mengatur LC_CTYPE.

Gejala yang sama dapat terjadi ketika perintah sebelumnya menampilkan beberapa output yang tidak berakhir di baris baru, sehingga prompt ditampilkan di tengah baris tetapi shell tidak menyadarinya. Dalam hal ini itu hanya akan terjadi setelah menjalankan perintah seperti itu, tidak terus-menerus.

Jika suatu baris tidak ditampilkan dengan benar, perintah redisplayatau clear-screen(terikat ke Ctrl+ Lsecara default) akan memperbaikinya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya kira saya mungkin kehilangan font terkait, saya perhatikan char pertama aneh. ->Saya kira ini diharapkan
jilen
@ jilen Ah, ini bisa menjadi masalah lain yang saya lupa sebutkan: mungkin prompt Anda berisi karakter non-ASCII dalam pengkodean yang berbeda dari terminal Anda, dengan salah satu atau kedua pengkodeannya multibyte. Jika Anda ingin bantuan dengan itu, posting output dari localedan dari echo $PS1 | od -t x1(dan hal yang sama dengan variabel lain yang digunakan oleh $PS1).
Gilles 'SO- stop being evil'
2
Saya lupa mengatur lokal (saya menggunakan archlinux, lokal tidak diset secara default). Setelah menetapkan lokal, masalah ini diperbaiki. Terima kasih banyak, teman !!!!
jilen
Saya membatalkannya karena, yah, itu cukup mengagumkan. Tapi lolos tidak harus benar-benar dimasukkan dalam tanda kurung jika Anda menangani jumlah kursor sendiri. memanggil fungsi subshelled telah bekerja untuk saya di masa lalu - atau pengalihan yang masih mendarat di / dev / tty tanpa melibatkan stdout mungkin bekerja. Metode lain yang berfungsi - gunakan \e{7,8}untuk menyimpan / mengembalikan status kursor.
mikeserv
Itu LC_CTYPEyang memperbaikinya bagi saya. Saya mengaturnya C, ketika saya tidak menyetelnya , semuanya bekerja. Terima kasih.
jmaloney
14

Saya memiliki masalah yang sama dan menemukan solusi saya di sini: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Masukkan saja yang berikut ke dalam ~/.zshrc.

export LC_CTYPE=en_US.UTF-8

xh3b4sd
sumber
1
Terima kasih atas petunjuk anda! Saya, bagaimanapun, harus mengatur ulang seluruh yang localesaya gunakan, tetapi itu berhasil untuk saya. Jawaban ini memberikan langkah-langkah yang diperlukan untuk Ubuntu.
maks
Terima kasih banyak! Menyelamatkan saya banyak dari kejengkelan
Moshe
1

Saya memiliki masalah ini di iTerm 2 di macOS. Saya akhirnya menyelesaikannya dengan pergi ke Preferensi -> Profil -> Teks dan centang "Gunakan Unicode Versi 9 Lebar".

Silwing
sumber
Wow, ini benar-benar berhasil. Terima kasih!
Paul Calabro
1

Saya mengalami masalah ini menggunakan gambar lts docker ubuntu ( ubuntu:latest). Saya memperbaikinya dengan instruksi yang diberikan pada halaman yang sesuai: 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
Gleb Samsonenko
sumber