Bagaimana saya bisa meletakkan baris baru di prompt zsh saya tanpa menyebabkan masalah redraw terminal?

12

Saya mencoba untuk memperbaiki masalah kecil (tapi menjengkelkan) dengan zsh prompt saya. Masalah yang saya lihat adalah ketika saya menggunakan terminal di lingkungan OS GUI (misalnya, Terminal.app atau iTerm 2 pada OS X 10.7.2) dan mengubah ukuran jendela terminal, terminal digambar ulang dengan petunjuk tambahan .

Saya telah mereproduksi masalah pada .zshrc bersih yang berisi yang berikut:

export PROMPT=">
"

Agar jelas, itu file dua baris. Ada baris baru literal dalam string, yang saya baca di beberapa tempat ( memang lama ) adalah cara untuk pergi. Ini berfungsi sampai saya mengubah ukuran jendela terminal, pada titik mana saya berakhir dengan string prompt duplikat. Misalnya jika saya membuka jendela baru, saya melihat ( *digunakan placeholder untuk kursor saya):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

Lalu ketika saya mengubah ukuran jendela, membuatnya lebih pendek, saya berakhir dengan:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

Jumlah cetakan ekstra cepat tampaknya sebanding dengan seberapa banyak saya mengubah ukuran jendela - biasanya vertikal. Jika saya menghapus baris baru dari string prompt, masalahnya hilang.

Saya sudah mencoba berbagai hal, seperti $(print ">\n"), atau mencoba memasukkan baris baru %{%}. Saya berasumsi ini ada hubungannya dengan fakta bahwa baris baru membingungkan apa pun yang menggambar, berapa lama sebenarnya prompt string, atau sesuatu. Apakah masalah ini dapat diperbaiki atau saya hanya harus hidup dengan itu?


sumber

Jawaban:

13

Masalah ini disebabkan oleh bagaimana ZSH mencetak ulang promt di acara pengubahan ukuran dan juga telah mengganggu saya sebelumnya. Solusinya adalah membuat $PROMPTsatu-baris dan mencetak baris pertama dari prompt dengan menggunakan precmd.

Jadi, dalam contoh Anda itu akan menjadi:

precmd() { print ">" }
export PROMPT=""

atau untuk contoh yang lebih canggih dengan ekspansi cepat dalam pernyataan cetak gunakan -rPparameter:

precmd() { print -rP "%~" }
export PROMPT="%# "

Jika Anda memiliki lebih dari satu precmd terdaftar, Anda perlu menggunakan add-zsh-hook precmd(lihat man zshcontrib).

K-os
sumber
1
Untuk pemula seperti saya, Anda dapat melihat -rP artinya di sini: cs.elte.hu/zsh-manual/zsh_17.html . Tampaknya itu printadalah perintah khusus ZSH, dan Googling "linux print" tidak memberikan Anda hasil yang sangat baik.
MikeWyatt
printadalah bagian dari zsh. Anda dapat melihat bantuan untuk itu dalam man zshbuiltins. Bash memiliki padanannya sendiri, tetapi saya tidak yakin mereka kompatibel.
Jim Stewart
10

Bagaimana dengan sesuatu yang seperti ini:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Đức Thanh Nguyễn
sumber
Saya suka solusi ini lebih baik daripada jawaban yang diterima. ini lebih portabel, dan memungkinkan saya untuk mempertahankan skrip yang sama antara lingkungan zsh dan bash saya
verboze