Tmux und gedimmte Farben in Terminal.app unter MacOS

7

Das Problem

Auf meinem Mac (10.11) zeigt Tmux die angezeigtendim Farben nicht richtig an, was zu Ärger führt.

Im folgenden Bild soll der Name des Commit-Autors in dargestellt werden dim white. Dies funktioniert gut in der Terminal.app, aber nicht in Tmux .

git lg1 Vergleich

Hat jemand eine Ahnung, wie man das debuggt?
Ich glaube, es hängt mit der $TERMVariablen zusammen, aber ich würde nicht wissen, wo ich anfangen soll.

In Terminal.app $TERM ist auf gesetzt xterm-256color.
In Tmux $TERM ist auf eingestellt screen-256color.

In meinem habe .tmux.confich set -g default-terminal "screen-256color". xterm-256colorIn Tmux widerspricht es irgendwie der Hintergrundfarbe von Vim , ändert aber nichts am dimVerhalten.

Mehr Informationen

Ich habe ein Problem im GitHub-Repository von Tmux geöffnet . Eine Antwort wurde gegeben, aber ich verstehe sie nicht ganz.

Es sieht so aus, als hätte Terminal.app keine dimDirektive, obwohl es gut damit umgeht.
Tmux kann die dimInformationen nicht abrufen , da sie nicht vorhanden sind, und zeigt daher die Schriftart nicht richtig an.

Jetzt bin ich mir nicht sicher, warum einer funktioniert, während der andere nicht funktioniert.

Atcold
quelle
Probieren Sie echo $TERMtmux aus und aus und fügen Sie die Ausgabe der Frage hinzu. Auf den ersten Blick würde ich vermuten, dass der Wert im zugrunde liegenden Terminal einen -256colorMehrwert haben muss. tmuxgreift dies auf.
Tom Hunt
@ TomHunt, habe es geschafft. Noch screen-256coloroder xterm-256colorfunktioniert gut mit der dimRichtlinie ... :(
Atcold
Haben Sie das in tmux oder im zugrunde liegenden Terminal eingestellt? tmux sieht sich das Terminal an, in dem es gestartet wurde. Versuchen Sie, die Verbindung zu trennen und dann auszuführen TERM=xterm-256color tmux att.
Tom Hunt
$TERMist bereits xterm-256colorin Terminal.app eingestellt . Daher hatte das Anrufen TERM=xterm-256color tmuxkeine Auswirkung. Ich habe sie in der Tmux- Konfigurationsdatei als set -g default-terminal "screen-256color"und festgelegt "xterm-256color".
Atcold
Dies ist, was mich schließlich dazu bewogen hat,
iTerm

Antworten:

2

tmux(wie der GNU-Bildschirm) übersetzt die Funktionen Ihres tatsächlichen Terminals in ein (häufig anderes) internes Terminal. Sie tun dies, damit Sie eine Sitzung auf verschiedenen Terminals gleichzeitig oder zu verschiedenen Zeiten verbinden können .

Wenn das gut funktioniert, sehen Sie den "gleichen" Text, unabhängig davon, von wo aus Sie eine Verbindung herstellen.

Nicht alle Terminals unterstützen dim. Tatsächlich tun es die meisten nicht. Die Terminaldatenbank enthält 121 Vorkommen von dim1514 Terminalbeschreibungen.

Als screenes um 1990 begonnen wurde, entschieden sich die Entwickler, diese Funktion zu ignorieren und stattdessen die nützlichste bereitzustellen. Sie entwarfen das Programm, um für jede Zeilen- / Spaltenzelle die Videoattribute zu speichern, die Termcap- Programme wahrscheinlich verwenden würden. Der Quellcode definiert diese:

#define ATTR_DI         0       /* Dim mode */
#define ATTR_US         1       /* Underscore mode */
#define ATTR_BD         2       /* Bold mode */
#define ATTR_RV         3       /* Reverse mode */
#define ATTR_SO         4       /* Standout mode */
#define ATTR_BL         5       /* Blinking */

aber beide screenund tmuxverwenden diese internen Funktionen nur, wenn das externe Terminal sie unterstützt und in der Beschreibung des internen Terminals angegeben ist.

OSX bündelt eine Kopie von ncurses und der Terminaldatenbank . Während Sie MacPorts oder Homebrew und eine installieren könnte später Version, was OSX hat ist ncurses 5.7.20081102. Wenn Sie infocmpdie Terminalbeschreibungen anzeigen, wird Folgendes angezeigt:

$ infocmp screen-256color
#       Reconstructed via infocmp from file: /usr/share/terminfo/73/screen-256color
screen-256color|GNU Screen with 256 colors,
        am, km, mir, msgr, xenl,
        colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
        acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
        cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
        dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0,
        flash=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
        il=\E[%p1%dL, il1=\E[L, ind=^J, initc@, is2=\E)0, kbs=^H,
        kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
        kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
        khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
        nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m,
        rmul=\E[24m, rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
        setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
        setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
        sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
        sgr0=\E[m\017, smacs=^N, smcup=\E[?1049h, smir=\E[4h,
        smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,

Da ist kein dimda. In ncurses wurde dies im April 2015 hinzugefügt :

# 2015-04-22
#       + add 'dim' capability to screen entry (report by Leonardo B Schenkel)
#       + add several key definitions to nsterm-bce to match preconfigured
#         keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)

Ebenso würden Sie dimin xterm-256color nicht sehen . Das wurde im Juni 2014 hinzugefügt :

# 2014-06-14
#       + modify sgr for screen.xterm-new to support dim capability -TD
#       + add dim capability to nsterm+7 -TD
#       + cancel dim capability for iterm -TD
#       + add dim, invis capabilities to vte-2012 -TD
#       + add sitm/ritm to konsole-base and mlterm3 -TD

Die Art und Weise, dimwie in der externen Terminal.app verwendet wird, ist nicht angegeben, aber wahrscheinlich fest codiert (ohne Verwendung der Terminalbeschreibung). Aber screenund tmuxwissen nicht, wie die Escape-Sequenzen eingehen, aber wissen, dass dimdies in der Terminalbeschreibung nicht erwähnt wird und daher nicht unterstützt wird.

Sie können Ihre terminfo-Datenbank aktualisieren, um dimdiese Terminalbeschreibungen mithilfe der Dienstprogramme infocmpund hinzuzufügen tic:

  • Verwenden Sie infocmpdiese Option, um die vorhandenen Terminalbeschreibungen für xterm-256colorund abzurufen screen-256color. Dies zeigt nur den ersten; Sie würden den Vorgang natürlich für die zweite Beschreibung wiederholen:

    infocmp -1x xterm-256color> foo

  • Bearbeiten Sie die von erstellte Textdatei infocmpund fügen Sie diese Zeile hinzu

    dim=\E[2m,
    

    und Ersetzen der Zeile sgr=durch diese Zeile:

    sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
    
  • Verwenden Sie ticdiese Option, um die Terminalbeschreibung zu ersetzen:

    sudo tic -x foo

Hinweis: Der Punkt der Frage war die Frage, warum dies geschieht. Nicholas Marriott lieferte Informationen zur Umgehung des Problems.

Thomas Dickey
quelle
Vielen Dank für Ihre gründliche Erklärung. Obwohl Sie Referenzen angegeben haben, verstehe ich immer noch nicht wirklich, was Flüche und Terminaldatenbank sind. Ich habe versucht zu lesen, aber die Erklärung liegt außerhalb meines Hintergrundwissens. PS Ich habe Homebrew auf meinem System und würde gerne alles ausprobieren, was Sie vorschlagen könnten.
Atcold
Gibt es eine Lösung für eine Brauinstallation?
Cambunctious
Es sieht so aus, als hätten sowohl MacPorts als auch Homebrew ncurses 6.1, einschließlich der oben genannten Änderungen.
Thomas Dickey
1

Einfache Lösung

Fügen Sie den folgenden Code hinzu ~/.tmux.conf.

set -sa terminal-overrides ",*:dim=\\E[2m"

Erklärung vorläufig

Application.app scheint die dimDirektive nicht zu haben (siehe Nummer 24).

Terminal 0: xterm-256color [references=1, flags=0x1]:
   1: acsc: (string) ``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~
   0: AX: (flag) true
   2: bel: (string) \007
...
  23: dch1: (string) \033[P
  24: dim: [missing]
  25: dl: (string) \033[%p1%dM

Dies ist die Ausgabe des Befehls tmux showmsgs -T, der in Tmux ausgeführt wird .

Auf der anderen Seite "sendet" Terminal.app das dimohnehin (keine Ahnung, wie oder warum ), da es funktioniert, wie im obigen Bild gezeigt.

Das Hinzufügen der fehlenden dimDirektive (auf magische Weise ) löst das Problem.

Atcold
quelle