Diyelim ki benim istemi bu gibi görünüyor (_, imlecimi gösterir)
~ % _
Bu şekilde görünmesini sağlayabilmemin bir yolu var mı?
~ % _
[some status]
Asıl soru zsh ile ilgiliydi, ama şimdi başka cevapları da var.
Diyelim ki benim istemi bu gibi görünüyor (_, imlecimi gösterir)
~ % _
Bu şekilde görünmesini sağlayabilmemin bir yolu var mı?
~ % _
[some status]
Asıl soru zsh ile ilgiliydi, ama şimdi başka cevapları da var.
Yanıtlar:
Aşağıdaki ayarlar çalışıyor gibi görünüyor. Komut satırı ilk satıra taşarsa, ikinci satırdaki metin kaybolur. preexec
Fonksiyon komutunu çalıştırmadan önce ikinci satırı siler; eğer saklamak istiyorsan, değiştir preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
çıkışlar zsh el kitabında ( man zshmisc
) belgelenmiştir .
Terminfo bir terminal erişim API'sidir. Zsh, terminfo
terminal açıklama veritabanına erişim sağlayan bir modüle sahiptir : $terminfo[$cap]
terminalin kabiliyetini kullanmak için $cap
, yani $cap
komutunu çalıştırmak için gönderilecek karakter dizisidir . Daha man 5 terminfo
fazla bilgi için (Linux'ta bölüm numarası diğer birliklere göre değişebilir) bakın.
İşlemlerin sırası: imleci bir satır aşağı ( cud1
) hareket ettirip sonra geri ( cuu1
); imleç pozisyonunu kaydet ( sc
); imleci bir satır aşağı oynat; baskı [some status]
; imleç konumunu geri yükleyin. Baştaki aşağı-yukarı bit sadece komut isteminin ekranın en alt satırında olması durumunda gereklidir. Preexec satırı ikinci satırı ( el
) siler, böylece komutun çıktısı ile karışmaz .
İkinci satırdaki metin terminalden daha genişse, ekran bozuk olabilir. Tamir etmek için bir tutam içinde Ctrl+ kullanın L.
bash
Gilles 'zsh çözümünün bir eşdeğeri. Bash'in yerel bir terminfo modülü yoktur, ancak tput
(birlikte verilen terminfo
) komutu da aynı şeyi yapar.
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
Terminal, yeteneklerden birini desteklemiyorsa, tek satırlık istemlere geri döner.
trap
Hat taklit zsh en bir hacky yoludur preexec
fonksiyonu. Daha fazla bilgi için /superuser/175799/ adresine bakın .
EDIT : Gilles 'yorumlarına göre geliştirilmiş senaryo.