Tmux - moja konfigurácia

22.04.2021

Keď som pred dvoma týždňami točil video, kde som predstavoval tmux, tak som sľuboval, že urobím aj ďalšie video o jeho základnej konfigurácii. Vtedy som plánoval ukázať iba pár možností a nakoniec celý dizajn prenechať na Powerline. Medzičasom mi však Powerline začal prekážať, takže som si dizajn nakonfiguroval sám. V tomto článku vidíte výsledok.

Môj hlavný problém s powerline dizajnom v tmux-e je jeho rozvláčnosť. Ak mám otvorených 8 a viac tabov (ehm... okien), tak ich častokrát nevidím na stavovom riadku všetky.

Tmux, kde sa o dizajn stará Powerline

Ako vidieť z obrázku, ľavá časť stavového riadku sa celkom naťahuje a je tam veľa prázdneho miesta.

Tmux + Powerline

Toto je moja pôvodná konfigurácia, súbor ~/.tmux.conf:

set -g prefix C-a

set -g escape-time 10

set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",*256col*:Tc"

run-shell "powerline-daemon -q"
source "/usr/share/powerline/bindings/tmux/powerline.conf"

Môj vlastný dizajn pre tmux

V novej konfigurácii som vyhodil Powerline a nakonfiguroval som si dizajn, ktorý nezaberá toľko miesta. Výsledok je vidieť na obrázku.

Tmux v custom dizajne

Keď som už bol pri tom, tak som k svojej konfigurácii rovno vytvoril aj git repozitár a tak si môžete výsledný kód rovno stiahnuť. Repozitár je tu: https://bitbucket.org/perungrad/dotfiles-tmux/

Tu je teda moja nová konfigurácia:

set -g prefix C-a
set -g escape-time 10

# pekné farby pre vim a pod.
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",*256*:Tc"

# stavový riadok chcem dole
set -g status-position bottom

# C-a C-r reloadne konfiguráciu a aplikuje zmeny pre bežiacu session
bind C-r source-file ~/.tmux.conf

# definície farieb
color_dark="colour232"
color_light="white"
color_status_text="colour245"
color_main="colour10"
color_session_bg="colour229"
color_session_fg="colour16"
color_icon_load="colour190"

# farbičky pre zobrazenie okna, správ a základný štýl pre stavový riadok
set -g mode-style "fg=default,bg=$color_main"
set -g message-style "fg=$color_main,bg=$color_dark"
set -g status-style "fg=$color_status_text,bg=$color_dark"

# max. dĺžka pre pravú časť
set -g status-right-length 100
# ako často obnovovať statový riadok (v sekundách)
set -g status-interval 5

# oddeľovač okien
set -g window-status-separator ""

# pomocné premenné
separator_left="]"
separator_right="["

# vlastné príkazy, ktoré sa použijú ako "widgety" v pravej časti
widget_date="#(date +'%d.%m.%Y')"
widget_time="#(date +'%H:%M')"
widget_load="#(node ~/.config/tmux/widget-load.js)"

# ikonky, potrebuješ Nerd Fonty: https://www.nerdfonts.com/
icon_flame="\uf490"
icon_clock="\uf43a"

# na tabe pre okno je číslo a názov
setw -g window-status-format " #I:#W "
# farby pre tab aktuálneho okna
setw -g window-status-current-style "fg=$color_light,bold,bg=$color_main"
# formát aktuálneho okna
setw -g window-status-current-format "#[fg=$color_dark,bg=$color_main]$separator_right#[fg=$color_dark,bg=$color_main] #I:#W #[fg=$color_dark,bg=$color_main]$separator_left#[default]"

# štýl pre okna, kde je upozornenie na aktivitu
setw -g window-status-activity-style "fg=$color_main"

# ako vyzerá blok s názvom session
set -g status-left "#[bg=$color_session_bg,fg=$color_session_fg,bold] #{session_name} #[default]"

# ako vyzerá pravá časť
set -g status-right " #[fg=$color_icon_load]$icon_flame#[default] $widget_load | $widget_date $icon_clock $widget_time "

Na zobrazovanie aktuálneho vyťaženia systému (aka load) som si napísal vlastný kód v JavaScripte, na ktorý sa odkazuje príkaz pre widget_load.

const { exec } = require("child_process");
const process = require("process");

const colors = [
    "colour10",
    "colour11",
    "colour166",
    "colour168",
    "colour9",
    "colour196",
];

const getColor = load => {
    const n = Math.min(Math.floor(load / 2), colors.length - 1);

    return colors[n];
};

exec("cat /proc/loadavg", (error, stdout, stderr) => {
    const result = stdout.match(/^([^\s]+)\ ([^\s]+)\ ([^\s]+)/);

    if (!result) {
        return;
    }

    const load1 = parseFloat(result[1]);
    const load5 = parseFloat(result[2]);
    const load15 = parseFloat(result[3]);

    process.stdout.write(
        `#[fg=${getColor(load1)}]${result[1]}#[default] ` +
            `#[fg=${getColor(load5)}]${result[2]}#[default] ` +
            `#[fg=${getColor(load15)}]${result[3]}#[default]`
    );
});