Obsługa tmux, TERM i 256 kolorów

48

Wprowadzenie

Moje pytanie wynika z konieczności zrozumienia, dlaczego mam teraz (po wielu próbach) Terminal i tmux obsługujący 256 kolorów i tput colorsmówiący, że jest ich tylko 8.


tło

Zacznijmy od początku.

Używam Ubuntu box, Guake , tmux , Vim i uwielbiam motyw Solarized . Wyglądały dość okropnie, więc postanowiłem włączyć obsługę 256 kolorów i trochę się pobawić.

Zobaczmy, co się stanie z moim terminalem . tput colorsmówi, że jest 8 kolorów. Osobiście ustawiłem je na fioletowe, po lewej stronie i oczywiście po prawej mamy 2 różne odcienie niebieskiego. $TERMmówi xterm. (Aby mieć kolorowe lsja eval to w moim .bashrc.)

wprowadź opis zdjęcia tutaj

Vim również wygląda dobrze, mimo że nazywam go 256flagą w środowisku, w którym 256 kolorów nie jest obsługiwanych.

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

Jedynym facetem, który narzeka na zmniejszoną przestrzeń kolorów, jest tmux . Wywołanie tmuxzapewnia „złe” oczekiwane wyniki.

wprowadź opis zdjęcia tutaj

Ale dzwonienie tmuxz -2flagą sprawia, że ​​wszystko działa dobrze, magicznie .

wprowadź opis zdjęcia tutaj

Teraz jedyne, co rozumiem, -2to odpowiednik export TERM=screen-256color( źródła ).

Guake zachowuje się analogicznie jak Terminal i obaj odpowiadają xtermna pytanie echo $TERM.


Pytanie

Zasadniczo, czy ktoś rozumie, dlaczego wszystko działa, nawet jeśli nie?

  • Czy jestem sadystyczny, że narzekam, dlaczego coś działa? Może.
  • Czy jest lepszy powód? Jasne: Chciałbym naprawić wygląd innych pudeł Ubuntu w moim biurze i chciałbym zrozumieć, dlaczego coś działa, czy nie.

Dodatkowe eksperymenty

Uruchomienie tego skryptu (nieco zmodyfikowanego) na moim xtermzapewnia następujący wynik: 256 kolorów, ale tylko 16 jest wyświetlanych poprawnie.

wprowadź opis zdjęcia tutaj

Następnie, zmieniając profil terminala, zmieniają się również te 16 kolorów.

wprowadź opis zdjęcia tutaj

Kolejne testy są następujące.

Od lewej do prawej, od góry do dołu, mamy motyw kolorów Solarized , dircolor ansi-darka 256darknastępnie domyślny schemat kolorów ( Tango ) dircolor ansi-darki 256dark.

wprowadź opis zdjęcia tutaj

Obserwacja : teoretycznie dircolor ansi-darkna solarized kolorystyka powinna mieć Dopasuj bacznie dircolor 256dark. Nie dzieje się tak wyraźnie w przypadku określonych plików na liście. Zamiast tego dzieje się tak, gdy w katalogu roboczym znajdują się foldery , pliki tekstowe i dowiązania symboliczne . Wniosek : nie zwracano zbytniej uwagi na kodowanie 256darkkolorów.


Wstępne wnioski

xtermobsługuje 256 kolorów, pomimo tego tput colors, co mówi. Programy mogą odwoływać się do ansipalety (konfigurowalnej przez użytkownika) lub definiować ich kolory, wybierając spośród 256 kolorów.

Atcold
źródło
1
Przeczytaj tę odpowiedź i komentarze poniżej. Czy to odpowiada na twoje pytanie? Zobacz także ten skrypt, aby uzyskać obsługiwaną rzeczywistą liczbę kolorów.
terdon
Hum ... wciąż jestem trochę zdezorientowany ... Ale chyba rozumiem, że tput colorsto niewiarygodny test. Czy mógłbyś sprawdzić moje wstępne wnioski ?
Atcold
2
Mój odczyt odpowiedzi Gilleś jest taki, że tput colorsmoże zwrócić tylko jedną wartość, aw terminalach obsługujących dowolny z 28,16,88 lub 256 kolorów zwracana jest tylko pierwsza wartość (w twoim przypadku 8). Aby uzyskać prawdziwą wartość, użyj skryptu z mojego ostatniego komentarza. Co to zwraca?
terdon
Sprawdź moje dodatkowe eksperymenty powyżej :)
Atcold
Ach, przepraszam, mój zły.
terdon

Odpowiedzi:

33

Niektóre informacje na temat obsługi 256 kolorów znajdują się w FAQ tmux .

Wykrywanie liczby kolorów obsługiwanych przez terminal nie jest niestety proste z przyczyn historycznych. Zobacz Sprawdzanie, ile kolorów obsługuje mój emulator terminala, aby uzyskać wyjaśnienie. To znaczy że

  • tmux nie może wiarygodnie ustalić, czy terminal obsługuje więcej niż 8 kolorów;
  • tmux nie może niezawodnie komunikować się z aplikacją, która obsługuje więcej niż 8 kolorów.

Kiedy jesteś w tmux, terminalem, z którym współpracujesz, jest tmux. Nie obsługuje wszystkich sekwencji kontrolnych xterm. W szczególności nie obsługuje OSC 4 ; …sekwencji sterującej, która pozwala wyszukiwać lub ustawiać wartości kolorów. Musisz użyć tego podczas bezpośredniego działania w Xterm, poza Tmux.

Jeśli uruchomisz tmux -2, tmux zaczyna się od obsługi 256 kolorów, nawet jeśli nie myśli, że twój terminal obsługuje 256 kolorów (co jest dość powszechne).

Domyślnie tmux reklamuje się jako screenbez obsługi 256 kolorów. Możesz zmienić wartość TERMin, .tmux.confaby wskazać obsługę 256 kolorów:

set -g default-terminal "screen-256color"

Możesz używać TERM=xterm-256colorlub TERM=screen-256colorna Ubuntu. Te wartości spowodują problemy tylko wtedy, gdy zalogujesz się na zdalnym komputerze, który nie ma wpisu termcap / terminfo dla tych nazw. Możesz skopiować wpisy do katalogu domowego na zdalnym komputerze; działa to z większością nowoczesnych implementacji terminfo.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/
Gilles „SO- przestań być zły”
źródło
Doceniam wyjaśnienie, ale nie jestem pewien, czy dotyczy mojego pytania. Cóż, zgadzam się, że moje pytanie było dość szerokie, ale nie skupiałem się konkretnie na tmuxie . W rzeczywistości tmux był jedynym facetem, który zachowywał się zgodnie z oczekiwaniami. O wiele bardziej tajemnicze było to, w jaki sposób xtermmogłem pokazać 256 kolorów, mimo że tput colorsmówiłem 8. Wydaje mi się, że odpowiedź na to konkretne pytanie została rozwiązana przez @terdon w jego komentarzach do samego pytania.
Atcold
@Atcold To długie pytanie, ale o ile wiem, na które odpowiedziałem. Części niezwiązane z Tmuxem są objęte odpowiedzią, z którą łączyłem się z Terdon (i którą napisałem). Twoje pytanie byłoby duplikatem tego pytania, gdyby nie aspekt tmux. Czego więcej oczekiwałeś od odpowiedzi?
Gilles 'SO - przestań być zły'
1
@Gilles , nie chciałem brzmieć złośliwie . Próbowałem akredytować @terdon w kwestii „zaakceptowanej odpowiedzi”, nawet jeśli odnosi się do twojej odpowiedzi w innym pytaniu. Mimo to set -g default_terminal "screen-256color"polecenie nie jest wystarczające, aby włączyć 256 kolorów w tmux . Musisz alias tmux='export TERM=screen-256color; /usr/bin/tmux'( odniesienie ).
Atcold
@Atcold Nie, alias nie jest potrzebny (testowałem). Ponadto ten alias nie miałby sensu: udaje, że tmux działa na ekranie lub w tmuxie. Jednak musisz uruchomić tmux -2zgodnie z moim poprzednim akapitem, jeśli tmux nie uważa, że ​​twój obecny terminal obsługuje 256 kolorów, więc alias tmux='tmux -2'miałoby to sens.
Gilles 'SO - przestań być zły'
2
@Atcold Ta odpowiedź U&L ma TERM=xterm-256color tmux, co jest rozsądne, w przeciwieństwie do TERM=screen-256color tmux. tmux -2jest lepszy, ponieważ działa, nawet jeśli screen-256colornie ma go w lokalnej bazie danych terminfo.
Gilles 'SO - przestań być zły'
20

Jestem pod wrażeniem tego, jak bogato sformatowane i szczegółowe są odpowiedzi (i pytanie!). Dostarczają cennych informacji i rozwiązań na temat narzędzi, o których wspomniałeś, ale zapewniają bardzo niewielki wgląd w to, co się dzieje , i, co najważniejsze, dlaczego (nieco) działają dla niektórych narzędzi, kiedy podobno nie powinny.

Oto kilka spostrzeżeń na temat podstawowych pytań:

  • To, co obsługuje terminal i co zgłasza, to różne rzeczy. Na przykład terminal Gnome może wyświetlać 256 kolorów, ale ogłasza się w środowisku (poprzez $TERMzmienną) jako xtermemulator (8 kolorów).

  • Narzędzia takie jak tputpodążaj za tym, co TERMjest ustawione na: tput colorsmoże wypisać 8, a env TERM=xterm-256color tput colorswypisać 256, niezależnie od tego, czy twój terminal faktycznie obsługuje takie możliwości.

  • vimrównież śledzić TERMdomyślnie, ale jak pan powiedział go użyć 256 kolorów (przez flagą albo set t_Co=256), używa 256 kolorów. I działa, ponieważ twój terminal faktycznie to obsługuje .

  • tmux, podobnie jak Gnome Terminal, również domyślnie zgłasza się jako 8-kolorowy terminal. Ale, w przeciwieństwie do Gnome Terminal, włącza funkcję 256 kolorów tylko wtedy, gdy używasz -2flagi, co sprawia, że zgłasza się jako xterm-256colorkompatybilny emulator.

  • xterm, podobnie jak w oprogramowaniu emulatora terminali dla X11 , z pewnością obsługuje 256 kolorów. Ale xtermtak jak w TERM=xterm8-kolorowym „standardzie”. Oznacza możliwości oryginału xterm . Kiedy został zmodernizowany, aby obsługiwać 256 kolorów, dawno temu wymyślił ten xterm-256colortermin.

Wszystko sprowadza się do:

  • Jakie możliwości obsługuje Twój terminal (i jest to możliwe)

  • Jak zgłasza takie możliwości środowisku za pośrednictwem TERM

  • Jak narzędzia odpowiednio interpretują TERMi dostosowują się.

  • Jak możesz wywnioskować z powyższego, unikaj wbijania export TERM=xterm-256colorw swoje ~/.bashrci takie skrypty . Ponieważ pliki te są wykonywane bez względu na terminal, którego faktycznie używasz, wszystkie twoje terminale, w tym zdalne połączenia z Windows za pomocą Putty, terminal konsoli Linux itp., Zgłaszają się jako zgodne z xterm-256color. Co może być prawdą dla niektórych, ale na pewno nie dla wszystkich. Na przykład gettykonsola Linux, do której masz dostęp CTRL+ALT+1..6, nie działa.

  • Terminale powinny zgłaszać się jako „standardowe”, z którymi są najbardziej kompatybilne. Jeśli wiesz, że potrafią obsłużyć 256 kolorów, skonfiguruj je tak, aby reklamowały się jako takie.

Wreszcie, niesamowita lektura TERMi 256 kolorów to:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/

MestreLion
źródło
Przykładowy scenariusz lub dwa byłyby dobrym uzupełnieniem tej odpowiedzi.
Elijah Lynn
5

Podam uzupełniającą odpowiedź, która dotyczy tylko twoich dodatkowych eksperymentów, o ile odnoszą się one do nasyconych kolorów katalogów .

Ustawiać

Mamy ten sam kolor wyjściowy ze skryptu testowego. Jedyną różnicą jest to, że użyłem lxterminalna Openbox z slim , xcompmgr i bez DM. Dlatego nie mogę łatwo ustawić niestandardowej palety tak jak Ty, ponieważ ten emulator terminala nie oferuje tych ustawień w interfejsie GUI i nie ma dla niego określonego motywu (istnieją tylko dla kilku emulatorów terminali). Używam więc tylko półprzezroczystych, nieekorowanych terminali i tego niebieskiego jako koloru pierwszego planu z niebieskim tłem Gentoo . Ponieważ nie mogę używać wersji kolorów plików ansi , skupiłem się wyłącznie na uzyskiwaniu rezultatów, dircolors.256darknp. W „zdegradowanej” prostej wersji.

Użyłem następującej odpowiedniej konfiguracji i średniej czcionki inconsolata :

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Dircolors

Poniższy obrazek pokazuje, co dzieje się zarówno w tmuxie , jak i poza nim przy tych ustawieniach. Pierwsza trzecia po lewej stronie pokazuje niezdekorowane okna terminala ułożone pionowo (3). Zeby masz tmux montaż pokazano te same identyczne programy (3) Mam również do solarized xterm1 seans nano za pomocą pliku .Xresources zawarte w pełnym pakietem (i pobierania go xrdb -load ~/.Xresources):

wprowadź opis zdjęcia tutaj proszę kliknąć prawym przyciskiem myszy / wyświetlić obraz, aby sprawdzić w pełnej rozdzielczości

Pierwszy terminal w lewym górnym rogu pokazuje domyślne kolory katalogu. Tuż poniżej znajduje się zdegradowana wersja solarizowana . Z wyjątkiem różowego na niebieskim tle dla .cdodanych przeze mnie plików, jest on identyczny z oczekiwanym od tego (patrz zdjęcie poniżej w celach informacyjnych). W porównaniu do wartości domyślnych, opiera się on na rozszerzonych atrybutach, tj. Pogrubieniu / świetle / odwróceniu itp., A kolory są oczywiście różne. Domyślne przypisanie kolorów dla .txtplików w wielu dystrybucjach jest zielone, ale zamiast tego powinno być szare po nasłonecznieniu . Plik ansi renderujący plik .txt w kolorze zielonym albo nie wyświetla się poprawnie, albo wcale. Pokazane wyniki po prawej stronie są prawidłowe (256dark) w odniesieniu do następującego odniesienia:

wprowadź opis zdjęcia tutaj mapa referencyjna dircolors nasłonecznionych „zdegradowanych”

Spostrzeżenia

Przy zastosowanej konfiguracji wyniki wyglądają identycznie wewnątrz i na zewnątrz tmux (mam odwrócone komentarze (#) w vi, ale poza tym wtyczka zachowuje się tak, jak powinna, a multiplekser nie ma na to wpływu). Czcionki odgrywają ogromną rolę w definicji funkcji solaryzowanych i wymagana jest dobra czcionka, aby zmaksymalizować wrażenia. W solarized kolory katalogu za pomocą 256dark plik odpowiada odwołaniu i nie wymaga żadnej szczególnej konfiguracji emulatora terminala.


Wniosek

W rzeczywistości renderowanie ansi kolorów katalogów jest po prostu zupełnie inne niż zdegradowane słoneczne (256dark). Tak bardzo, że pod ansi .txt pliki są zielone. Jednego nie można użyć do sprawdzenia poprawności renderowania drugiego. Oba rozwiązania wymagają innej konfiguracji i dają zupełnie inne wyniki.


źródło
„Nie rozumiem twojego wniosku, że niewiele uwagi poświęcono kodowaniu 256dark, podczas gdy w rzeczywistości jest to jedyny kolorowy plik, który wyświetla listę katalogów słonecznych?” Moje zamieszanie wynika z faktu, że rozważałem ansi-darkpoprawne wyjście (ponieważ używa ono wersji nie degradowanej). Następnie, jeśli weźmiesz jako odniesienie wynik 256dark, to masz odwrócony sposób myślenia.
Atcold
„Z zastosowaną konfiguracją wyniki wyglądają identycznie wewnątrz i na zewnątrz tmux” Jasne, jeśli używasz 256 kolorów, to oczywiście będą renderowane w ten sam sposób wszędzie tam, gdzie masz wsparcie 256 kolorów. „Nie jest jasne, co rozwiązanie ansi zapewniłoby w tym kontekście…” W rezultacie otrzymamy prawdziwą Solaryzację (zamiast przybliżenia).
Atcold
Rozumiem. Tak naprawdę nie badałem części ansi, więc nie mogłem zrozumieć, skąd pochodzisz. W każdym razie znalazłem twoje Q całkiem umożliwiające dziękuję. Może użyję vi więcej teraz, kiedy uważam, że to całkiem lol. Jeśli chodzi o wyniki ansi, właściwie teraz widziałem, jak to wygląda ... pokazują to tylko dla kolorów dir tutaj . Dlaczego h. czy oni mają inne kodowanie pod tym ... Mam na myśli, że widzę .txt zielony ... jak szary jest blisko zieleni? Nie rozumiem poważnie ich projektu.
Tak, skontaktowałem się osobiście z autorem, a odpowiedź brzmi: „to była jego personalizacja, ponieważ podobało mu się to”. Jestem zaniemówiony ... Cieszę się, że moje Q pomogło komuś :)
Atcold