tmux는 상태 표시줄에 ANSI 색상을 인쇄하지 않습니다.

tmux는 상태 표시줄에 ANSI 색상을 인쇄하지 않습니다.

저는 Mac OSX Yosemite를 사용하고 있으며 이것을 사용하여 istatsCPU 온도를 얻습니다. 통계 출력

CPU 온도를 tmux 상태 표시줄에 표시하려고 하므로 다음과 같이 tmux를 구성합니다.

tmux_conf

보시다시피, :source-file ~/.tmux.conftmux를 실행하면 색상을 렌더링하는 대신 ANSI 코드를 텍스트로 인쇄합니다. 색상 코드를 텍스트로 인쇄하는 대신 tmux에서 렌더링하도록 하려면 어떻게 해야 합니까?

답변1

ANSI 코드를 tmux 색상 변수로 대체하는 간단한 Python 스크립트를 작성하여 이 문제를 해결했습니다.

#!/usr/local/bin/python

s = raw_input("")

s = s.replace('\x1b[32m', '#[fg=colour10]')
s = s.replace('\x1b[93m', '#[fg=colour11]')
s = s.replace('\x1b[0m', '#[fg=colour255]')

print s

출력을 스크립트로 파이프합니다.istats | grep "CPU temp" | ansi2tmuxcolors.py

답변2

별도의 쉘을 작성하여 Subliminalmau5의 답변을 일반화했습니다.

sed -r 's,\x1b\[38;5;([0-9]+)m,#[fg=colour\1],g'|sed -r 's,\x1b\[1m,#[bold],g'|sed -r 's,\x1b\[0m,#[default],g'

ANSI의 256개 색상을 모두 tmux로 변환합니다.

답변3

ANSI 색상 이스케이프 코드를 TMUX 색상 이스케이프 코드로 변환하는 Perl 스크립트를 작성했습니다.https://raw.githubusercontent.com/SimonLammer/dotfiles/0a0828b1a7583968a5f8e65f2f31c659562c3ece/data/tmux/scripts/ansi-colors-to-tmux.pl

#!/bin/perl -nw

# This converts ANSI color escape sequences to TMUX color escape sequences,
#   which can be used in the status line.
# Example: "\x1b[31mERROR\x1b[0m" -> "#[fg=red,]ERROR#[default,]"

# The following SGR codes are supported:
# - 0
# - 1
# - 30 - 49
# - 90 - 97
# - 100 - 107

use warnings;
use strict;

my @colors = ("black", "red", "green", "yellow", "blue", "magenta", "cyan", "white");
while(/(.*?)(\x1b\[((\d+;?)+)m)/gc) {
    print "$1#[";
    my @sgr = split /;/, $3;
    for(my $i = 0; $i <= $#sgr; $i++) {
        if ($sgr[$i] eq "0") {
            print "default";
        } elsif ($sgr[$i] eq "1") {
            print "bright";
        } elsif ($sgr[$i] =~ /(3|4|9|10)(\d)/) {
            if ($1 eq "3") {
                print "fg=";
            } elsif ($1 eq "4") {
                print "bg=";
            } elsif ($1 eq "9") {
                print "fg=bright";
            } elsif ($1 eq "4") {
                print "bg=bright";
            }
            if ($2 eq "8") { # SGR 38 or 48
                $i++;
                if ($sgr[$i] eq "5") {
                    $i++;
                    print "colour" . $sgr[$i];
                } elsif ($sgr[$i] eq "2") {
                    printf("#%02X%02X%02X", $sgr[$i + 1], $sgr[$i + 2], $sgr[$i + 3]);
                    $i += 3;
                } else {
                    die "Invalid SGR 38;" . $sgr[$i];
                }
            } elsif ($2 eq "9") {
                print "default";
            } else {
                print $colors[$2];
            }
        } else { # Unknown/ignored SGR code
            next;
        }
        print ",";
    }
    print "]";
}
/\G(.*)/gs;
print "$1";

관련 정보