Jak mogę zmienić kolor mojego monitu w zsh (inny niż zwykły tekst)?


121

Aby lepiej rozpoznawać początek i koniec danych wyjściowych w wierszu poleceń, chcę zmienić kolor mojego znaku zachęty, tak aby wyraźnie różnił się od wyników programu. Czy ktoś może mi podpowiedzieć, gdy używam zsh?

Odpowiedzi:


58

Oto przykład, jak ustawić czerwony monit:

PS1=$'\e[0;31m$ \e[0m'

Magia polega na \e[0;31m(włącz czerwony pierwszy plan) i \e[0m(wyłącz atrybuty postaci). Nazywa się to sekwencjami ucieczki. Różne sekwencje ucieczki dają różne wyniki, od bezwzględnego pozycjonowania kursora, przez kolor, po możliwość zmiany paska tytułu okna i tak dalej.

Aby uzyskać więcej informacji na temat sekwencji ucieczki, zobacz wpis Wikipedii dotyczący kodów ucieczki ANSI


3
Używam PROMPT = '[%!]' W moim .zshrc. Jak możesz to pokolorować? Nie udało mi się uruchomić PROMPT = '\ e [0; 31m [%!] \ E [0m' 'w moim .zshrc.
Léo Léopold Hertz 준영

3
@ erikb85: dlaczego mówisz, że to źle? Czy jest coś, co mogę zrobić, aby odpowiedź była lepsza? Dla mnie wykonanie powyższego daje mi czerwony znak dolara, więc nie rozumiem, dlaczego myślisz, że to źle.
Bryan Oakley,

4
Działa, ale $ przed łańcuchem powoduje błąd zshrc. Kiedy używam tabulacji, tekst jest umieszczony po lewej stronie. Wolę odpowiedź @Joe the Person
Moebius

1
Zgadzam się @Moebius. Chciałem, żeby ten działał, był jasny i prosty, ale kompletnie
psuje

2
Myślałem, że zsh nie potrzebuje szalonych, dziwnych rzeczy ucieczki ANSI ... musi być lepsza odpowiedź ...
Charlie Parker

264

Umieść to w ~/.zshrc:

autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

Obsługiwane Kolory:
red, blue, green, cyan, yellow, magenta, black, i white(z tej odpowiedzi ), choć różne komputery mogą mieć różne ważne opcje.

Kody kolorów otaczających (i wszelkie inne niedrukowalne znaki) z %{....%}. Ma to na celu poprawne działanie zawijania tekstu.

Dodatkowo, oto jak możesz to zrobić z przycinaniem katalogów z tego miejsca .

PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%(5~|%-1~/.../%3~|%4~) %{$reset_color%}%% "

3
Zgoda, zdecydowanie lepsza odpowiedź (na szczęście ta odpowiedź była trzecim wynikiem w Google;)
nowość123456

3
nie działa dla mnie. :(zsh: colors: function definition file not found
balki

Czy używasz ZSH4? Myślę, że to nie działa na wersjach mniejszych niż 4.3.11. Jeśli masz najnowszą wersję, być może nie używa ona odpowiednich plików.
Joe the Person,

Jakie są prawidłowe wartości kolorów?
chakrit

12
to %{...%}oznacza, że zawartość będzie interpretowane jako dosłownym sekwencji sterującej, to kursor przyzwyczajenie porusza się podczas drukowania sekwencji. Jeśli tego nie używasz, kody kolorów mogą w rzeczywistości przesuwać kursor i powodować niepożądane efekty. Jest to udokumentowane w Visual Effectssekcji na stronie podręcznika zshmisc
Bruno Penteado

69

Zsh posiada wbudowane kolorowe podpowiedzi. Próbować

autoload -U promptinit && promptinit

a następnie prompt -lwyświetla listę dostępnych podpowiedzi, wyświetla -p firepodgląd zachęty „ogień”, -s fireustawia ją.

Kiedy jesteś gotowy, aby dodać monit, dodaj coś takiego poniżej linii automatycznego ładowania powyżej:

prompt fade red

Czy istnieje sposób na pokolorowanie wszystkich motywów? Podoba mi się monit Waltersa, ale chciałbym, aby był na czerwono.
Pat Myron

25

Nie sądzę, że autoload -U colors && colorsjest to już potrzebne i można po prostu zrobić:

PS1="%{%F{red}%}%n%{%f%}@%{%F{blue}%}%m %{%F{yellow}%}%~ %{$%f%}%% "

aby osiągnąć ten sam rezultat, co odpowiedź FireDude . Więcej informacji można znaleźć w dokumentacji ZSH .


FYI. Ja tylko starałem się Ubunutu 11.04 i kolory nie działa dla mnie bezautoload -U colors && colors
dpc.pw

2
Dziwne. Działa dla mnie na OS X i Ubuntu 10.04.
Andrew Marshall,

@Andrew Marshall Tak, ale jest bardziej prawdopodobne, że będzie działać autoloadna.
Joe the Person

@ fireDude67 Jak ustawić autoload on?
balki

1
Jeśli nie potrzebujesz autoload -U colors, oznacza to, że Twoja dystrybucja ma już go w innym pliku inicjującym zsh. Nadal powinieneś uwzględniać to w skryptach, którymi chcesz się podzielić z innymi.
kindall

23

Dostępne kolory:

for i in {1..256}; do print -P "%F{$i}Color : $i"; done;

                                      


Dostępne zmienne:

  • %F{118} (Od 1 do 256)
  • $FG[018] (Od 1 do 256)
  • $fg[magenta] (magenta, czerwony, biały, żółty, czarny, niebieski, cyjan, zielony)

Przykład podpowiedzi:

PS1='%(?.%F{green}.%F{green})%n@%m:%~%# %f'

Zdobyć

PS1='%{$fg[gray]%}[%T][%n@%m%{$reset_color%}:%c%{$reset_color%}%{$fg[gray]%}$(git_prompt_info)]$(prompt_char)%{$reset_color%} ' 

Zdobyć


Zainstalować:

Definicję zmiennych (PS1 / PROMPT) należy dodać do ~/.zshrc

Równie dobrze możemy ponownie zdefiniować zmienną PS1 w bieżącym monicie, aby od razu ją przetestować (zmiany nie są zapisywane).


15

Powyższa odpowiedź Bryana Oakleya zawiera usterkę, na którą już zwrócono uwagę, a rozwiązanie zaproponowane przez Andrew Marshalla, choć nie ma usterki, nie oznacza jednak, że jest ona oczywista ze względu na zbyt duże dostosowanie kolorów.

Ponieważ macOS Catalina prosi, aby zsh był odtąd domyślną powłoką, myślę, że kilka innych osób może chcieć dostosować swój monit i może przyjść tutaj po odpowiedź. Pomyślałem więc, że spróbuję podać szersze podsumowanie i poruszyć inne bardzo powiązane pojęcia, które pozwalają na większą personalizację.

3-cyfrowe kody dla różnych kolorów. Przede wszystkim możemy znaleźć tutaj 3-cyfrowe kody dla różnych kolorów: https://unix.stackexchange.com/a/124409/194343 . Na przykład 214 to jakiś pomarańczowy kolor.

Pierwszy plan i tło. Drugą kluczową informacją jest to, że dla F oreground i bac K naziemnych kolorów można określić to, co chcą z F i K odpowiednio. Źródłem jest podręcznik zsh dotyczący efektów wizualnych: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects

Na przykład następujące dwa polecenia

autoload -U colors && colors
export PS1="%F{214}%K{000}%m%F{015}%K{000}:%F{039}%K{000}%~%F{015}%K{000}\$ "

przedstaw nazwę hosta w kolorze pomarańczowym z czarnym tłem, po którym następuje dwukropek w kolorze białym z czarnym tłem, a następnie bieżący katalog roboczy w kolorze jasnoniebieskim z czarnym tłem, a następnie biały znak dolara z czarnym tłem.

Więcej powiązanych informacji znajduje się poniżej.

Szybkie informacje po prawej stronie. Na przykład dodanie sygnatury czasowej. Zobacz https://superuser.com/a/1251045/290299 . Oczywiście można to oznaczyć kolorami, na przykład jakimś jasnoniebieskim / fioletowym kolorem, na przykład:

RPROMPT="%F{111}%K{000}[%D{%f/%m/%y}|%@]"

Kolory dla ls. Po przeczytaniu instrukcji ls, można na przykład aktywować kolory do lsużycia następujących dwóch poleceń:

export CLICOLOR=1
export LSCOLORS=gafacadabaegedabagacad

Na koniec ostatnia uwaga, której nie testowałem, ponieważ jestem zadowolony z mojej konfiguracji, inną drogą może być dla kogoś zainstalowanie portu coreutilsz MacPorts, a następnie użycie gdircolors(źródło: https://unix.stackexchange.com/a/174596 / 194343 ). (Mogę edytować tę ostatnią część w przyszłości, ponieważ wszystkie powyższe są powiązane elementy, które sprawiają, że codzienne życie jest o wiele przyjemniejsze i łatwiejsze w radzeniu sobie z nimi).


1
To niezwykle pomocna odpowiedź. Dziękuję za złożenie tego do kupy.
shaunakde

@shaunakde Nie ma za co! :)
MightyMouse

4

Odkryłem, że w przypadku zsh5 (domyślnego w Debianie Jessie) wszystkie te rozwiązania działają:

  • $'\e[00m
  • $fg[white]
  • $fg{white}

Teraz mają problem: przesuwają kursor, powodując brzydką naklejkę podczas przechodzenia w tabulator (do automatycznego uzupełniania). Rozwiązaniem jest po prostu otoczenie sekwencji ucieczki %{FOOBAR%}. Zajęło mi trochę czasu, zanim to zrozumiałem. W przypadku drugiego i trzeciego rozwiązania colorsmoduł ładowania jest obowiązkowy. Aby pierwsze rozwiązanie było czytelne, wystarczy zdefiniować zmienne dla używanych kolorów.


2

Aby uzyskać monit w kolorze zależnym od statusu wyjścia ostatniego polecenia, możesz użyć tego:

PS1='%(?.%F{green}.%F{red})%n@%m:%~%# %f'

Po prostu dodaj tę linię do swojego ~/.zshrc.

Dokumentacja zawiera listę możliwych zastępczych.


To najlepsze rozwiązanie tutaj, bardzo dziękuję.
Eddy Ekofo

2

Wypróbuj moje ulubione: włóż

~/.zshrc

ta linia:

PROMPT='%F{240}%n%F{red}@%F{green}%m:%F{141}%d$ %F{reset}'

nie zapomnij

source ~/.zshrc

aby przetestować zmiany

oczywiście można zmienić kolory / kody kolorów :-)


0

man zshall i wyszukaj SZYBKIE ROZSZERZENIE

Po przeczytaniu istniejących tutaj odpowiedzi kilka z nich jest sprzecznych. Wypróbowałem różne podejścia na systemach zsh 4.2 i 5+ i odkryłem, że powodem, dla którego te odpowiedzi są sprzeczne, jest to, że nie mówią, do której wersji ZSH są skierowane. Różne wersje używają do tego różnej składni, a niektóre z nich wymagają różnych automatycznych ładowań.

Więc prawdopodobnie najlepszym rozwiązaniem jest skorzystanie z polecenia man zshall i wyszukanie hasła PROMPT EXPANSION, aby poznać wszystkie zasady dotyczące konkretnej instalacji zsh. Uwaga w komentarzach, takie rzeczy jak „Używam Ubuntu 11.04, 10.4 lub OSX” nie mają zbyt dużego znaczenia, ponieważ nie jest jasne, której wersji ZSH używasz. Ubuntu 11.04 nie oznacza nowszej wersji ZSH niż ubuntu 10.04. Może istnieć wiele powodów, dla których została zainstalowana starsza wersja. W związku z tym nowsza wersja ZSH nie sugeruje, której składni użyć, nie wiedząc, która to wersja ZSH.


0

Aby uzupełnić wszystkie powyższe odpowiedzi, inną wygodną sztuczką jest umieszczenie kolorowych podpowiedzi w funkcji zsh. Tam możesz zdefiniować zmienne lokalne, aby aliasować dłuższe polecenia, np. rc=$reset_colorLub zdefiniować własne zmienne kolorów. Nie zapomnij umieścić go w swoim .zshrcpliku i wywołać zdefiniowaną przez siebie funkcję:

# Coloured prompt
autoload -U colors && colors
function myprompt {
  local rc=$reset_color
  export PS1="%F{cyan}%n%{$rc%}@%F{green}%m%{$rc%}:%F{magenta}%~%{$rc%}%# "
}
myprompt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.