Вопрос или проблема
Я хотел бы, чтобы 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-битные варианты цветов. Применяя такие методы, можно значительно улучшить тематику рабочего процесса.