Implementacja multiplexera

Kategoria: Artykuły, etykiety: log, xsel, urxvt, tty, tmux, multiplexer, konsola, konfiguracja, ccze

Dodany: 2013-12-19 03:26 (zmodyfikowany: 2014-02-19 00:53)
Przez: morfik

Wyświetleń: 8979

1. Wstęp

Poniższy artykuł przedstawi wykorzystanie multiplexera tmux w codziennej pracy z terminalami. Zostanie on osadzony także w bardzo lekkim i dość łatwo konfigurowalnym urxvt. Na dobrą sprawę to chyba nie ma rzeczy, której ten duet nie byłby w stanie zrobić.

Wszystko zaczęło się od pewnego posta na forum, w którym to ktoś polecał komuś innemu by ten się zainteresował czymś o nazwie tmux. Wątpię by tamten ktoś się to zrobił, w każdym razie, ja sobie rzuciłem okiem na opis tego pakietu i wyczytałem coś tam o dzieleniu okienek. Do tej pory używałem terminatora i jakoś na pierwszy rzut oka tmux nie zrobił na mnie wrażenia, przynajmniej do momentu instalacji. Lecz gdy się okazało, że tmuxa można odpalać również pod tty, to sobie pomyślałem, że mógłby on robić za takiego terminatora w trybie tekstowym. Nie to bym ciągle siedział w tej tekstowej konsoli ale skoro tmux potrafi to samo co terminator i do tego ma mniejsze wymagania i potrafi działać zarówno w trybie graficznym i tekstowym, to czemu dalej jechać na terminatorze? Jak się później okazało, tmux potrafi o wiele więcej niż tylko dzielić przestrzeń roboczą na kilka okienek.

By móc zacząć się bawić tmuxem, musimy doinstalować poniższe pakiety:

# aptitude install tmux rxvt-unicode-256color v86d xsel ccze

Oczywiście to z jakiej funkcjonalności zamierzamy korzystać przełoży się na to co zostanie zainstalowane. Jeśli mamy własny terminal i nie korzystamy z tty, to raczej sam tmux wystarczy. Pakiet v86d ma zastosowanie przy tty. Dostarcza moduł, który dużo lepiej radzi sobie z obsługą framebuffera, co np. można poznać przy prędkości przewijania dużej ilości tekstu na ekranie. Nie wiem czy tego typu zachowanie występuje na otwartych sterownikach graficznych ale na pewno tyczy się to zamkniętych sterów nvidii. Także jeśli przeszkadza nam mulenie tty, to można ten pakiet doinstalować i skonfigurować, co też zostanie opisane w dalszej części artykułu.

2. URxvt

Domyślne ustawienia urxvt mogą przerazić każdego, a sam terminal z pozoru sprawia wrażenie niegodnego uwagi i zainteresowania. Pozory jednak mylą, trzeba tylko ten terminal doprowadzić do użytku. Na sam początek tworzymy config, który będzie znajdował się w ~/.Xresources . Wpisy oczywiście można tworzyć ręcznie, lub też można wygenerować je przy pomocy odpowiednich poleceń i tu w zależności od tego czy chcemy mieć gołe linijki czy też z opisem, wybieramy sobie jedno lub drugie polecenie (pierwsze tworzy gołe wpisy):

$ urutu --help 2>&1| sed -n '/:  /s/^ */! URxvt*/gp' >> ~/.Xresources
$ TERM=dump command man -Pcat urxvt | sed -n '/depth: b/,/^BA/p'|sed '$d'|sed '/^       [a-z]/s/^ */^/g'|sed -e :a -e 'N;s/\n/@@/g;ta;P;D'|sed 's,\^\([^@]\+\)@*[\t ]*\([^\^]\+\),! \2\n! URxvt*\1\n\n,g'|sed 's,@@\(  \+\),\n\1,g'|sed 's,@*$,,g'|sed '/^[^!]/d'|tr -d "'\`" >> ~/.Xresources

Całkiem sporo jest tych opcji, no i oczywiście nie są to wszystkie możliwe. Ja w swojej konfiguracji nie skorzystałem nawet z połowy dostępnych parametrów ale udało mi się dostroić praktycznie wszystko z czym miałem jakiś problem.

Na sam początek konfiguracja czcionek. Poniższe wpisy ustawiają renderowanie czcionek wszystkich aplikacji, nie tylko urxvt. Warto nimi poeksperymentować jeśli są jakieś problemy z fontami:

Xft.dpi:                 96
Xft.antialias:              false
Xft.rgba:                   none
Xft.hinting:                true
Xft.hintstyle:              hintfull

Dpi czcionek ustawiony tutaj ma wpływ na to jak duże będą czcionki. 96 jest to standardowy rozmiar pod X. Podobnie można ustawić rozmiar czcionek pod tty, przy pomocy dpkg-reconfigure console-setup . Teoretycznie by rozmiar czcionki pod tty pasował do tego w X, trzeba by wybrać 8x12 albo 6x16 ale u mnie i tak obraz się rozjeżdżał.

Ustawiamy ikonkę terminala, bo domyślnie chyba nie ma żadnej i trochę to kiczowato wygląda. Ja zakosiłem ikonkę terminatorowi, bo jest całkiem milusia dla oka:

URxvt*iconFile:              /home/morfik/.config/launchery/icons/urxvt_standard.png

Precyzujemy kroje czcionek ale to jak będą one ostatecznie wyglądać zależy od konfiguracji fontconfiga. Jeśli efekt jest inny niż oczekiwalibyśmy tego, to prawdopodobnie trzeba rzucić okiem w /etc/fonts/ , ~/.fonts.conf lub też przekonfigurować fontconfiga przy pomocy dpkg-reconfigure fontconfig-config . Poniżej konfiguracja moich czcionek dla urxvt:

URxvt*font:                  xft:monospace:size=9
URxvt*boldFont:             xft:monospace:bold:size=9
URxvt*italicFont:           xft:monospace:italic:size=9
URxvt*boldItalicFont:       xft:monospace:bold:italic:size=9

Jeśli nie potrzebujemy scrollbara, można go wyłączyć. Co jak co ale ten pasek jest rodem z win 95, uwierzcie mi, będzie się wam to śniło po nocach, lepiej od razu wyłączyć. xD W każdym razie jeśli chcecie mieć pasek to wypadałoby sprecyzować jego pozycję. Ostatnia linijka odpowiada za przewijanie w przypadku gdy pojawia się coś w terminalu.

URxvt*scrollBar:         false
! URxvt*scrollBar_right:    true
URxvt*scrollTtyOutput:      false

Istnieje też możliwość dodawania rozszerzeń. Są to proste skrypty perlowe, niczym addony dla firefoxa, poprawiające znacznie funkcjonalność urxvt.

URxvt*perl-ext-common:       default,matcher,font-size,clipboard

W tym przypadku mamy ich 3, z czego dwa zewnętrzne. Dodatki są przechowywane w katalogu /usr/lib/urxvt/perl/ -- wystarczy wrzucić tam plik. Każdy z nich ma własne wpisy konfiguracyjne, które należy dodać do ~/.Xresources . By włączyć skrypt, trzeba uwzględnić nazwę jego pliku w linijce powyżej.

W każdym razie, clipboard wprowadza bardziej przyjazne kopiowanie. Jest oparty o xsel oraz schowek CLIPBOARD (o tym będzie w dalszej części artykułu). Przypisujemy mu także skróty klawiszowe -- więcej info można znaleźć na https://github.com/muennich/urxvt-perls . Tak to mniej więcej wygląda u mnie:

URxvt.keysym.C-c:            perl:clipboard:copy
URxvt.keysym.C-v:           perl:clipboard:paste
URxvt.keysym.C-M-v:         perl:clipboard:paste_escaped
URxvt.clipboard.copycmd:    xsel -ib
URxvt.clipboard.pastecmd:   xsel -ob

Drugi skrypt (font-size) sprawia, że będziemy mogli przy pomocy skrótów klawiszowch operować dynamicznie rozmiarem czcionki -- więcej info na https://github.com/majutsushi/urxvt-font-size. Ustawiamy zatem skróty:

URxvt.keysym.C-S-Up:     perl:font-size:increase
URxvt.keysym.C-S-Down:      perl:font-size:decrease

Ostatni ze skryptów odpowiada za otwieranie linków. Można także sprecyzować program, w którym będą one wywoływane. Dodatkowo możemy owe linki pokolorować, tak by wyróżniały się na tle pozostałego tekstu:

URxvt*url-launcher:          /opt/firefox/firefox
URxvt*matcher.button:       1
URxvt*colorUL:              #4682B4

Możemy także sprecyzować czy terminal ma mieć obramowanie, jego kolor, rysowanie okna na pulpicie w konkretnym miejscu oraz jego wymiary (można do tego celu użyć także openboxa):

*cdesktop.borderLess:        true
*standard.borderLess:       false
*tmux.borderLess:           false
! URxvt*borderColor:        #E77320
*cdesktop.geometry:         147x39+5+407
*standard.geometry:         147x39+100+207
*tmux.geometry:             147x39+100+207

Jest też opcja ustawienie przezroczystości okna. Można także zdefiniować kolor tła oraz tekstu. Cyfra w kwadratowym nawiasie [50] oznacza % prześwitu koloru. W tym przypadku to maska 50% pokrycia z koloru czarnego:

URxvt.depth:             32
*cdesktop.background:       [50]#000000
*standard.background:       #000000
*tmux.background:           #000000
URxvt*foreground:           #E77320

Następnie definiujemy czy chcemy mieć kursor w postaci kreski czy prostokącika, jak i również czy ma migać oraz czy mysz ma znikać gdy nieaktywna. Dodatkowo można pokolorować zarówno mysz jak i kursor:

URxvt*cursorUnderline:       true
URxvt*cursorBlink:          true
URxvt*pointerBlank:         true
URxvt*cursorColor:          #E77320
URxvt*cursorColor2:         #E77320
URxvt*pointerColor:         #E77320
URxvt*pointerColor2:        #E77320

Można określić dowolny z kolorów terminala. Jest ich 16, 8 zwykłych i 8 dodatkowych. Można precyzować po nazwach albo po wartościach hexów (są też inne sposoby). Mój zestaw kolorów wygląda tak:

*color0:  #232323
*color1:  #a40000
*color2:  #4E9A06
*color3:  #C4A000
*color4:  #3465A4
*color5:  #75507B
*color6:  #ce5c00
*color7:  #d75f00
*color8:  #555753
*color9:  #EF2929
*color10: #8AE234
*color11: #ffcc00
*color12: #729FCF
*color13: #AD7FA8
*color14: #fcaf3e
*color15: #EEEEEC

Ustawiamy także cache terminala, tj. ile linijek będziemy mogli przewijać wstecz. Im więcej ustawimy tym zwiększy się popyt urxvt na RAM.

URxvt*saveLines:         0

Poniższe dwie linijki odpowiadają za wyłączenie trybu iso14755, który przydaje się do wprowadzania znaków, normalnie niemożliwych do wywołania z klawiatury. Problem w tym, że by mieć dostęp do tych znaków, trzeba skorzystać z kombinacji klawiszy Lctrl+Lshift, przez co traci się możliwość używania skrótów opartych o te klawisze. Będą mi one potrzebne w dalszej części konfiguracji, dlatego też tryb iso14755 musi zostać wyłaczony:

URxvt*iso14755:              false
URxvt*iso14755_52:          false

Jeszcze taki jeden drobiazg -- urxvt ma dwa sposoby działania, jeden wykorzystujący standardowe rozwiązanie samego klienta. Drugi zaś operuje na zasadzie klient-serwer. Zaletą tego drugiego rozwiązania jest lepszy performance. W przypadku kilku klientów, każdy z nich pobiera taką samą ilość RAMu i u mnie jest to 9MiB, czyli w przypadku odpalenia 10 instancji, będą one zużywać 90MiB. Zaś gdy wykorzystujemy serwer, zjada on, co prawda, 10MiB extra ale za to każdy kolejny klient podłączony do niego konsumuje około 1MiB. Także w przypadku dwóch instancji jesteśmy już do przodu o 7MiB ale jeśli raczej korzystamy tylko z jednego terminala, to będziemy 2MiB w plecy. No i oczywiście w przypadku posiadania serwera, jak ten zdechnie, to tracimy wszystkich klientów i całe info w nich.

Jeśli jednak chcemy włączyć sobie tryb klient-serwer , dodajemy do autostartu:

/usr/bin/urxvtd -q -f -o

I by podłączyć się do serwera wpisujemy urxvtc zamiast urxvt.

I to by było z grubsza tyle jeśli chodzi o przygotowanie terminala. Warto jeszcze wspomnieć, że do części opcji konfiguracyjnych mamy też dostęp przez wciśnięcie Lctrl i środkowego przycisku myszki. Teraz pora na konfigurację tmuxa.

3. Tmux

W tryb tmuxa wchodzimy przez wpisanie w terminalu tmux . Pierwsze czego człowiek musi się nauczyć by jakoś przetrwać w tmuxie to obsługa skrótów klawiszowych. Ja zmieniłem sobie domyślną konfigurację sporej części skrótów i trzeba to wziąć pod uwagę w przypadku gdyby coś nie działało. Trzeba też wiedzieć w jaki sposób są przesyłane skróty klawiszowe. Po wciśnięciu prefixa (ctrl+a), kombinacja nie jest od razu podawana do serwera. Zamiast tego tmux czeka na kolejny znak lub znaki. Dopiero po ich podaniu skrót zostanie wysłany. Dzięki temu można spokojnie rozluźnić łapki i po prostu wcisnąć ctrl+a , a następnie pożądany klawisz. Tmux ma też opcję precyzowania klawiszy w oparciu o opóźnienie. Czyli jeśli musimy rozszerzyć jakieś okno, to nie ma potrzeby wciskania ciągle prefixa -- wystarczy go wcisnąć raz, a potem już tylko operować odpowiednimi klawiszami. Poniżej jest drobna rozpiska skrótów, z których ja korzystam:

ctrl+a -- prefix
ctrl+a+1 , ctrl+a+2 , etc -- wybór okna
ctrl+a+c -- tworzenie nowego okna
ctrl+a+q -- zniszczenie okienka (pane)
ctrl+a+Q -- zniszczenie całego okna
ctrl+a+d -- odłączenie od sesji (zawartość okien zostaje)
ctrl+a+| -- podział okna w pionie
ctrl+a+_ -- podział okna w poziomie
ctrl+a+" -- lista sesji i przełączanie się miedzy nimi
ctrl+a+z -- maksymalizacja aktywnego okienka (pane) (wcisnąć ponownie by powrócić do trybu podziału)
ctrl+a+r -- przeładowanie pliku konfiguracyjnego
ctrl+a+[ -- tryb kopiowania (spacja + strzałki zaznaczają, enter kopiuje)
ctrl+a+] -- wkleja to co zostało skopiowane
ctrl+a+strzałki -- przenosi po okienkach
ctrl+a++ , ctrl+a+= ctrl+a+< ctrl+a+> -- zmienia rozmiar okienek
ctrl+a+spacja, ctrl+a+backspace -- przełącza między całymi oknami w kolejności w jakiej są na pasku statusu

Dodatkowo trzeba umieć operować żądaniami wysyłanymi do serwera. Poniżej lista tych częściej używanych, w nawiasach są skróty:

tmux attach-session (attach) -t sesja -- podłącza nas do sesji
tmux detach-client (detach) -- odłącza klienta od sesji
tmux start-server -- uruchamia serwer bez sesji
tmux kill-server -- niszczy wszystkie sesje, ubija serwer
tmux kill-session -t sesja -- niszczy sesje
tmux list-sessions (ls) -- pokazuje aktywne sesje
tmux new-session (new) -t sesja -- tworzy nową sesje

Wszystko powyższe jest pisane z głowy, a używam tmuxa parę dni. Także można bez problemu to ogarnąć, wystarczy zacząć go używać.

W /etc/tmux.conf lub ~/.tmux.conf jest trzymana cała konfiguracja tmuxa. Ja korzystałem już z gotowego configu i tylko dostosowałem sobie pewne rzeczy. Plik dostępny pod tym adresem. Podobnie jak w przypadku urxvt jest sporo opcji. Te użyte przeze mnie zostaną opisane poniżej, a cały plik konfiguracyjny będzie dostępny na końcu artykułu.

Przede wszystkim włączamy support dla myszy. Będziemy mogli za jej pomocą aktywować okienka, zmieniać ich rozmiar, a nawet przełączać się między nimi klikając w odpowiednie pozycje na ekranie. Działa również przewijanie rolką -- full wypas, bez tego ani rusz. Niestety nie udało mi się zmusić tmuxa do współpracy z gpm (to taki support dla myszy pod tty), a z informacji, które znalazłem, wychodzi na to, że tmux nie wie jak rozmawiać z gpm, w efekcie czego można zapomnieć o bawieniu się myszą pod tty. Oczywiście nadal kopiowanie przy pomocy myszy działa ale nie można robić tych wszystkich rzeczy co pod X-ami, trzeba mieć ogarnięte skróty. W każdym razie by włączyć wsparcie dla myszy pod X, dopisujemy do pliku:

set -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

Jeśli nam nie odpowiadają domyślne kolory tmuxa, możemy je sobie dobrać. Pierwsze trzy pozycje kolorują pasek statusu. Kolejne trzy odpowiadają za wygląd okna. Następne pozycje ustawiają kolory aktywnego okna na pasku statusu. Następne kolorują wiadomości, przez które tmux porozumiewa się z użytkownikiem. Kolejne cztery odpowiadają za oznaczenie aktywnego okienka (pane). Ostatnia pozycja odpowiada za kolor zegara, który to można wywołać przez ctrl+a+t.

set -g status-bg colour235
set -g status-fg colour136
set -g status-attr default

setw -g window-status-fg colour244
setw -g window-status-bg default
setw -g window-status-attr dim
 
setw -g window-status-current-fg colour166
setw -g window-status-current-bg default
setw -g window-status-current-attr underscore

set -g message-bg colour235 
set -g message-fg colour166
set -g message-attr bright

set -g pane-border-fg colour240 
set -g pane-active-border-fg colour240

set -g display-panes-active-colour colour33
set -g display-panes-colour colour166

setw -g clock-mode-colour colour166

Możemy także dostosować sobie status bar, zarówno jego kolorystykę jak i to co faktycznie będzie nam pokazywał. Pierwsza linijka precyzuje odświeżanie paska statusu, w tym wypadku jest to jedna sekunda. Kolejny wpis centruje listę okien, kolejne dwie ustawiają długość lewego i prawego bara. A dwie ostatnie wrzucają do nich pokolorowaną zawartość. Zmienne na lewym i prawym barze mają postać #[] , wewnątrz nawiasu można wywoływać polecenia lub też skorzystać ze zdefiniowanych atrybutów. Lista dostępna w manualu.

set -g status-interval 1
set -g status-justify centre
set -g status-left-length 30
set -g status-right-length 140
set -g status-left '#[fg=green]#H #[fg=black]• #[fg=green,bright]#(uname -r)#[default]'
set -g status-right '#[fg=green,bg=default,bright]#(tmux-mem-cpu-load 1) #[fg=red,dim,bg=default]#(uptime | cut -f 4-5 -d " " | cut -f 1 -d ",") #[fg=white,bg=default]%H:%M:%S#[default] #[fg=blue]%Y-%m-%d'

Zmieniamy domyślny prefix tmuxa, dla wygody i chyba coś tam się też kłóciło z bindami vima, w każdym razie przepisujemy prefix z ctrl+b na ctrl+a :

unbind-key C-b
set -g prefix C-a
bind-key C-a send-prefix

Ustawiamy czas opóźnienia dla wielu skrótów na 1 sekundę. Dzięki temu bindy z opcją -r będzie można używać bez prefixa, przynajmniej do czasu aż upłynie 1s od ostatniego wywołania jakiegoś skrótu:

set -g repeat-time 1000

W przypadku tty domyślne skróty zmiany rozmiaru okienek (pane) nie działają, bo ta konsola linuxowa po prostu nie umie zinterpretować ctrla, alta, czy shifta, przynajmniej tych z lewej strony klawiatury. Dlatego musimy je przebindować. Poniższe skróty są raczej intuicyjne i nie trzeba tam wiele wyjaśniać:

bind-key - split-window -v
bind-key _ split-window -v
bind-key | split-window -h
 
bind-key -r < resize-pane -L 3
bind-key -r > resize-pane -R 3
bind-key -r + resize-pane -U 1
bind-key -r = resize-pane -D 1

Bindujemy ctrl+a+a tak by przenosił nas do ostatnio aktywnego okna oraz ustawiamy ctrl+a+spację i ctrl+a+backspace na przejście, odpowiednio, do następnego i poprzedniego okna:

bind-key C-a last-window
bind-key -r Space next-window
bind-key -r BSpace previous-window

Ustawiamy bind pod reload pliku konfiguracyjnego. By przeładować go wciskamy ctrl+a+r :

bind r source-file /etc/tmux.conf \; display-message "Config reloaded..."

Tworzymy także klawisz, który będzie odpowiedzialny za czyszczenie historii tmuxa (ctrl+a+n) oraz ustawiamy jej rozmiar na 5000 linijek:

bind-key n send-keys -R \; clear-history
set -g history-limit 5000

Jeśli kogoś drażni numerowanie okien i okienek (pane) od 0, to nic nie stoi na przeszkodzie by to zmienić. Poniżej ustawiamy numerowanie od 1:

set -g base-index 1

Instruujemy tmuxa, że jesteśmy w posiadaniu terminala, który potrafi obsłużyć 256 kolorów:

set -g default-terminal "screen-256color"

Oraz precyzujemy klawisze dla szybszego odłączania się od sesji:

bind-key d detach
bind-key D choose-client

Poniższe skróty (bez prefixów, opcja -n) umożliwią przełączanie się po całych oknach oraz okienkach (pane).


bind-key -n "C-Left" select-window -t :-
bind-key -n "C-Right" select-window -t :+

bind-key -n "C-Up" select-pane -t :.-
bind-key -n "C-Down" select-pane -t :.+

Przypisujemy bindy pod tworzenie i niszczenie okien. Zniszczenie ich wymagać będzie potwierdzenia:

bind-key c new-window
bind-key q confirm-before kill-pane
bind-key Q confirm-before kill-window

Z ważniejszych rzeczy zostało jeszcze operowanie na buforze, kopiowanie i wklejanie jego zawartości, pobindowane odpowiednio na ctrl+a+[ oraz ctrl+a+] :

bind-key [ copy-mode
bind-key ] paste-buffer -s \015

Ciekawą rzeczą jest skopiowanie tego co się dzieje w terminalu i wrzucenie tego do pliku tekstowego. Problem w tym, że zwykle gdy się koloruje np. prompta czy wyjście ls, to w pliku będą uwzględnione znaki escape , czyli coś co się zaczyna od ^[ . To zwykle czyni wyjście mało czytelne. Na szczęście ktoś pokusił się o napisanie filtra i przepuszczenie tekstu przez ten filtr sprawi, że plik będzie przypominał standardowe wyjście terminala, tyle, że bez kolorów. Niestety programu ansifilter nie ma w repo debiana i trzeba go ręcznie sobie zbudować. Kod źródłowy jest dostępny pod tym adresem.

Jeśli już zaopatrzyliśmy się w ansifilter, dopisujemy poniższą linijkę do pliku konfiguracyjnego:

bind-key C-p pipe-pane -o 'ansifilter >>~/output.#I-#P'

Od teraz jeśli wciśniemy w jakimś okienku (pane) ctrl+a+p , zacznie się logowanie wszystkiego co się przewija przez to okno i zostanie zapisane to w pliku output z numerami okna. Działa to na podobnej zasadzie co script, tyle, że lepiej.

W przypadku wyłączenia bufora urxvt, by móc kopiować swobodnie to co się przewija przez terminal, trzeba będzie korzystać z bufora tmuxa, w przeciwnym wypadku będziemy mogli skopiować tylko to co widzimy w terminalu (przy pomocy shift + zaznaczenie myszą). Jeśli wejdziemy w copy-mode tmuxa i zaznaczymy jakiś dłuższy tekst, po przyciśnięciu entera zostanie on skopiowany do schowka tmuxa, by go przesłać również do schowka systemowego, musimy zbindować poniższą akcję:

bind-key C-y run "tmux save-buffer - | xsel -b -i"

Ostatnim krokiem jest zrobienie sesji oraz konfiguracja okien i poleceń, które mają być w nich wykonywane. Nie jest to obowiązkowe ale jakiś przykład musi być. Poniżej zostaną stworzone dwie sesje, każda z nich będzie miała dwa okna i w jednym z nich będzie podział 50:50 w poziomie:

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

new -s standard -n htop "htop"
neww -n cmd
splitw -t 2 -v -p 50
selectw -t 2 
selectp -t 1

Składnia wpisów jest prosta:

new -- nowa sesja, -s nazwa sesji neww -- nowe okno, -n nazwa okna splitw -- podziel okno, -p procenty, -v lub -h, pionowo albo poziomo selectw -- wybierz okno selectp -- wybierz okienko (pane)

Parametr -t odpowiada za numer okna lub okienka (pane). Rozważając sesję standard, po podłączeniu się do niej, zobaczymy to co jest w oknie drugim, a kursor powędruje i aktywuje okienko (pane) na górze, bo całe okno jest podzielone na dwie części. W przypadku tworzenia sesji, trzeba w linijce z new sprecyzować także okno przy pomocy -n , w przeciwnym wypadku zostanie utworzone dodatkowe puste okno.

Jest tylko jeden problem z definiowaniem wielu sesji w pliku konfiguracyjnym tmuxa -- nie da rady przeładować configu. Tzn. da radę, ale wtedy w aktywnej sesji są ładowane dodatkowe okna i cały layout diabli biorą. Trzeba stworzyć osobny skrypt, który będzie zajmował się tworzeniem sesji i dzięki temu będzie można ten kawałek kodu wykroić z pliku konfiguracyjnego tmuxa zostawiając tam tylko rzeczywiste opcje, które nie mają wpływu na konfigurację wyglądu sesji. Poniżej jest skrypt, który potrafi stworzyć takie sesje:

#!/bin/bash

# test if the session has windows
is_closed(){ 
    sess=$1
    n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l)
    [[ $n -eq 0 ]]
}

# either create it or attach to it
if is_closed logi ; then
  tmux new -d -s logi -n cmd
  tmux neww -t logi -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
  tmux splitw -t logi:1 -v -p 50
  tmux selectw -t logi:2
  tmux selectp -t logi:1
fi
if is_closed standard ; then
  tmux new -d -s standard -n htop "htop"
  tmux neww -n cmd -t standard
  tmux splitw -t standard:2 -v -p 50
  tmux selectw -t standard:2 
  tmux selectp -t standard:1
fi

Trzeba go tylko wywołać przed podłączeniem się do sesji. W trybie graficznym można dodać poniższy kod do autostartu, w openboxie to będzie ~/.config/openbox/autostart :

# tmux sessions
if [ -f ~/tmux_wrap ]; then
    bash $HOME/tmux_wrap
fi

Tylko to rozwiązanie ma wadę -- serwer tmuxa wystartuje dopiero po zalogowaniu się w trybie graficznym, jeśli z jakiegoś powodu będzie potrzeba przełączyć się na tty, nie będziemy mieli dostępu do tmuxa, chyba, że ręcznie odpalimy tamten skrypt. By to zautomatyzować, możemy dodać powyższy kod także do pliku ~/.profile , który jest czytany przez terminale, do których pierw trzeba się zalogować (login session) podając hasło i login, czyli np. tty. Pseudoterminale, takie jak urxvt używają ~/.bashrc i ten plik jest także czytany przez tty ale jeśli wrzucimy ten kod do ~/.bashrc , wtedy każde wywołanie terminala będzie wykonywać skrypt. On i tak się zakończy po tym jak wykryje, że serwer tmuxa działa ale moim zdaniem lepiej jest wywołać go przez plik autostartu x-ów i ~/.profile .

Nie polecałbym też dodawania poniższego kodu, np. do ~/.bashrc , w celu wywołania tmuxa od razu po zalogowaniu się w terminalu :

# If not running interactively, do not do anything
[[ $- != *i* ]] && return
[[ -z "$TMUX" ]] && exec tmux attach-session -t standard

Jeśli z jakiegoś powodu padną nam X-y i serwer tmux nie będzie odpalony, trzeba będzie chrootować system.

Można by oczywiście jeszcze pokusić się o napisanie skryptu startowego rc, choć tutaj trzeba wziąć pod uwagę, że proces tmuxa odpalony przez jednego użytkownika jest ignorowany przez innych i tamci go nie widzą, co czyni niemożliwym podłączenie się do sesji innego użytkownika. Trzeba by taki skrypt wywołać jako zwykły użytkownik. Na dobrą sprawę nie mam pojęcia jak prawidłowo powinno się napisać taki skrypt ale mógłbym przepchnąć coś w stylu:


### BEGIN INIT INFO
# Provides:          tmux-sessions
# Required-Start:    mountkernfs $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tmux sessions
# Description:       tmux sessions
### END INIT INFO

SCRIPTNAME="tmux-sessions"
ENABLED="yes"

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

if [ "$ENABLED" = "no" ]; then
    echo "Not started, ENABLED=\"no\""
    exit 0
fi

case "$1" in
    start)
        start-stop-daemon -c morfik:morfik -b --start --exec /home/morfik/tmux_wrap
    ;;
   *)
        exit 1
    ;;       
esac

exit 0

Nadać mu prawa do wykonywania i dodać go do autostartu:

# chmod +x /etc/init.d/tmux-sessions
# update-rc.d tmux-sessions defaults

Tylko, że to taki pseudo skrypt startowy -- potrafi się wykonać tylko w jedną stronę. xD Ale spełnia swoje zadanie. W każdym razie pierwszy sposób jest najlepszy tylko trzeba pilnować środowiska, w którym jest wykonywany skrypt, inaczej może dość do rozsynchronizowania się trybu tekstowego i graficznego. Przykładowo, tmux wywołany pod tty może nie mieć w swoim środowisku zmiennej $DISPLAY, a bez niej graficzne appsy się nie odpalą i jeśli podłączymy się do sesji tmuxa pod X-ami, próbując odpalić geany, dostaniemy komunikat "cannot open display" . Lepiej przejrzeć sobie ~/.profile i wrzucić tam parę zmiennych, tak by środowiska, przynajmniej pod ich względem, były w miarę zsynchronizowane.

Oczywiście te problemy z wywoływaniem tmuxa dotyczą wielosesyjności i stawiania sesji przez zewnętrzny skrypt. W przypadku gdy nie będziemy korzystać z przeładowywania konfiguracji (ctrl+a+r), możemy bez problemu kilka sesji zdefiniować w pliku konfiguracyjnym tmuxa. W taki sposób, przy wywoływaniu tmux attach-session zostaniemy podłączeni do serwera, a w przypadku gdy ten nie jest odpalony, zostanie wystartowany, a sesja utworzona w locie (w oparciu o konfigurację sesji), po czym zostaniemy do niej podłączeni. Także bez obaw, jak skończymy się bawić z konfiguracją tmuxa, możemy spokojnie zapomnieć o wczytywaniu pliku konfiguracyjnego.

4. Kilka słów o schowku i kopiowaniu

Większość osób już raczej zdążyła doświadczyć kilku rzucających się w oczy cech przy korzystaniu z kopiowania teksu, np. można uzyskać dostęp do schowka przy pomocy środkowego przycisku myszki, albo gdy zamkniemy aplikację, nie da rady już wkleić tego co było skopiowane. To wszystko wina xorga, a właściwie jego sposobu komunikowania się między oknami. Generalnie rzecz biorąc mamy dostęp do trzech schowków, nazwanych odpowiednio: PRIMARY, SECONDARY oraz CLIPBOARD. PRIMARY -- na tym operujemy gdy wykorzystujemy myszę, wrzucamy do niego zaznaczając tekst, wyciągamy używając środkowego przycisku myszy. CLIPBOARD zaś jest używany przy standardowej operacji kopiowania, np. przy pomocy ctrl+c, ctrl+v. W przypadku tego trzeciego -- SECONDARY -- na dobrą sprawę nie mam pojęcia jak na nim operować. W każdym razie mamy dwa schowki, które są niezależne od siebie. Nie możemy skopiować tekstu przy pomocy ctrl+c i wkleić go za pomocą środkowego przycisku myszy, tzn. możemy, bo jak zaznaczymy tekst to ten automatycznie powędruje też i do schowka myszy ale np. gdy już zaznaczymy coś i będziemy próbowali wkleić to przy pomocy ctrl+v, to albo nam nic nie wklei albo wklei coś zupełnie innego.

Działa to na zasadzie zmiany właściciela schowka, przykładowo jeśli kopiujemy adres url w firefoxie, ff staje się właścicielem schowka i umieszcza tam zawartość. Załóżmy teraz, że chcemy wkleić ten adres do innej aplikacji, np. do geany. Geany poprosi firefoxa o tą treść i po jej uzyskaniu, my widzimy, że adres został wklejony. Co się jednak stanie gdy teraz skopiujemy ten adres w geany? Geany przejmie kontrolę nad schowkiem, skopiuje do niego zawartość i od tej chwili do geany będą wędrować zapytania o wklejanie zawartości schowka. Takie zachowanie ma jedną wadę -- jeśli zamkniemy aplikację, która rości sobie prawa do schowka (wrzuciła tam dane), te dane zostaną stracone i żadna aplikacja nie będzie mogła ich uzyskać czyli wkleić. Istnieje oczywiście sposób by temu zapobiec. można się posłużyć programikiem xsel. On ma tam opcję --keep , która pozwala zachować zawartość schowka nawet w przypadku gdy aplikacja się zakończy.

Tak z grubsza wygląda kopiowanie w oparciu o relacje okienek w xorgu. Ale jest jeszcze jedna rzecz, która tym razem tyczy się samego tmuxa. Ma on wbudowany bufor oraz własne skróty kopiowania/wklejania i te operacje działają tylko w obrębie serwera tmux, a nie terminala, czyli możemy coś skopiować, zamknąć terminal, podłączyć się ponownie i wkleić to co skopiowaliśmy wcześniej. To działa niezależnie od klienta ale nie da rady przy pomocy tego bufora przenieść danych do schowka systemowego czy do myszy -- przynajmniej nie w prosty sposób. To się pojawia kwestia tego jak ogarnąć kopiowanie tekstu w terminalu wewnątrz, którego jest tmux.

Terminal urxvt ma bufor, czyli ilość linijek, które możemy przewinąć wstecz by podejrzeć to co nam ucieknie z pola widzenia. To jest dokładnie ten sam rodzaj bufora, który ma tmux. Różnica polega na tym, że przy kopiowaniu, urxvt wrzuca treść do schowka systemowego, a tmux do swojego. Jako, że one są niezależne od siebie będą zjadać 2x tyle RAMu co w normalnym terminalu, takim bez tmuxa. Choć to chyba ma zastosowanie tylko w przypadku niedzielenia ekranu i gdy wyjście polecenia jest dłuższe niż rozmiar okna terminala. Przynajmniej tylko w takich warunkach mogłem zaobserwować tę samą treść w oknie urxvt po wyjściu z trybu tmuxa. Przy sprecyzowaniu 5k linijek i założeniu, że linijki nie będą dłuższe niż 255 znaków daje to max dodatkowo 1.2MiB na sam bufor. W przypadku urxvt+tmux robi się z tego prawie 2,5MiB. Może to niewiele, w każdym razie istnieje sposób by wyłączyć jeden bufor (można i oba). Bufor urxvt jest ustawiany przez plik ~/.Xresources i odpowiada za niego URxvt*saveLines -- jeśli zostanie tam ustawione 0, bufor zostanie wyłączony, a my będziemy mogli zobaczyć tylko tyle co terminal wyświetli. Z kolei opcje bufora tmux siedzą w /etc/tmux.conf w history-limit .

Warto się zastanowić czy aby na pewno chcemy wyłączyć któryś bufor. Dwa bufory oznaczają, co prawda, 2x większą konsumpcję RAMu, ale jeśli wyłączymy ten od urxvt, kopiowanie zawartości terminala stanie się trochę upierdliwe -- nie będzie można zaznaczyć tekstu i przeciągnąć myszą tak by skopiować to co było wcześniej ale już tego nie widać w terminalu. Z kolei jeśli wyłączymy bufor tmuxa, stracimy możliwość operowania sesyjnego, tzn, że po przełączeniu się na inny klient, stracimy dostęp do historii, czyli jeden z głównych ficzerów tego programu. Dla mnie to jest nie do zaakceptowania. Jako, że rzadko zdarza mi się kopiować myszą sporo tekstu z wyjścia terminala, postanowiłem wyłączyć bufor urxvt.

W przypadku jednak gdyby się zdarzyło, że musimy skopiować wyjście terminala i miałoby ono wiele linijek. Możemy skorzystać z copy-mode tmuxa wchodząc w niego przez ctrl+a+[ , zaznaczamy co trzeba i kopiujemy enterem. Wprawdzie zostanie to skopiowane do schowka tmuxa ale możemy wysłać zawartość ostatniej pozycji do schowka systemowego przez wciśnięcie ctrl+a + ctrl+y .

Jedyny problem jaki pozostał to kopiowanie tego co jest na ekranie. Domyślne ustawienia ssą. Ja jestem przyzwyczajony do używania klawiatury i skrótów ctrl+c oraz ctrl+v, a tu mnie zmuszają do używania myszy i środkowego przycisku, aż się prosi by pokazać komuś coś środkowego. xD Takie kopiowanie z wykorzystaniem myszy ma czasem swoje zalety, ale nie gdy trzeba coś skasować, a by to zrobić, trzeba to pierw zaznaczyć. Przy korzystaniu z klawiatury, zaznaczam i od razu wklejam to co skopiowałem wcześniej.

Skryptowy dodatek, który pobraliśmy oraz konfiguracja odpowiedniego skrótu w ~/.Xresources umożliwi ustawienie pożądanych klawiszy oraz kopiowanie za ich pomocą tego co jest wyświetlane w terminalu. Jednak w tmuxie by skorzystać z tego prostego kopiowania trzeba trzymać shift i dopiero wtedy przeciągnąć myszą w celu zaznaczenia i skopiowania przez ctrl+c. Podobne do zachowania w innych programach np. htop czy vim.

Terminator miał jedną rzecz, której mi tu brakuje -- w zależności od tego czy tekst był zaznaczony, ctrl+c przybierał albo tryb kopiowania, albo ubijał procesy. Tutaj jedynym rozwiązaniem jest wyłączenie trybu iso14755 w urxvt przez:

URxvt*iso14755:              false
URxvt*iso14755_52:          false

W ten sposób uzyskamy dostęp do skrótu klawiszowego ctrl+shift+c, i przy jego pomocy będzie można wysyłać sygnały KILL do procesów.

5. TTY oraz framebuffer

Jako, że ja mam kartę nvidii i na sterownikach zamkniętych, co prawda, X-y działają w porządku ale cierpi na tym framebuffer -- mam bycze czcionki. Można ustawić wyższą rozdzielczość przez dopisanie do linijki kernela vga=795 ale to strasznie upośledza virtualną konsolę. Być może na sterowniku nouveau jest wszystko ok, w każdym razie problem jest bardzo dobrze widoczny gdy przychodzi do wyświetlenia dużej ilości tekstu, który zwykle ma wiele linijek. W przypadku tego co oferuje standardowy sterownik framebuffera, linijki będą się pojawiać jedna po drugiej i to może trwać nawet parę minut, w zależności od tego jak długi jest tekst. To strasznie psuje komfort pracy pod tty i trzeba coś z tym zrobić.

Istnieje inny sterownik bufora ramki -- uvesafb i z tego co zaobserwowałem, działa on tak jak by się można tego było spodziewać -- duże ilości tekstu przewijają się przez konsolę w mgnieniu oka. Zatem przydałoby się wdrożyć ten nowy sterownik. Pakiet v86d jest wymagany. Zanim przejdziemy dalej, musimy upewnić się czy aby nasz kernel posiada odpowiednie ustawienia. Kernel aptosida niestety odpada, za to kernel debianowy ma wszystko czego nam potrzeba:

$ cat /boot/config-3.11-2-amd64 | grep -i uvesa
CONFIG_FB_UVESA=m

W pliku /etc/initramfs-tools/modules są sprecyzowane moduły, które będą uwzględnione w obrazie modułów jądra. W ten sposób będzie można załadować taki moduł od razu zaraz po wybraniu kernela w extlinux/grub. W przypadku gdybyśmy ustawiali moduły do ładowania przy starcie systemu, przez plik /etc/modules , przez pewien okres startu systemu będziemy mieć bycze czcionki, do momentu aż się moduł załaduje. Ja preferuję to pierwsze rozwiązanie, czyli dopisujemy moduł do /etc/initramfs-tools/modules :

$ cat /etc/initramfs-tools/modules
uvesafb mode_option=1280x1024-32 mtrr=3 scroll=ywrap

Regenerujemy initramfs:

root:~# update-initramfs -u -k all
...
update-initramfs: Generating /boot/initrd.img-3.11-2-amd64
...

Możemy także sprecyzować sam moduł uvesafb w /etc/initramfs-tools/modules , przy czym będziemy musieli dopisać powyższe parametry w linijce kernela. Ja używam extlinuxa ale w grubie ona będzie miała taką samą postać -- video=uvesafb:mode_option=1280x1024-32,mtrr:3,scroll=ywrap, u mnie to wygląda jak poniżej:

APPEND root=/dev/mapper/debian_crypt-root video=uvesafb:mode_option=1280x1024-32,mtrr:3,scroll=ywrap cgroup_enable=memory ro

Można również sprecyzować częstotliwość odświeżania przez 1280x1024-32@60 . Pozostałe parametry są opisane na https://www.kernel.org/doc/Documentation/fb/uvesafb.txt.

Jeszcze taka uwaga, trzeba usunąć z tej linijki kernela wpis vga= , od teraz rozdzielczość jest definiowana przez mode_option=1280x1024-32. Jeśli nie wiemy jaki tryb nasza karta potrafi wyświetlić, ładujemy moduł i sprawdzamy dostępne opcje:

# modprobe uvesafb
# cat /sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes
640x400-8, 0x0100
640x480-8, 0x0101
800x600-8, 0x0103
1024x768-8, 0x0105
1280x1024-8, 0x0107
320x200-16, 0x010e
320x200-32, 0x010f
640x480-16, 0x0111
640x480-32, 0x0112
800x600-16, 0x0114
800x600-32, 0x0115
1024x768-16, 0x0117
1024x768-32, 0x0118
1280x1024-16, 0x011a
1280x1024-32, 0x011b
320x200-8, 0x0130
320x400-8, 0x0131
320x400-16, 0x0132
320x400-32, 0x0133
320x240-8, 0x0134
320x240-16, 0x0135
320x240-32, 0x0136
640x400-16, 0x013d
640x400-32, 0x013e

Można również doinstalować fbset albo hwinfo i w nich poszukać odpowiednich parametrów.

6. Kolorowanie konsoli

By nasze konsolowe życie nie było black&white, przyda się je trochę pokolorować. Mi zależało głównie na tym, bo kolory pod tty i pod X były mniej więcej stałe, np. by wyjście ls nie zmieniło się zbytnio. By to osiągnąć trzeba dodać do ~/.bashrc poniższą zawartość:

if [ "$TERM" = "linux" ]; then
    echo -en "\e]P0232323" 
    echo -en "\e]P1a40000" 
    echo -en "\e]P24E9A06" 
    echo -en "\e]P3C4A000" 
    echo -en "\e]P43465A4" 
    echo -en "\e]P575507B" 
    echo -en "\e]P6ce5c00" 
#    echo -en "\e]P7babdb9" 
    echo -en "\e]P7d75f00"
    echo -en "\e]P8555753" 
    echo -en "\e]P9EF2929" 
    echo -en "\e]PA8AE234" 
    echo -en "\e]PBffcc00" 
    echo -en "\e]PC729FCF" 
    echo -en "\e]PDAD7FA8" 
#    echo -en "\e]PEfcaf3e" 
    echo -en "\e]PFEEEEEC"
#    echo -en "\e]PFd75f00"   
    clear #for background artifacting
fi
fi

Powyższy kod pomaluje konsolę i w taki sposób ustawi jej kolory by nie było dużego kontrastu męczącego oczy. Powyższy kod został zaczerpnięty z tego linku. Dodatkowo można zmienić kolory wyjścia programów takich jak ls przez ustawienie zmiennej LS_COLORS . Ja posłużyłem się configiem pobranym stąd. Koloruje on więcej typów plików niż standardowy config dostępny w debianie. By go wykorzystać, tworzymy plik /etc/dir_color i wrzucamy do niego poniższą zawartość:

# Exact Solarized Dark color theme for the color GNU ls utility.
# Designed for dircolors (GNU coreutils) 5.97
#
# This simple theme was simultaneously designed for these terminal color schemes:
# - Solarized dark  (best)
# - Solarized light
# - default dark
# - default light
# with a slight optimization for Solarized Dark.
#
# How the colors were selected:
# - Terminal emulators often have an option typically enabled by default that makes
#   bold a different color.  It is important to leave this option enabled so that
#   you can access the entire 16-color Solarized palette, and not just 8 colors.
# - We favor universality over a greater number of colors.  So we limit the number
#   of colors so that this theme will work out of the box in all terminals,
#   Solarized or not, dark or light.
# - We choose to have the following category of files:
#   NORMAL & FILE, DIR, LINK, EXEC and
#   editable text including source, unimportant text, binary docs & multimedia source
#   files, viewable multimedia, archived/compressed, and unimportant non-text
# - For uniqueness, we stay away from the Solarized foreground colors are -- either
#   base00 (brightyellow) or base0 (brighblue).  However, they can be used if
#   you know what the bg/fg colors of your terminal are, in order to optimize the display.
# - 3 different options are provided: universal, solarized dark, and solarized light.
#   The only difference between the universal scheme and one that's optimized for
#   dark/light is the color of "unimportant" files, which should blend more with the
#   background
# - We note that blue is the hardest color to see on dark bg and yellow is the hardest
#   color to see on light bg (with blue being particularly bad).  So we choose yellow
#   for multimedia files which are usually accessed in a GUI folder browser anyway.
#   And blue is kept for custom use of this scheme's user.
# - See table below to see the assignments.


# Installation instructions:
# This file goes in the /etc directory, and must be world readable.
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.

# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR tty

# Below, there should be one TERM entry for each termtype that is colorizable
TERM ansi
TERM color_xterm
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM Eterm
TERM eterm-color
TERM fbterm
TERM gnome
TERM gnome-256color
TERM jfbterm
TERM konsole
TERM konsole-256color
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mlterm
TERM nxterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode256
TERM rxvt-unicode-256color
TERM screen
TERM screen-256color
TERM screen-256color-bce
TERM screen-256color-s
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM screen.xterm-new
TERM st
TERM st-256color
TERM vt100
TERM xterm
TERM xterm-new
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian
TERM xterm-termite

# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
EIGHTBIT 1

#############################################################################
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
#
# Attribute codes:
#   00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
#   30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
#   40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#
# NOTES:
# - See http://www.oreilly.com/catalog/wdnut/excerpt/color_names.html
# - Color combinations
#   ANSI Color code       Solarized  Notes                Universal             SolDark              SolLight
#   ~~~~~~~~~~~~~~~       ~~~~~~~~~  ~~~~~                ~~~~~~~~~             ~~~~~~~              ~~~~~~~~
#   00    none                                            NORMAL, FILE          <SAME>               <SAME>
#   30    black           base02
#   01;30 bright black    base03     bg of SolDark
#   31    red             red                             docs & mm src         <SAME>               <SAME>
#   01;31 bright red      orange                          EXEC                  <SAME>               <SAME>
#   32    green           green                           editable text         <SAME>               <SAME>
#   01;32 bright green    base01                          unimportant text      <SAME>
#   33    yellow          yellow     unclear in light bg  multimedia            <SAME>               <SAME>
#   01;33 bright yellow   base00     fg of SolLight                             unimportant non-text
#   34    blue            blue       unclear in dark bg   user customized       <SAME>               <SAME>
#   01;34 bright blue     base0      fg in SolDark                                                   unimportant text
#   35    magenta         magenta                         LINK                  <SAME>               <SAME>
#   01;35 bright magenta  violet                          archive/compressed    <SAME>               <SAME>
#   36    cyan            cyan                            DIR                   <SAME>               <SAME>
#   01;36 bright cyan     base1                           unimportant non-text                       <SAME>
#   37    white           base2
#   01;37 bright white    base3      bg in SolLight
#   05;37;41                         unclear in Putty dark


### By file type

# global default
NORMAL 00
# normal file
FILE 00
# directory
DIR 34
# 777 directory
OTHER_WRITABLE 34;40
# symbolic link
LINK 35

# pipe, socket, block device, character device (blue bg)
FIFO 30;44
SOCK 35;44
DOOR 35;44 # Solaris 2.5 and later
BLK  33;44
CHR  37;44


#############################################################################
### By file attributes

# Orphaned symlinks (blinking white on red)
# Blink may or may not work (works on iTerm dark or light, and Putty dark)
ORPHAN  05;37;41
# ... and the files that orphaned symlinks point to (blinking white on red)
MISSING 05;37;41

# files with execute permission
EXEC 01;31  # Unix
.cmd 01;31  # Win
.exe 01;31  # Win
.com 01;31  # Win
.bat 01;31  # Win
.reg 01;31  # Win
.app 01;31  # OSX

#############################################################################
### By extension

# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')

### Text formats

# Text that we can edit with a regular editor
.txt 32
.org 32
.md 32
.mkd 32

# Source text
.h 32
.c 32
.C 32
.cc 32
.cpp 32
.cxx 32
.objc 32
.sh 32
.csh 32
.zsh 32
.el 32
.vim 32
.java 32
.pl 32
.pm 32
.py 32
.rb 32
.hs 32
.php 32
.htm 32
.html 32
.shtml 32
.erb 32
.haml 32
.xml 32
.rdf 32
.css 32
.sass 32
.scss 32
.less 32
.js 32
.coffee 32
.man 32
.0 32
.1 32
.2 32
.3 32
.4 32
.5 32
.6 32
.7 32
.8 32
.9 32
.l 32
.n 32
.p 32
.pod 32
.tex 32

### Multimedia formats

# Image
.bmp 33
.cgm 33
.dl 33
.dvi 33
.emf 33
.eps 33
.gif 33
.jpeg 33
.jpg 33
.JPG 33
.mng 33
.pbm 33
.pcx 33
.pdf 33
.pgm 33
.png 33
.ppm 33
.pps 33
.ppsx 33
.ps 33
.svg 33
.svgz 33
.tga 33
.tif 33
.tiff 33
.xbm 33
.xcf 33
.xpm 33
.xwd 33
.xwd 33
.yuv 33

# Audio
.aac 33
.au  33
.flac 33
.mid 33
.midi 33
.mka 33
.mp3 33
.mpa 33
.mpeg 33
.mpg 33
.ogg  33
.ra 33
.wav 33

# Video
.anx 33
.asf 33
.avi 33
.axv 33
.flc 33
.fli 33
.flv 33
.gl 33
.m2v 33
.m4v 33
.mkv 33
.mov 33
.mp4 33
.mp4v 33
.mpeg 33
.mpg 33
.nuv 33
.ogm 33
.ogv 33
.ogx 33
.qt 33
.rm 33
.rmvb 33
.swf 33
.vob 33
.wmv 33

### Misc

# Binary document formats and multimedia source
.doc 31
.docx 31
.rtf 31
.dot 31
.dotx 31
.xls 31
.xlsx 31
.ppt 31
.pptx 31
.fla 31
.psd 31

# Archives, compressed
.7z   1;35
.apk  1;35
.arj  1;35
.bin  1;35
.bz   1;35
.bz2  1;35
.cab  1;35  # Win
.deb  1;35
.dmg  1;35  # OSX
.gem  1;35
.gz   1;35
.iso  1;35
.jar  1;35
.msi  1;35  # Win
.rar  1;35
.rpm  1;35
.tar  1;35
.tbz  1;35
.tbz2 1;35
.tgz  1;35
.tx   1;35
.war  1;35
.xpi  1;35
.xz   1;35
.z    1;35
.Z    1;35
.zip  1;35

# For testing
.ANSI-30-black 30
.ANSI-01;30-brblack 01;30
.ANSI-31-red 31
.ANSI-01;31-brred 01;31
.ANSI-32-green 32
.ANSI-01;32-brgreen 01;32
.ANSI-33-yellow 33
.ANSI-01;33-bryellow 01;33
.ANSI-34-blue 34
.ANSI-01;34-brblue 01;34
.ANSI-35-magenta 35
.ANSI-01;35-brmagenta 01;35
.ANSI-36-cyan 36
.ANSI-01;36-brcyan 01;36
.ANSI-37-white 37
.ANSI-01;37-brwhite 01;37

#############################################################################
# Your customizations

# Unimportant text files
# For universal scheme, use brightgreen 01;32
# For optimal on light bg (but too prominent on dark bg), use white 01;34
.log 01;32
*~ 01;32
*# 01;32
#.log 01;34
#*~ 01;34
#*# 01;34

# Unimportant non-text files
# For universal scheme, use brightcyan 01;36
# For optimal on dark bg (but too prominent on light bg), change to 01;33
#.bak 01;36
#.BAK 01;36
#.old 01;36
#.OLD 01;36
#.org_archive 01;36
#.off 01;36
#.OFF 01;36
#.dist 01;36
#.DIST 01;36
#.orig 01;36
#.ORIG 01;36
#.swp 01;36
#.swo 01;36
#*,v 01;36
.bak 01;33
.BAK 01;33
.old 01;33
.OLD 01;33
.org_archive 01;33
.off 01;33
.OFF 01;33
.dist 01;33
.DIST 01;33
.orig 01;33
.ORIG 01;33
.swp 01;33
.swo 01;33
*,v 01;33

# The brightmagenta (Solarized: purple) color is free for you to use for your
# custom file type
.gpg 34
.gpg 34
.pgp 34
.asc 34
.3des 34
.aes 34
.enc 34

Następnie ustawiamy zmienną LS_COLORS w ~/.bashrc przez dopisanie:

eval `dircolors /etc/dir_colors`

W przypadku gdybyśmy jeszcze nie ustawili kolorowania wyjścia dla różnych programów, możemy to zrobić (również w ~/.bashrc) przez dopisanie:

if [ -x /usr/bin/dircolors ]; then
    alias ls='ls -hF --group-directories-first --color=auto'
    alias dir='dir --color=auto'
    alias vdir='vdir --color=auto'
    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

Po tym zabiegu przejrzystość konsoli, nie tylko tty, poprawi się znacząco.

Można również pokolorować manuale -- te dostępne przez wpisanie "man program". Nie będzie tego co prawda dużo ale zawsze łatwiej odnaleźć pewne rzeczy gdy się wyróżniają z tłumu. Dopisujemy zatem poniższy blok do ~/.bashrc :

#-------- Color Manpages
export LESS_TERMCAP_mb=$'\E[01;31m' # begin blinking
export LESS_TERMCAP_md=$'\E[01;31m' # begin bold
export LESS_TERMCAP_me=$'\E[0m' # end mode
export LESS_TERMCAP_se=$'\E[0m' # end standout-mode
export LESS_TERMCAP_so=$'\E[01;44;33m' # begin standout-mode - info box
export LESS_TERMCAP_ue=$'\E[0m' # end underline
export LESS_TERMCAP_us=$'\E[01;32m' # begin underline
#export MANPAGER="/usr/bin/most -s" # color using most

7. Czcionki oraz bufor virtualnej konsoli tty

Standardowa konsola ma bufor przewijania na poziomie 4x wielkości ekranu. Przynajmniej na rozdzielczości 1280x1024 mogę przewinąć 4 razy w górę przy pomocy shift+page_up . W przypadku gdy się spędza większość życia pod virtualną konsolą, taki bufor jest nie do zaakceptowania. Można go w prosty sposób zwiększyć dopisując do linijki kernela w extlinux/grub poniższy parametr:

fbcon=scrollback:1024k

Oczywiście liczbę można zmienić według uznania, 1024k da nam zapas jakichś 104 page_upów. xD To całkiem rozsądna liczba. To by nas zadowalało gdybyśmy nie korzystali z tmuxa. Tmux, jak już wspomniałem, ma własny bufor i bez względu na to czy ustawimy powyższy parametr i jaką on będzie miał wartość, my będziemy mieć zawsze dostęp do historii trybu kopiowania przez skrót ctrl+a+[ .

Druga sprawa to czcionki, te można konfigurować przez dpkg-reconfigure console-setup . Możemy ustawić ręcznie większe lub mniejsze czcionki pod tty. Trzeba wziąć jednak pod uwagę, że im większe one będą pod tty, tym mniej miejsca zostanie przydzielonego pod terminal w tmuxie. Przykładowo, jeśli ustawimy rozmiar czcionki 16x32 terminal się skurczy do coś koło rozdzielczości 640x480, w każdym razie będzie sporo mniejszy niż przy 8x16, mimo, że rozdzielczość ekranu się nie zmieniła.

8. Wywoływanie terminali

Mając już skonfigurowane obie zabawki można przejść do ich połączenia, tak by w efekcie nie zauważać, że to są dwa osobne narzędzia. Na sam początek skróty, które można umieścić na panelu. Tak wyglądają wpisy dwóch osobnych terminali -- jeden wykorzystuje tmuxa, drugi nie. Zawsze lepiej zostawić jeden terminal bez tmuxa.

Terminal bez tmuxa:

[Desktop Entry]
Name=Urxvt
Comment=Multiple terminals in one window
Exec=urxvtc -name 'standard'
Icon=/home/morfik/.config/launchery/icons/urxvt_standard.png
Type=Application
Categories=GNOME;GTK;Utility;TerminalEmulator;System;

Terminal z temuxem:

[Desktop Entry]
Name=Urxvt
Comment=Multiple terminals in one window
Exec=urxvtc -name 'tmux' -e bash -c 'tmux attach-session -t standard'
Icon=/home/morfik/.config/launchery/icons/urxvt_tmux.png
Type=Application
Categories=GNOME;GTK;Utility;TerminalEmulator;System;

Jak widać różnią się wywołaniem. Jeśli chcemy się podłączyć do sesji tmuxa, musimy korzystać z tmux attach-session i sprecyzować sesje przez parametr -t. Przy czym jeśli zamkniemy terminal, po ponownym otwarciu stan jego będzie taki sam jak przed zamknięciem. Wszystko jedno czy zdechną nam x-y z jakiegoś powodu, czy przez przypadek zamkniemy terminal, dopóki nie padnie serwer tmuxa albo go ręcznie nie ubijemy przez tmux kill-server, status sesji zostanie niezmieniony.

Tmux automatycznie synchronizuje zawartość okien, dlatego nawet jeśli jedno jest większe niż inne, rozmiar tmuxa będzie dostosowany do tego terminala o najmniejszych wymiarach, a w tych większych, część przestrzeni zostanie zakropkowana. Jeśli przeszkadza nam to, możemy bez problemu odłączyć klienta od sesji przy pomocy tmux detach, albo po prostu zamknąć terminal. Wtedy tmux od razu zwiększy swój rozmiar i dostosuje go do wielkości terminala, który pozostał.

9. Projekt osadzenia konsoli na pulpicie

Jako, że już powinniśmy mieć opanowanego zarówno tmuxa, jak i urxvt, możemy gdzieś ten duet zaimplementować. Wszyscy wiemy, że ogromna rzesza ludzi nie patrzy w logi systemowe, zwykle nawet ciężko jest dopuścić do głowy taką wiadomość, że gdy coś się złego dzieje, to event może zostać zalogowany w jakimś pliku. Skoro zatem tmux posiada takie nadprzyrodzone zdolności, to czemu nie przeznaczyć jego jednego okna na podgląd logów systemowych? Przełączanie nie stanowi problemu ctrl+a+spacja albo ctrl+a+backspace. Zatem do roboty.

Przede wszystkim musimy utworzyć urządzenie-plik, podobne do tych w katalogu /dev/ . Można je oczywiście utworzyć w dowolnym miejscu ale skoro tam są urządzenia, to lepiej wszystkie trzymać w jednej lokalizacji. By stworzyć takie urządzenie logujemy się na roota i wydajemy poniższe poniższe dwa polecenia:

# mkfifo -m 0740 /dev/logi
# chown root:morfik /dev/logi

Teraz edytujemy plik /etc/rsyslog.conf i dodajemy w nim zawartość:

*.*;auth,daemon,kern,user    -/dev/logi

Skopiuje to pewne wpisy i wyśle do naszego urządzenia. To jakie opcje można dodać są zawarte pod tym linkiem. Samo urządzenie posiada grupę morfik oraz prawa tylko do odczytu. Nikt poza użytkownikami w tej grupie nie będzie w stanie podejrzeć logów. Można także stworzyć kilka urządzeń i rozdzielić odpowiednie obiekty jeśli komuś przeszkadza, że wszystko wędruje do jednego wyjścia.

Sam log jest dość surowy jeśli chodzi o kolorystykę. Można to oczywiście zmienić przez zastosowanie ccze. I jeśli już się zorientowaliśmy jak ma wyglądać sesja tmuxa z logami, to trzeba ją dodać do pliku konfiguracyjnego albo stworzyć własny skrypt, który będzie inicjował sesje, tak jak to było opisane powyżej. Tak wygląda przykładowy wpis sesji w /etc/tmux.conf:

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

Był on opisany wyżej, my się teraz skupimy na wywołaniu polecenia, czyli na linijce drugiej:

cat /dev/logi -- wyświetla zawartość urządzenia, jeśli jakiś log zostanie przesłany, natychmiast go zobaczymy.
| ccze -- to co zostanie wydobyte z /dev/logi zostanie przesłane na wejście ccze i pokolorowane.
-m ansi -- ten tryb sprawi, że będziemy w stanie przewijać wyjście.
-p syslog -- plugin, który ma na celu pokolorować logi w oparciu o schemat sysloga.
-C -- konwertuje format daty na bardziej czytelny dla człowieka.

Sesja utworzona. Musimy się jakoś do niej jakoś podłączyć. Trzeba mieć na uwadze, że to działa w tle i można do wyświetlenia zawartości logów podejść na dwa sposoby -- albo osadzić urxvt na pulpicie albo przełączyć się z innej sesji z innego klienta. Osadzenie terminala sprowadza się do ustawienia odpowiednich wartości w ~/.Xresources , to już omówiliśmy, także osadzenie samej konsoli nie powinno nastręczać problemów. Natomiast druga kwestia, czyli przełączenie się miedzy sesjami zasługuje na dwa słowa wyjaśnienia.

Jeśli nie planujemy umieszczać konsoli na pulpicie to nadal jesteśmy w stanie bez problemu podejrzeć to co jest w logu, wystarczy wcisnąć ctrl+a+" i wybrać sesję, która nas interesuje. Zaglądamy w log i wracamy do innej sesji. Jako, że można też tworzyć kilka okien w jednej sesji, być może tworzenie dwóch sesji jest niepraktyczne i wystarczy utworzyć tylko osobne okno na log. Ja jednak wolę widzieć logi na pulpicie i korzystać z osobnego terminala, którym mogę dość swobodnie operować. Dzięki temu nie tracę z pola widzenia logów i jeśli coś się wydarzy w systemie, wiem o tym natychmiast.

10. Configi

Konfiguracyja mojego urxvt (plik ~/.Xresources):

! fonts----------------------------------------------------------------------
Xft.dpi:                    96
Xft.antialias:              false
Xft.rgba:                   none
Xft.hinting:                true
Xft.hintstyle:              hintfull

! urxvt----------------------------------------------------------------------
! icon
URxvt*iconFile:             /home/morfik/.config/launchery/icons/urxvt_standard.png

! urxvt fonts
URxvt*font:                 xft:monospace:size=9
URxvt*boldFont:             xft:monospace:bold:size=9
URxvt*italicFont:           xft:monospace:italic:size=9
URxvt*boldItalicFont:       xft:monospace:bold:italic:size=9
URxvt.keysym.C-S-Up:        perl:font-size:increase
URxvt.keysym.C-S-Down:      perl:font-size:decrease

! scrollbar
URxvt*scrollBar:            false
! URxvt*scrollBar_right:    true
URxvt*scrollTtyOutput:      false

! extentions
URxvt*perl-ext-common:      default,matcher,font-size,clipboard

! clipboard
URxvt.keysym.C-c:           perl:clipboard:copy
URxvt.keysym.C-v:           perl:clipboard:paste
URxvt.keysym.C-M-v:         perl:clipboard:paste_escaped
URxvt.clipboard.copycmd:    xsel -ib
URxvt.clipboard.pastecmd:   xsel -ob

! links
URxvt*url-launcher:         /opt/firefox/firefox
URxvt*matcher.button:       1
URxvt*colorUL:              #4682B4

! other settings
URxvt*loginShell:           true
URxvt*saveLines:            0
URxvt*iso14755:             false
URxvt*iso14755_52:          false

! mouse
URxvt*cursorUnderline:      true
URxvt*cursorBlink:          true
URxvt*pointerBlank:         true
URxvt*cursorColor:          #E77320
URxvt*cursorColor2:         #E77320
URxvt*pointerColor:         #E77320
URxvt*pointerColor2:        #E77320

! appearance
*cdesktop.borderLess:       true
*standard.borderLess:       false
*tmux.borderLess:           false
! URxvt*borderColor:        #E77320
*cdesktop.geometry:         147x39+5+407
*standard.geometry:         147x39+100+207
*tmux.geometry:             147x39+100+207

! transparency
URxvt.depth:                32
*cdesktop.background:       [50]#000000
*standard.background:       #000000
*tmux.background:           #000000
URxvt*foreground:           #E77320

!black
URxvt*color0:               #232323
!darkgreen
URxvt*color1:               #D75F5F
!brown
URxvt*color2:               #87AF5F
!darkblue
URxvt*color3:               #D7AF87
!darkmagenta
URxvt*color4:               #8787AF
!darkcyan
URxvt*color5:               #BD53A5
!darkcyan
URxvt*color6:               #5FAFAF
!lightgrey
URxvt*color7:               #E5E5E5
!darkgrey
URxvt*color8:               #2B2B2B
!red
URxvt*color9:               #E33636
!green
URxvt*color10:              #98E34D
!yellow
URxvt*color11:              #FFD75F
!blue
URxvt*color12:              #7373C9
!magenta
URxvt*color13:              #D633B2
!cyan
URxvt*color14:              #44C9C9
!white
URxvt*color15:              #FFFFFF

Knfiguracja mojego tmuxa (plik /etc/tmux.conf):

# /etc/tmux.conf
#
# See the following files:
#
# /opt/local/share/doc/tmux/t-williams.conf
# /opt/local/share/doc/tmux/screen-keys.conf
# /opt/local/share/doc/tmux/vim-keys.conf
#
# URLs to read:
#
# http://blog.yjl.im/2009/11/migrating-to-tmux-from-gnuscreen.html
# http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/
# http://blog.hawkhost.com/2010/07/02/tmux-%E2%80%93-the-terminal-multiplexer-part-2/
# http://www.dayid.org/os/notes/tm.html
#
# Other sample tmux.conf files
#
# http://www.mindfuzz.net/?p=178
#
# -----------------------------------------------------------------------------
# set prefix key to Ctrl-a
unbind-key C-b
set -g prefix C-a

# send the prefix to client inside window
bind-key C-a send-prefix
 
# toggle last window like screen
bind-key C-a last-window

# reload config file
bind r source-file /etc/tmux.conf \; display-message "Config reloaded..."

# Activity monitoring in status bar
setw -g monitor-activity off

# open a man page in new window
#bind-key / command-prompt "split-window 'exec man %%'"
 
# quick view of processes
#bind-key "~" split-window "exec htop"
 
# scrollback buffer n lines
set -g history-limit 5000

# clear history  (ctrl+alt+b)
bind-key n send-keys -R \; clear-history
 
# listen for activity on all windows
set -g bell-action any
#set -g bell-action none
 
# start window indexing at zero (default)
set -g base-index 1
 
# instructs tmux to expect UTF-8 sequences
setw -g utf8 on
set -g utf8 on
 
# tell tmux to use 256 colour terminal
set -g default-terminal "screen-256color"
 
# xterm-style function key sequences
setw -g xterm-keys on
 
# control automatic window renaming
setw -g automatic-rename off
 
# enable wm window titles
set -g set-titles on
 
# wm window title string (uses statusbar variables)
#set -g set-titles-string "tmux.#I.#W"
 
# don't close windows. just deactivate them. use respawn-window to reactivate.
#setw -g remain-on-exit on

# detach client
bind-key d detach
 
# choose a client to detach
bind-key D choose-client
 
# choose window/session
bind-key "'" choose-window
bind-key '"' choose-session
 
# display visible indicator of each pane
bind-key w display-panes

# Ctrl-Left/Right cycles thru windows (no prefix)
bind-key -n "C-Left" select-window -t :-
bind-key -n "C-Right" select-window -t :+
 
# Ctrl-Up/Down cyles thru panes (no prefix)
bind-key -n "C-Up" select-pane -t :.-
bind-key -n "C-Down" select-pane -t :.+

# kill current pane/window
bind-key q confirm-before kill-pane
bind-key Q confirm-before kill-window

# window layouts (emacs-like)
#bind-key 1 break-pane
#bind-key 2 select-layout even-vertical
#bind-key 3 select-layout even-horizontal
#bind-key o select-pane -U
 
# specific window layouts
#bind -r y next-layout
#bind o select-layout "active-only"
#bind O select-layout "main-vertical"

# copying and pasting
bind-key [ copy-mode
bind-key ] paste-buffer -s \015

# copying tmux buffer to system clipboard
bind C-y run "tmux save-buffer - | xsel -b -i"

# vi-style controls for copy mode
#setw -g mode-keys vi
#bind-key -t vi-copy 'v' begin-selection
#bind-key -t vi-copy 'y' copy-selection

# filtering terminal output using ansifilter, more info at:
# http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php
bind-key C-p pipe-pane -o 'ansifilter >>~/output.#I-#P'

# mouse support
set -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
 
# list all paste buffers (default key is '#')
bind-key b list-buffers
 
# choose buffer to paste interactively (default key was '=')
bind-key p choose-buffer
 
# delete the most recently copied buffer of text (default key was '-')
bind-key x delete-buffer

# new window
bind-key c new-window
 
# next
bind-key -r Space next-window
 
# prev
bind-key -r BSpace previous-window
 
# title (default key in tmux is ',')
bind-key A command-prompt "rename-window %%"
 
# quit
bind-key \ confirm-before kill-server
 
# displays
bind-key * list-clients
 
# redisplay (default key in tmux is 'r')
#bind-key C-l refresh-client
bind-key l refresh-client

# Split windows like vim
# vim's definition of a horizontal/vertical split is reversed from tmux's
#bind-key s split-window -v
#bind-key v split-window -h
 
# alternatively, use better mnemonics for horizontal/vertical splits
bind-key - split-window -v
bind-key _ split-window -v
bind-key | split-window -h
 
# resize panes like vim
bind-key -r < resize-pane -L 3
bind-key -r > resize-pane -R 3
bind-key -r + resize-pane -U 1
bind-key -r = resize-pane -D 1

# time for multiple commands (1s)
set -g repeat-time 1000

# Statusbar settings
set -g status-interval 1
set -g status-justify centre
set -g status-left-length 30
set -g status-right-length 140
set -g status-left '#[fg=green]#H #[fg=black]• #[fg=green,bright]#(uname -r)#[default]'
set -g status-right '#[fg=green,bg=default,bright]#(tmux-mem-cpu-load 1) #[fg=red,dim,bg=default]#(uptime | cut -f 4-5 -d " " | cut -f 1 -d ",") #[fg=white,bg=default]%H:%M:%S#[default] #[fg=blue]%Y-%m-%d'

# toggle statusbar
bind-key s set status
 
# use vi-style key bindings in the status line
set -g status-keys vi

# amount of time for which status line messages and other indicators
# are displayed. time is in milliseconds.
set -g display-time 2000
 
# default statusbar colors
set -g status-bg colour235 #base02
set -g status-fg colour136 #yellow
set -g status-attr default

# default window title colors
setw -g window-status-fg colour244 #base0
setw -g window-status-bg default
setw -g window-status-attr dim
 
# active window title colors
setw -g window-status-current-fg colour166 #orange
setw -g window-status-current-bg default
setw -g window-status-current-attr underscore
 
# command/message line colors
set -g message-bg colour235 #base02
set -g message-fg colour166 #orange
set -g message-attr bright

# pane border
set -g pane-border-fg colour240 #base02
set -g pane-active-border-fg colour240 #base01

# pane number display
set -g display-panes-active-colour colour33 #blue
set -g display-panes-colour colour166 #orange

# clock
setw -g clock-mode-colour colour166 #orange

# Session initialization
#new -s logi -n cmd
#neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
#splitw -t 1 -v -p 50
#selectw -t 2
#selectp -t 0

#new -s standard -n htop "htop"
#neww -n cmd
#splitw -t 2 -v -p 50
#selectw -t 2 
#selectp -t 1
# -----------------------------------------------------------------------------
# vim: fen fdl=0 fdm=marker

Konfiguracaja mojego ccze (plik: /etc/cczerc):

# Configuration file for ccze
#
# Available 'pre' attributes: bold, underline, underscore, blink, reverse
# Available colors:  black, red, green, yellow, blue, magenta, cyan, white
# Available bgcolors: on_black, on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white
#
# You can also use item names in color definition, like:
#
# default   blue
# date      'default'
#
# Here you defined default color to blue, and date color to default value's color, so
# your date color is blue. (You can only use predefined item names!)

# item          color                   # comment (what is color, or why it's that ;)

date            bold yellow               # Dates and times
#date            bold cyan               # Dates and times
host            bold blue               # Host names and IP numbers
process         cyan                   # Sender process
pid             bold white              # PIDs (Process IDs)
pid-sqbr        bold green              # Brackets around PIDs
default         green                    # Default (not colorised)
email           bold green              # E-mail addresses
subject         magenta                 # Subject lines (procmail)
dir             bold cyan               # Directory names
file            bold cyan               # File names
size            bold white              # Sizes
user            bold yellow             # Usernames
httpcodes       bold white              # HTTP status codes (200, 404, etc)
getsize         magenta                 # Transfer sizes
get             green                   # HTTP GET
post            bold green              # HTTP POST
head            green                   # HTTP HEAD
put             bold green              # HTTP PUT
connect         green                   # HTTP CONNECT
trace           green                   # HTTP TRACE
unknown         cyan                    # Unknown message
gettime         bold magenta            # Transfer times
uri             bold green              # URIs (http://, ftp://, etc)
ident           bold white              # Remote user (proxy/http)
ctype           white                   # Content type (http/proxy)
error           bold red                # Error messages
miss            red                     # Proxy MISS
hit             bold yellow             # Proxy HIT
deny            bold red                # Proxy DENIED
refresh         bold white              # Proxy REFRESH
swapfail        bold white              # Proxy SWAPFAIL
debug           white                   # Debug messages
warning         red                     # Warnings
direct          bold white              # Proxy DIRECT
parent          bold yellow             # Proxy PARENT
swapnum         blue on_white           # Proxy swap number
create          bold white              # Proxy CREATE
swapin          bold white              # Proxy SWAPIN
swapout         bold white              # Proxy SWAPOUT
release         bold white              # Proxy RELEASE
mac             bold white              # MAC addresses
version         bold white              # Version numbers
address         bold white              # Memory addresses
numbers         white                   # Numbers
signal          bold yellow             # Signal names
service         bold magenta            # Services
prot            magenta                 # Protocols
bad             bold yellow             # "Bad words"
good            bold green              # "Good words"
system          bold cyan               # "System words"
incoming        bold white              # Incoming mail (exim)
outgoing        white                   # Outgoing mail (exim)
uniqn           bold white              # Unique ID (exim)
repeat          white                   # 'last message repeated N times'
field           green                   # RFC822 Field
chain           cyan                    # Chain names (ulogd)
percentage      bold yellow             # Percentages
ftpcodes        cyan                    # FTP codes
keyword         bold yellow             # Various keywords (like PHP in php.log, etc)
pkgstatus       green                   # package status (dpkg)
pkg             bold red                # package name (dpkg)

# CSS codes for the HTML output
cssblack        black
cssboldblack    black
cssred          darkred
cssboldred      red
cssgreen        #00C000
cssboldgreen    lime
cssyellow       brown
cssboldyellow   yellow
cssblue         blue
cssboldblue     slateblue
csscyan         darkcyan
cssboldcyan     cyan
cssmagenta      darkmagenta
cssboldmagenta  magenta
csswhite        grey
cssboldwhite    white
cssbody         #404040

Zarówno tmux jak i urxvt mają wiele opcji konfiguracji. W powyższych plikach nie ma uwzględnionych wszystkich parametrów. Te zaś można znaleźć w obszernych manualach: tmux oraz urxvt i do poczytania na wchwiki o ~/.Xresources.

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks