Niedawno natknąłem się na krótki przewodnik upiększenia terminala graficznego Linuksa przy pomocy powłoki zsh oraz dodatku Powerline. Można go znaleźć tutaj. Niestety, cierpi on na pewną wadę. Sprawdza się bardzo dobrze w przypadku pracy na jednym, góra dwóch komputerach, jednakże jeśli pracujemy z wieloma sesjami zdalnymi, łatwo się w tym wszystkim pogubić, gdyż prompt nie zawiera nazwy hosta, z którym jesteśmy połączeni przez SSH. Ale przecież Powerline jest projektem Open Source, cóż więc stoi na przeszkodzie żeby przy nim trochę podłubać?
Założenie jest następujące: chcemy mieć wyświetloną nazwę hosta przy połączeniu SSH oraz (ponieważ Gentoo mnie do tego przyzwyczaiło), zalogowanie się na koncie uprzywilejowanym musi być odpowiednio zaznaczone, żebyśmy z rozpędu czegoś nie popsuli. "Domowym" użytkownikom Ubuntu nie zda się to na wiele, gdyż tam operacje wymagające uprawnień administracyjnych wykonuje się przy pomocy komendy sudo. Jeśli jednak zarządza się serwerami, praca w takim trybie byłaby bardzo uciążliwa.
Wygląd wiersza poleceń jest zdefiniowany w dodatku Powerline, a dokładnie w pliku powerline.zsh-theme. Jest on zwykłym skryptem powłoki, interpretowanym przez zsh, w związku z tym mamy dość szerokie pole do popisu. Standardowo Powerline potrafi wykrywać sesję SSH (po przypisaniu jakiejkolwiek wartości do zmiennej POWERLINE_DETECT_SSH w pliku ~/.zshrc), jednakże ogranicza się on w takim przypadku tylko do zmiany koloru tła na czerwone. Poniższa poprawka zmieni nieco to zachowanie:
diff --git a/powerline.zsh-theme b/powerline.zsh-theme
index 8c644c6..9cf43c0 100644
--- a/powerline.zsh-theme
+++ b/powerline.zsh-theme
@@ -45,17 +45,23 @@ ZSH_THEME_GIT_PROMPT_RENAMED="%F{220]➜%f"
ZSH_THEME_GIT_PROMPT_UNMERGED="%F{082]═%f"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%F{190]✭%f"
-POWERLINE_SEC1_BG=%K{green}
-POWERLINE_SEC1_FG=%F{green}
-POWERLINE_SEC1_TXT=%F{black}
-if [ "$POWERLINE_DETECT_SSH" != "" ]; then
- if [ -n "$SSH_CLIENT" ]; then
+if [ $UID -eq 0 ]; then
POWERLINE_SEC1_BG=%K{red}
POWERLINE_SEC1_FG=%F{red}
- POWERLINE_SEC1_TXT=%F{white}
- fi
+ POWERLINE_HOSTSPEC='%n@%m'
+elif [[ "x$POWERLINE_DETECT_SSH" != "x" && "x$SSH_CLIENT" != "x" ]]; then
+ POWERLINE_SEC1_BG=%K{190}
+ POWERLINE_SEC1_FG=%F{190}
+ POWERLINE_HOSTSPEC='%n@%m'
+else
+ POWERLINE_SEC1_BG=%K{green}
+ POWERLINE_SEC1_FG=%F{green}
+ POWERLINE_HOSTSPEC='%n'
fi
-PROMPT="$POWERLINE_SEC1_BG$POWERLINE_SEC1_TXT %n %k%f$POWERLINE_SEC1_FG%K{blue}"$'\u2b80'"%k%f%F{white}%K{blue} "$POWERLINE_CURRENT_PATH" "$POWERLINE_GIT_INFO_LEFT"%k%f%F{blue}"$'\u2b80'"%f "
+
+POWERLINE_SEC1_TXT=%F{black}
+
+PROMPT="$POWERLINE_SEC1_BG$POWERLINE_SEC1_TXT $POWERLINE_HOSTSPEC %k%f$POWERLINE_SEC1_FG%K{blue}"$'\u2b80'"%k%f%F{white}%K{blue} "$POWERLINE_CURRENT_PATH" "$POWERLINE_GIT_INFO_LEFT"%k%f%F{blue}"$'\u2b80'"%f "
if [ "$POWERLINE_NO_BLANK_LINE" = "" ]; then
PROMPT="Kiedy użytkownik jest zalogowany na konto uprzywilejowane (o UID równym 0, czyli np. root), tło jest zmieniane na kolor czerwony oraz dodatkowo jest doklejana nazwa hosta do wyświetlanego loginu. Jeśli aktywowane jest wykrywanie sesji SSH (po dopisaniu POWERLINE_DETECT_SSH="true" w ~/.zshrc) i użytkownik jest zalogowany zdalnie, tło jest zmieniane na kolor żółty i tak jak w przypadku konta root - doklejana jest nazwa hosta. Jeśli użytkonik jest zalogowany lokalnie na koncie bez uprawnień administracyjnych, kolor tła jest standardowo zielony i wyświetlana jest jedynie nazwa konta. Jak to wygląda w terminalu można podejrzeć na tym zrzucie ekranu.
Jeśli kolory nie są odpowiednie, można je oczywiście zmienić. Oprócz identyfikatorów tekstowych (green, red itp.) można także używać wartości liczbowych. Pełną ich listę dla terminala 256-kolorowego przedstawia obrazek dostępny tutaj.
Na koniec pozostaje nam wyłączenie Powerline jeśli nie działamy na terminalu zdolnym wyświetlić znaki specjalne, np. na konsoli tekstowej. Aby uniknąć nieczytelnej linii poleceń, wystarczy w pliku ~/.zshrc ładować rozszerzenie w następujący sposób:
if [ "$TERM" = "xterm-256color" ]; then
ZSH_THEME="powerline"
POWERLINE_DETECT_SSH="true"
# Pozostałe zmienne POWERLINE_*
else
ZSH_THEME="robbyrussell"
fiTeraz możemy się cieszyć ładną i kolorową linią poleceń, bez obaw że zagubimy się w gąszczu otwartych terminali z wieloma sesjami SSH.
Brak komentarzy:
Prześlij komentarz
Uwaga. Komentarze są moderowane i mogą nie pojawić się natychmiast po utworzeniu. Autor niniejszego bloga zastrzega sobie prawo do niedopuszczenia komentarzy będących SPAMem i/lub nie odnoszących się do komentowanego wpisu i/lub łamiących zasady kulturalnej wymiany opinii.