Menghapus ruang yang tidak berguna di akhir prompt kanan zsh ($ RPROMPT)

18

Di zsh, selalu ada karakter spasi di kanan prompt kanan saya. Saya mencoba dengan .zshrc yang sangat sederhana seperti:

PROMPT="#"
RPROMPT="*"

Selalu ada spasi setelah * di sebelah kanan layar.

Berikut ini adalah tangkapan layar yang menunjukkan masalah (saya memilih ruang di salah satu baris). http://i.imgur.com/cnfa2eJ.png

Terima kasih.

Frozax
sumber

Jawaban:

20

TL; DR

Yang perlu Anda lakukan adalah meletakkan ini di ~/.zshrc(atau di file yang sama dengan tema prompt Anda):

ZLE_RPROMPT_INDENT=0

Detail

Dalam versi ZSH yang mengarah ke 5.0.2 nilai dalam kode sumber C ZSH disebut rprompt_off(yang mengatur offset margin kanan) sulit dikodekan ke 1.

Tetapi dalam rilis 5.0.5 , pengembang menambahkan kemampuan untuk menimpa nilai default ini dengan mengatur ZLE_RPROMPT_INDENTvariabel lingkungan.

The pemikiran untuk ini "indent" karena beberapa terminal yang lebih tua akan mulai bergulir jika sel terakhir dari layar memiliki karakter di dalamnya.

Untuk versi ZSH sebelum 5.0.5

Jika Anda menggunakan versi ZSH yang lebih lama dan tidak dapat memperbarui, Anda masih bisa membuang ruang itu dengan melakukan kedua hal berikut:

  1. Trik ZSH agar berpikir bahwa RPROMPT Anda adalah karakter yang lebih pendek daripada yang sebenarnya menggunakan pembungkus urutan tak terlihat standar:%{...%}
  2. Kemudian mengirimkan urutan pelarian kursor-kembali menggunakan terminfo: %{terminfo[cub1]}

Lihat FAQ dan pesan ini di milis untuk info lebih lanjut.

Anthony Michael Cook
sumber
5
Ini juga tampaknya menempatkan kursor input satu karakter ke kiri di tempat biasanya. Menggunakan petunjuk dalam pertanyaan ini, misalnya, kursor ditempatkan pada tanda pagar, bukan langsung ke kanan. (Bagi saya, mengatur offset ke nilai kurang dari nol membuat prompt dan kursor muncul di tempat yang benar. Diamati dengan zsh 5.0.8 dan 5.2.)
Rob Kennedy
Bekerja untuk saya di 5.2.
Anthony Michael Cook
5
Itu agak bekerja untuk saya di 5.2, tapi sekarang saya memiliki masalah dengan PROMPT: karakter terakhir di PROMPT menghilang dan beralih pelengkapan otomatis mengisi karakter terakhir dengan karakter pertama input saat ini. Misalnya %git<Tab>berubah menjadi%ggit
roboslone
Anda tidak perlu menggunakan trik untuk versi ZSH yang lebih baru.
Anthony Michael Cook
5
Setelah mengatur ZLE_RPROMPT_INDENT = 0, saya perhatikan masalah menggambar yang sama dengan prompt di sebelah kiri yang beberapa orang lain sebutkan di atas. Namun, hampir semuanya berfungsi seperti yang diharapkan jika saya menggunakan -1 bukannya 0, yaitu ZLE_RPROMPT_INDENT = -1. Saya melihat tip itu di github.com/bhilburn/powerlevel9k/issues/… . Hampir, karena dengan -1 ia tidak pernah menggunakan garis bawah jendela terminal pada macOS.
Marc Liyanage
2

Saya telah mengirim laporan bug ke pengelola zsh, tetapi tampaknya perilaku ini sesuai dengan desain. Namun masalah ini sangat mengganggu saya sehingga saya memutuskan untuk menambal dan mengkompilasi zsh sendiri sebagai perbaikan sementara. Jika Anda menggunakan OS X dan menggunakan Homebrew (seharusnya), maka Anda dapat menginstal zsh termasuk tambalan saya dengan menjalankan:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

Anda mungkin akan ingin menambahkan /usr/local/bin/zshuntuk /etc/shellsdan chsh -s /usr/local/bin/zshsesudahnya. Terakhir, inilah perbedaan mentah untuk siapa saja yang tertarik:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*
Patrick Oscity
sumber
PWS (pengelola zsh) baru saja memposting tambalan yang diperluas , jadi lekukan RPROMPT harus berada di, sumber resmi, segera.
mpy
Terima kasih telah mengirim tautan. Menantikan rilis berikutnya!
Patrick Oscity
1

Saya pikir ruang putih di sebelah kanan adalah kode keras. Tetapi Anda dapat menipu zshdengan pengaturan berikut:

RPROMPT="%{*%}"

yang pada prinsipnya mengatakan zshbahwa bintang itu tidak memiliki karakter; dari man zshmisc:

%{...%} Sertakan string sebagai urutan pelarian literal. Tali di dalam kurung kurawal tidak boleh mengubah posisi kursor. (...)

Kekurangannya adalah, bahwa Anda "menggeser" yang kosong ke akhir PROMPT:

| PROMPT = "#" |
| RPROMPT = "% {*%}" |
| # ■ * |

The |simbol menunjukkan tepi terminal, ■ kursor.


Gagasan lain adalah meningkatkan COLUMNS1:

COLUMNS=$((COLUMNS + 1))

Tetapi kita harus memikirkan cara bagaimana melakukan ini hanya untuk rendering prompt, tetapi tidak untuk perintah. Dan ini akan menelan karakter terakhir pada setiap baris pada baris perintah multi-baris.

mpy
sumber
1
Terima kasih. Saya mencoba bermain dengan trik% {...%}, berurusan dengan waktu dan status git saya yang ditampilkan di sebelah kanan. Saya tidak keberatan dengan ruang ekstra pada PROMPT karena saya biasanya punya satu. Namun, ada satu kelemahan besar dengan solusi ini: ketika saya mengaktifkan pelengkapan otomatis dengan TAB, ruang ekstra dihilangkan dan ia melakukan hal-hal aneh :)
Frozax