Bir zsh isteminde yolu biçimlendirmek nasıl?


23

Okunabilir renkli bir yol bulmayı çok isterim. Örneğin, geri dönmek için sadece% ~ kullanmak yerine , yolu ayırıcıları vurgulamak ~/path/to/fooüzere biçimlendirmek istiyorum ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo.

PROMPT içeriğini, her ifadede yol ifadesinin yeniden değerlendirileceği şekilde tanımlayabilir miyim? ${${(%):-%~}//\//_some_format_expression/}Açıkçası gibi bir şey çalışmıyor.

Yoksa bunu daha da hacketmemeli ve PROMPT değerini bir dizini değiştirdiğimiz her seferinde sıfırlanmaya zorlamalı mıyım?

Yol biçimlendirme hedefine ulaşan herhangi bir çözüm memnuniyetle karşılanacaktır.

Teşekkürler :)


eğer hala
varsanız

Yanıtlar:


37

zsh

Bunu dene:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

İşte istemde bir dökümü:

  • PROMPT_SUBST komut isteminde komut değiştirmeyi açar (ve parametre genişletme ve aritmetik genişletme)
  • %{...%} - bir kaçış dizisi
  • $(pwd|grep --color=always /)- geçerli dizini yazdır ve şunu /vurgula - renk, $ GREP_COLORS ortam değişkenine (veya varsayılan değerine bağlı olacaktır) - koyu kırmızı varsayılandır
  • %${#PWD}G- geçerli dizinin adındaki karakterlerin uzunluğunu bir aksaklık değeri olarak kullanın. Bu, kabuğun %{, ANSI kaçış dizileri içeren dizinin gerçek uzunluğu yerine önceki karakter dizisinin (" " den sonra ) uzunluğunu göz önünde bulundurmasını sağlar . Bu, kabuğun imlecin isteminin sonuna göre konumu hakkında karışmasını önler.
    - - - - - - - bu sorunuza cevap veren kısmın sonu - - - - - - -
  • %(!.%F{red}.%F{cyan}) - eğer bu ayrıcalıklı bir kabuksa (kök) ön plan rengini kırmızıya ayarla, aksi takdirde camgöbeği
  • %n - kullanıcı adını çıkar
  • %f - ön plan rengini varsayılan değerine sıfırlayın
  • @ - tabelaya bir hazır bilgi
  • %F{yellow} - ön rengi sarıya çevirir
  • %m - hostname çıktısı
  • %f - ön plan rengini varsayılan değerine sıfırlayın
  • %(!.%F{red}.) - eğer bu ayrıcalıklı bir kabuksa (kök) ön plan rengini kırmızı
  • %#- #ayrıcalıklı bir kabuk veya %imtiyazsız bir kabuk için
  • %f - ön plan rengini varsayılan değerine sıfırlayın

Soru yolu ilgilendirdiği için yolu ilk olarak bu vurgunun içine koydum.

alt metin

$GREP_COLORSDeğişkenleri işleyerek root (ayrıcalıklı) olup olmadığına bağlı olarak eğik çizgi rengini değiştiren bir zsh sürümü :

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

darbe

Bash'de benzer bir bilgi istemi yapabilirsiniz. Bu örnekte, önce kullanıcı ve ana bilgisayar adını koydum ve UID 0 olduğunda eğik çizgilerin rengi de değişir. Uyarı: bu, Bash'in $PS1komut istemi değişkeninin üzerine yazar . Özel bir şey yapmıyorsanız ya da doğrudan bu değişkeni ayarladığınızda davranışın değişmesini beklemiyorsanız ve bu geçerliyse, bu bir sorun olmamalıdır. Ayrıca, bu " usercolor" adında bir değişkeni , başka bir şeyle çarpışabilir, ancak her şey bir işleve koyulabilir ve değişken yerel olarak bildirilir.

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'

alt metin

Bash'in eğik çizgileri koşullu olarak renklendirmek için (grep kullanmak yerine) parametre genişletme sübstitüsyonunu kullanmak için zsh'nin "glitch" özelliğine sahip olmaması gerçeğinden faydalandım.


Bana aptal diyebilirim, fakat sahip olduğum tek yanlış kısım PROMPT tanımında tek tırnak yerine çift tırnak kullanmaktı. Thanks :)
Nicolas Dumazet

@NicDumZ, komik, dün başka bir yerde bu soruna yaklaşık 20 dakika harcadım :)
Dan Rosenstark

1
Bu kitlesel (geeky ve) serin. Teşekkürler ...
Dan Rosenstark

Bunu Bash'de nasıl yapacağınız ya da Bash'de çalışmadığı hakkında bir fikriniz var mı? Benim için Bash ile terminalime başladığım ilk dizinde takılıyor ve dolaştığımda güncelleme yapmıyor. Sadece $ (pwd | grep --color = always /) kullandım ve PS1'ime koydum ve garip davranışlar yaptım. Düzenleme: OH! Bash bölüm lol görmedim.
Ibrahim

Aslında, PS1 hilenizi Bash için kullanmaya çalışıyorum, daha karmaşık istemi ve işe yaramazsa, özür dilerim tekrar takılıyor. Ama pasajın olduğu gibi çalışıyor. PROMPT_COMMAND'ın amacı nedir? Elimde bu var: github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh adresindePS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ " tanımlanan renkler
İbrahim

4

Etrafta gezdikten sonra, geçersiz kılacak bir çözüm sağlayabilirim chpwd:

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • Geçici kodlardan kurtulmak için bu kodu geliştirmenin bir yolu my_pathvar mı? % / İçini doğrudan değiştiremiyorum ~ ...
  • Her bir dizin değişikliğini çağırmamak için dinamik bir sözdizimi kullanan herhangi bir çözüm dopromptmuhtemelen daha temizdir.

4

Saf bir zsh çözümü:

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} Geçerli yol.
  • ${xxxxx//\//${PR_BOLD_RED}/%f} her / in xxxxx’i koyu kırmızı renkli olanla değiştirir
  • ve tabii ki PROMPT_SUBST açık olmalıdır.

Testlerimde çift alıntı kullanmak zorunda kaldım, bu ikame edilmesine izin vermiyor. Her şey tek tırnak işaretleri ile iyi çalışıyor.


$PR_BOLD_REDBaşka bir yerde tanımlamış olmalısınız . Ben kullanmak zorunda PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f 'dahil çok garip "kırmızı" saniye sonra kapatma küme ayracı (yalnızca) ait kaçması.
sonraki duyuruya kadar duraklatıldı.

evet, Aaron Toponce'in pthree.org/wp-content/uploads/2009/03/zsh_prompt adlarını kullanıyorum ve faydalı buldum. Bunun yanında, hiçbir şeyden kaçmak zorunda değilim, sağlanan şekilde çalışıyor.
Nicolas Dumazet

0

İşte girişimim (NicDumZ'lere dayanarak):

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

Fark şu ki, renkli yol kullanıyorum, bu yüzden eğik çizgi renklendiğinde yol için orijinal rengime geri dönmem gerekiyor. Benim durumumda yol normalde sarıdır ve eğik çizgi macenta ile renkli hale gelir, sonra sarıya döner. Ayrıca% F% f dizilerini benim için çok daha okunaklı göründüğü için kullanmayı tercih ediyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.