Tmux и dim-ed цвета в Terminal.app на MacOS

Проблема

На моем Mac (10.11) Tmux не показывает правильные цвета, и это вызывает раздражение.

На следующем рисунке предполагается, что имя автора фиксации должно быть представлено в dim white . Это отлично работает в Terminal.app, но не в Tmux .

Сравнение git lg1

Кто-нибудь знает, как отладить это?
Я считаю, что это связано с переменной $TERM , но я не знаю, с чего начать.

В терминале Terminal.app $TERM установлено значение xterm-256color .
В Tmux $TERM установлено значение screen-256color .

В моем .tmux.conf я set -g default-terminal "screen-256color" . xterm-256color , в Tmux , конфликтует с цветом фона Vim , каким-то образом, но не меняет dim поведения.

Больше информации

Я открыл проблему в репозитории Tmux GitHub ; ответ был предоставлен, но я не совсем понимаю его.

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

Теперь я не знаю, почему один работает, а другой – нет.

2 Solutions collect form web for “Tmux и dim-ed цвета в Terminal.app на MacOS”

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

Когда это будет хорошо, вы увидите «тот же» текст независимо от того, откуда вы подключаетесь.

Не все терминалы поддерживают dim . На самом деле, большинство нет. База данных терминалов содержит 121 вхождения описания терминалов dim и 1514.

Когда screen был запущен примерно в 1990 году, его разработчики предпочли игнорировать эту функцию и вместо этого предоставить наиболее полезную информацию. Они разработали программу для хранения для каждой ячейки строки / столбца атрибутов видео, которые, вероятно, будут использовать программы termcap . Исходный код определяет:

 #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 */ 

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

OSX связывает копию ncurses и базы данных терминала . Хотя вы можете установить MacPorts или homebrew и получить более позднюю версию, у OSX есть ncurses 5.7.20081102 . Если вы используете infocmp для отображения описаний терминалов, вы увидите что-то вроде этого:

 $ 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, 

Там нет dim . В ncurses это было добавлено в апреле 2015 года :

 # 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, eg, with OSX 10.9 and 10.10 (report by Leonardo B Schenkel) 

Точно так же вы не увидите dim в xterm-256color. Это было добавлено в июне 2014 года :

 # 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 

Способ, которым dim используется во внешнем Terminal.app, не указывается, но, вероятно, жестко запрограммирован (не используя описание терминала). Но screen и tmux не знают, как идут escape-последовательности, но знают, что dim не упоминается в описании терминала, поэтому не поддерживается.

Вы можете обновить свою базу данных terminfo, чтобы добавить dim функцию к этим описаниям терминалов, используя infocmp и tic :

  • используйте infocmp чтобы получить существующие описания терминалов для xterm-256color и screen-256color . Это показывает только первое; вы, конечно же, повторите процесс для второго описания:

    infocmp -1x xterm-256color> foo

  • отредактируйте текстовый файл, созданный infocmp , добавив эту строку

     dim=\E[2m, 

    и заменив строку на sgr= этой строкой:

     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, 
  • используйте tic для замены описания терминала:

    sudo tic -x foo

Примечание. Вопрос был задан вопросом, почему это происходит; Николас Марриотт предоставил информацию о том, как решить эту проблему.

Простое исправление

Добавьте следующий код в ~/.tmux.conf .

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

Объяснение ориентировочно

Application.app, похоже, не имеет директивы dim (см. Номер 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 

Это результат команды tmux showmsgs -T выполняемой внутри Tmux .

С другой стороны, Terminal.app «посылает» dim любом случае (не знаю, как и почему ), так как он работает, как показано на рисунке выше.

Добавление отсутствующей директивы dim ( магически ) решает проблему.

  • Как мне перемещаться по панелям внутри окна в tmux, как на экране?
  • Как безопасно завершить Aptitude
  • Как увеличить число панелей tmux отображает время `ctrl-b q`
  • Как сохранить все vim-буферы при изменении окна tmux?
  • tmux vs. GNU Screen
  • Копирование команд с помощью PuTTY и tmux
  • Имеет ли TMUX модульные тесты или набор тестов?
  • Возможно ли стиль tmux для каждого сеанса?
  • Копирование между окнами tmux на сервере из emacs
  • Псевдонимы и tmux
  • tmux не корректно отображает границы
  • Linux и Unix - лучшая ОС в мире.