Статьи

Автоматическая раскраска вкладок терминала в зависимости от сервера

Вот:

ITerm 2 OSX  и, возможно, некоторые другие терминальные приложения поддерживают   расширения последовательности управления ANSI, которые позволяют оболочке устанавливать цвет вкладки терминала.

Ниже приведен скрипт Python, который

  • Рандомизирует цвет в зависимости от имени хоста сервера. Одно и то же имя хоста всегда приводит к одному и тому же цвету.
  • Цвет рандомизируется в цветовом пространстве HSL, так что меняется только компонент оттенка, а насыщенность и яркость блокируются. Это предотвращает создание уродливых цветовых комбинаций, таких как черный текст на черном фоне вкладки.

Примечание. Эффект также можно применить к окнам терминала — для тех, кто не использует вкладки.

Эффективный результат заключается в том, что

  • Вы научитесь определять вкладки терминала по цвету
  • Вы можете намного быстрее переключаться между вкладками, потому что вы можете визуально подобрать терминал без необходимости читать текст на нем или помнить его местоположение в списке

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

Примечание: Естественно, вам также нужно установить скрипт на серверах, на которые вы ssh’ing

1. крюк precmd ()

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

Этого можно избежать

  1. Вычисление последовательности управляющего кода OSC, необходимой для установки цвета вкладки терминала при запуске оболочки
  2. Используйте функцию  precmd ()  (терминология zsh, не уверен, что используют другие оболочки) для сброса цвета вкладки при каждом отображении приглашения оболочки

Мы со мной и моим другом поддерживаем (еще один) инструментарий zsh под названием  ztanesh (github) . Там вы можете найти примеры кодов precmd () в 1)  98-server-color  и 2)  80-statusbar .

2. rainbow-parade.py

Код скрипта живет на Github . В настоящее время он поддерживает только iTerm 2, и мы планируем расширить поддержку до Konsole. Патчи для других терминалов приветствуются.

(Возможно, это можно сделать и в чистом шелл-коде, но Python намного веселее…)

#!/usr/bin/env python
"""

       Set terminal tab / decoration color by the server name.

       Get a random colour which matches the server name and use it for the tab colour:
       the benefit is that each server gets a distinct color which you do not need
       to configure beforehand.

"""

import socket
import random
import colorsys
import sys

# http://stackoverflow.com/questions/1523427/python-what-is-the-common-header-format
__copyright__ = "Copyright 2012 Mikko Ohtamaa - http://opensourcehacker.com"
__author__ = "Mikko Ohtamaa <mikko@opensourcehacker.com>"
__licence__ = "WTFPL"
__credits__ = ["Antti Haapala"]

USAGE = """
Colorize terminal tab based on the current host name.

Usage: rainbow-parade.py [0-1.0] [0-1.0] # Lightness and saturation values

An iTerm 2 example (recolorize dark grey background and black text):

    rainbow-parade.py 0.7 0.4
"""

def get_random_by_string(s):
    """
    Get always the same 0...1 random number based on an arbitrary string
    """

    # Initialize random gen by server name hash
    random.seed(s)
    return random.random()

def decorate_terminal(color):
    """
    Set terminal tab / decoration color.

    Please note that iTerm 2 / Konsole have different control codes over this.
    Note sure what other terminals support this behavior.

    :param color: tuple of (r, g, b)
    """

    r, g, b = color

    # iTerm 2
    # http://www.iterm2.com/#/section/documentation/escape_codes"
    sys.stdout.write("\033]6;1;bg;red;brightness;%d\a" % int(r * 255))
    sys.stdout.write("\033]6;1;bg;green;brightness;%d\a" % int(g * 255))
    sys.stdout.write("\033]6;1;bg;blue;brightness;%d\a" % int(b * 255))
    sys.stdout.flush()

    # Konsole
    # TODO
    # http://meta.ath0.com/2006/05/24/unix-shell-games-with-kde/

def rainbow_unicorn(lightness, saturation):
    """
    Colorize terminal tab by your server name.

    Create a color in HSL space where lightness and saturation is locked, tune only hue by the server.

    http://games.adultswim.com/robot-unicorn-attack-twitchy-online-game.html
    """

    name = socket.gethostname()

    hue = get_random_by_string(name)

    color = colorsys.hls_to_rgb(hue, lightness, saturation)

    decorate_terminal(color)

def main():
    """
    From Toholampi with love http://www.toholampi.fi/tiedostot/119_yleisesite_englanti_naytto.pdf
    """
    if(len(sys.argv) < 3):
        sys.exit(USAGE)

    lightness = float(sys.argv[1])
    saturation = float(sys.argv[2])

    rainbow_unicorn(lightness, saturation)

if __name__ == "__main__":
    main()