Mengapa ZSH mengakhiri garis dengan simbol persen yang disorot?

46

Saya perhatikan ini kadang-kadang dengan berbagai aplikasi. Saya sering berpikir itu karena output dibatalkan lebih awal (ctrl + c, misalnya) atau yang serupa, dan zsh sedang mengisi karakter baris baru. Tapi sekarang rasa ingin tahu mendapatkan yang terbaik dari saya, karena sepertinya tidak melakukan ini di bash.

zsh

zsh

pesta

masukkan deskripsi gambar di sini

The SequenceProgram adalah sesuatu yang saya ditarik dari sebuah buku saat membaca tentang sertifikasi Jawa dan hanya ingin melihat apakah itu akan mengkompilasi dan menjalankan. Saya memang memperhatikan bahwa itu tidak menggunakan println()metode dari System.outpaket / kelas. Alih-alih itu menggunakan tua biasa print().

Apakah kurangnya karakter baris baru menjadi alasan saya mendapatkan simbol ini?

jktravis
sumber

Jawaban:

57

Ya, ini terjadi karena ini adalah "garis parsial". Dan secara default zsh pergi ke baris berikutnya untuk menghindari menutupinya dengan prompt .

Ketika garis parsial dipertahankan, secara default Anda akan melihat karakter terbalik + tebal di akhir baris parsial: "%" untuk pengguna normal atau "#" untuk root. Jika disetel, parameter shell PROMPT_EOL_MARK dapat digunakan untuk menyesuaikan bagaimana akhir garis parsial ditampilkan.

Leiaz
sumber
3
Untuk menguji melakukan ini: print -n "this is a test"laluprint "this is a test"
SergioAraujo
5
Saya sekarang telah dimasukkan PROMPT_EOL_MARK=''ke dalam .zshrc saya untuk menyembunyikan perbedaan antara mengikuti baris baru atau tidak pada output perintah.
geekQ
14

Itu fitur khusus zsh(dan sekarang fishjuga) untuk membiarkan Anda melihat dengan jelas garis yang tidak ditentukan dalam output perintah.

Dalam shell tradisional, jika perintah menampilkan beberapa data setelah karakter baris baru terakhir, atau, dengan kata lain, jika meninggalkan kursor terminal tidak di awal baris, prompt berikutnya oleh shell berakhir ditambahkan ke baris terakhir yang tidak tertembus. seperti dalam:

bash-4.4$ printf XXX
XXXbash-4.4$

Itu mengacaukan prompt, dan mudah untuk melewatkan itu di XXXsana terutama jika Anda punya prompt yang lebih menarik seperti itu. Ini juga memengaruhi posisi kursor yang menyebabkan gangguan tampilan saat Anda menggerakkan kursor.

zshmengatasinya, dengan menunjukkan bahwa output memiliki garis yang tidak ditentukan dengan %karakter dalam video tebal dan mundur, dan mengeluarkan prompt berikutnya di awal baris berikutnya:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

Itu melakukannya dengan mengeluarkan video terbalik %di akhir setiap perintah (sebelum setiap prompt), tetapi diikuti oleh 79 spasi (dengan asumsi terminal lebar 80 karakter), karakter CR (salah satu yang menyebabkan kursor kembali ke yang pertama kolom) dan urutan untuk menghapus ke akhir baris (dan kemudian prompt).

Dengan begitu, jika ada garis yang tidak ditentukan, karena kursor tidak ada di posisi pertama, 80 karakter itu akan membuat kursor bergerak ke baris berikutnya (dan itu %akan tetap ada). Jika tidak, maka %79 ruang tersebut akan berada pada satu baris yang akan dihapus setelahnya.

Sekarang, itu hanya berfungsi jika terminal tidak membungkus garis (misalnya, itu tidak akan berfungsi dengan benar setelah tput rmam). Jika Anda memiliki terminal yang lambat (seperti pada 9600 baud serial line), Anda mungkin benar-benar melihat %yang ditampilkan dan kemudian dihapus setelah setiap perintah, jadi zshAnda dapat menonaktifkan fitur itu:

unsetopt prompt_cr prompt_sp

Dengan begitu, zshberperilaku lebih seperti cangkang tradisional.

Anda juga dapat mengubah tanda itu dengan $PROMPT_EOL_MARKvariabel.

Stéphane Chazelas
sumber