Установите цвет строки состояния tmux в зависимости от имени хоста

Вопрос или проблема

Я хотел бы, чтобы tmux динамически выбирал цвет в зависимости от имени хоста машины. Поскольку я использую один и тот же tmux.conf на нескольких машинах, было бы удобно назначить уникальный цвет для каждого из этих хостов, особенно когда я работаю на нескольких одновременно. Это выполнимо?

Я придумал следующую функцию для оболочки:

hash_string256() {
    # Хэш $1 в число
    hash_value=$(printf "%s" "$1" | md5sum | tr -d " -" | tr "a-f" "A-F")
    # Сложите хэш с $2 и возьмите результат по modulo 256
    # если $2 == "" это 0
    printf "ibase=16; (%s + %X) %% 100\n" $hash_value "$2" | bc
}

Эту функцию можно использовать так (результаты верны, если $HOST это LOL):

$hash_string256 $HOST
 113
$hash_string256 $HOST 127
 240

Чтобы связать это с tmux, вы можете использовать скрипт, который запускает и настраивает tmux.

#!/bin/sh
SESSION=$USER

hash_string256() {
    hash_value=$(printf "%s" "$1" | md5sum | tr -d " -" | tr "a-f" "A-F")
    printf "ibase=16; (%s + %X) %% 100 \n" $hash_value "$2" | bc
}

tmux -2 new-session -d -s $SESSION

tmux set -g status-fg colour$(hash_string256 $HOST)
tmux set -g status-bg colour$(hash_string256 $HOST 127)

# Подключение к сеансу
tmux -2 attach-session -t $SESSION

Для имени хоста LOL это установит status-fg в colour113 и status-bg в colour240. Число 127 в $(hash_string256 $HOST 127) добавлено, чтобы фон не совпадал с цветом текста и отличался друг от друга.

Для систем без GNU

Если ваша система имеет md5 вместо md5sum, строку

hash_value=$(printf "%s" "$1" | md5sum | tr -d " -" | tr "a-f" "A-F")

можно заменить на

hash_value=$(printf "%s" "$1" | md5 | tr "a-f" "A-F")

Я тоже хотел эту функцию. Я в основном объединил все в этом .tmux.conf

# cat <<__DATA__ >/dev/null
# Встраивание оболочечных скриптов

set -g status-utf8 on
set -g utf8 on

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

run "cut -c3- ~/.tmux.conf | bash -s apply_configuration"

# __DATA__
#
# apply_configuration() {
#    tmux set -g status-bg colour$(hash_string256 $(hostname))
# }
# hash_string256() {
#      hash_value=$(printf "%s" "$1" | md5sum | sed -e 's/[^[:alnum:]]\+//g' | tr "a-f" "A-F")
#      if [ "x" != "x$2" ]
#      then
#          v2="+ $2"
#      fi
#      echo "$(((0x$hash_value $v2) % 255))" | tr -d "-"
# }
# 
# $1

Я убрал использование bc, потому что у меня его не было в git-bash. Таким образом, я хотел, чтобы это работало на моих системах Linux и Windows с Cygwin без добавления лишнего.

.tmux.conf:

run "tmux set -g status-bg $(hostname -s | hexdump -e '\"0x%02x\"' | cut -c-4 | xargs printf 'colour%d')"

Новые версии tmux позволяют использовать 24-битные цвета, поэтому вместо сопоставления с цветами от 0-255 мы можем передавать полную шестнадцатеричную строку, которая генерируется из имени хоста. К сожалению, хотя есть места в tmux.conf, где можно вызвать внешнюю команду, это ограничивается только текстовыми полями, такими как status-left и status-right, и обычно не работает для визуальных свойств. Тем не менее, мы можем использовать команду run в tmux.conf для обхода этого:

run "tmux set -g status-bg $(hostname -s | hexdump -n 3 -e '\"#%06x \"')"

Этот простой метод возьмет короткое hostname, преобразует первые три байта в шестнадцатеричный формат с помощью hexdump и использует это как шестнадцатеричный цвет для фона панели состояния tmux.

Тем не менее, это не совсем идеально, потому что чаще всего ваше имя хоста будет написано строчными буквами и может содержать цифры. Это значит, что вы всегда будете находиться в одной части цветового пространства. Если вы хотите немного больше разнообразия в цветах, вы можете использовать эту команду:

run "tmux set -g status-bg $(hostname | md5sum | cut -c1-6 | xargs -n 1 printf \"#%s\")"

Эта команда берет полное hostname и вычисляет md5sum, чтобы использовать полный диапазон шестнадцатеричных цифр. Затем она использует cut, чтобы захватить первые шесть выходных цифр, а затем xargs и printf, чтобы отформатировать это как цвет. Это не только устанавливает фон по имени хоста, но и обеспечивает достаточное разнообразие фонов цвета – хотя иногда это будет выбирать не идеальные цвета.

Ответ или решение

Настройка цветовой схемы строки состояния tmux в зависимости от имени хоста

При работе на нескольких машинах одновременно пользователи часто сталкиваются с необходимостью различать их по визуальным признакам. Одним из решений этой задачи может стать динамическое изменение цвета строки состояния в tmux в зависимости от имени хоста. В данной статье мы подробно рассмотрим, как реализовать данную функциональность и оптимизировать ваш tmux.

Разработка функции для хеширования

Для начала нам потребуется создать функцию, которая будет преобразовывать имя хоста в числовой формат, использующий хеширование. Ваша исходная функция hash_string256 выглядит достаточно хорошо, но давайте оптимизируем ее несколько иначе для большей универсальности и совместимости с разными системами.

hash_string256() {
    local hash_value
    local base_hash=$(printf "%s" "$1" | md5sum | tr -d " -" | tr "a-f" "A-F")
    printf "ibase=16; %s %s" "$base_hash" "${2:-0}" | bc | awk '{print $1 % 256}'
}

Эта функция принимает два аргумента: имя хоста и, не обязательно, дополнительное значение для изменения цвета. Используя bc, функция возвращает значение от 0 до 255.

Интеграция с tmux

Теперь, когда мы создали функцию для вычисления значений, необходимо интегрировать ее в настройку tmux. Мы можем добавить необходимую конфигурацию в файл .tmux.conf. Приведем пример конфигурации, которая изменяет цвета строки состояния в зависимости от имени хоста:

# tmux.conf
set -g status-utf8 on
set -g utf8 on
set -g default-terminal "screen-256color"

# Функция установки статуса в зависимости от имени хоста
set_status_colors() {
    local fg_color bg_color
    fg_color=$(hash_string256 "$(hostname)")
    bg_color=$(hash_string256 "$(hostname)" 127)

    tmux set -g status-fg "colour$fg_color"
    tmux set -g status-bg "colour$bg_color"
}

# Запуск функции
set_status_colors

В этом примере функция set_status_colors устанавливает два цвета: один для текста (foreground), другой для фона (background). Мы используем хеширование для обеспечения уникальности и высокого контраста между цветами.

Улучшенная версия с 24-битными цветами

Для более новых версий tmux, поддерживающих 24-битные цвета, можно использовать hexadecimal для получения более точного и насыщенного цвета. Мы можем сделать это следующим образом:

run "tmux set -g status-bg $(hostname | md5sum | cut -c1-6 | xargs -n 1 printf '#%s')"

Этот подход обеспечивает разнообразие и позволяет использовать полный диапазон цветов, что делает интерфейс более привлекательным и визуально выразительным.

Заключение

Настройка цветовой схемы строки состояния в tmux в зависимости от имени хоста – это не только удобная, но и эстетически приятная идея для пользователей, работающих на нескольких машинах. В данной статье мы рассмотрели, как создать кастомную функцию хеширования, интегрировать ее в tmux и использовать как 256-цветные, так и 24-битные варианты цветов. Применяя такие методы, можно значительно улучшить тематику рабочего процесса.

Оцените материал
Добавить комментарий

Капча загружается...