Màu Tmux và dim-ed trong Terminal.app trên MacOS


7

Vấn đề

Trên máy Mac của tôi (10.11) Tmux không hiển thị dimmàu sắc chính xác và điều này gây ra sự khó chịu.

Trong ảnh sau, tên tác giả cam kết được cho là được thể hiện trong dim white. Điều này hoạt động tốt trong Terminal.app nhưng không trong Tmux .

git lg1 so sánh

Có ai có bất kỳ manh mối về làm thế nào để gỡ lỗi này?
Tôi tin rằng nó có liên quan đến $TERMbiến, nhưng tôi không biết bắt đầu từ đâu.

Trong Terminal.app $TERM được đặt thành xterm-256color.
Trong Tmux $TERM được đặt thành screen-256color.

Trong tôi .tmux.conftôi có set -g default-terminal "screen-256color". xterm-256color, trong Tmux , xung đột với màu nền của Vim , bằng cách nào đó, nhưng không thay đổi dimhành vi.

Thêm thông tin

Tôi đã mở một sự cố trên kho GitHub của Tmux ; một câu trả lời đã được cung cấp, nhưng tôi không hoàn toàn hiểu nó.

Có vẻ như Terminal.app không có dimchỉ thị, mặc dù nó xử lý tốt với nó.
Tmux không thể tìm nạp dimthông tin, vì nó không có, và do đó nó không hiển thị đúng phông chữ.

Bây giờ tôi không chắc tại sao cái này hoạt động trong khi cái kia thì không.


Hãy thử echo $TERMcả trong và ngoài tmux và thêm đầu ra cho câu hỏi. Ra khỏi đỉnh đầu, tôi đoán rằng giá trị trong thiết bị đầu cuối bên dưới cần phải -256colorđược thêm vào; tmuxchọn lên trên này.
Tom Hunt

@TomHunt, đã làm được. Cũng không screen-256colorhoặc xterm-256colorhoạt động tốt với dimchỉ thị ... :(
Vào

Bạn đã đặt nó trong tmux, hoặc trong thiết bị đầu cuối bên dưới? tmux nhìn vào thiết bị đầu cuối mà nó đã bắt đầu. Hãy thử tách ra, sau đó chạy TERM=xterm-256color tmux att, hoặc như vậy.
Tom Hunt

$TERMđã được đặt thành xterm-256colortrong Terminal.app . Do đó, cuộc gọi TERM=xterm-256color tmuxkhông có tác dụng. Tôi đã thiết lập chúng trong tập tin cấu hình Tmux như set -g default-terminal "screen-256color""xterm-256color".
Vào

Đây là những gì cuối cùng đã thúc đẩy tôi sử dụng iTerm
lịch

Câu trả lời:


2

tmux(như màn hình GNU) hoạt động bằng cách dịch các tính năng của thiết bị đầu cuối thực tế của bạn sang thiết bị đầu cuối bên trong (thường khác nhau). Họ làm điều này để cho phép bạn kết nối một phiên trên các thiết bị đầu cuối khác nhau cùng một lúc hoặc tại các thời điểm khác nhau .

Khi nó hoạt động tốt, bạn sẽ thấy văn bản "tương tự" bất kể bạn đang kết nối từ đâu.

Không phải tất cả các thiết bị đầu cuối hỗ trợ dim. Trên thực tế, hầu hết không. Cơ sở dữ liệu đầu cuối có 121 lần xuất hiện dimso với 1514 mô tả thiết bị đầu cuối.

Khi screenđược bắt đầu vào khoảng năm 1990, các nhà phát triển của nó đã chọn bỏ qua tính năng đó và thay vào đó cung cấp những thứ hữu ích nhất. Họ đã thiết kế chương trình để lưu trữ, đối với mỗi ô hàng / cột, các thuộc tính video mà các chương trình termcap có khả năng sử dụng. Mã nguồn định nghĩa những điều này:

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

nhưng cả hai screen và chỉ tmuxsử dụng các tính năng bên trong này nếu thiết bị đầu cuối bên ngoài hỗ trợ chúng, cũng như được cung cấp trong mô tả thiết bị đầu cuối bên trong .

OSX gói một bản sao của ncursescơ sở dữ liệu đầu cuối . Trong khi bạn có thể cài đặt MacPorts hoặc homebrew và nhận được sau phiên bản, những gì OSX ncurses 5.7.20081102. Nếu bạn sử dụng infocmpđể hiển thị các mô tả thiết bị đầu cuối, bạn sẽ thấy một cái gì đó như thế này:

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

Không có dim ở đó. Trong ncurses, điều này đã được thêm vào tháng 4 năm 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, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel)

Tương tự như vậy, bạn sẽ không nhìn thấy dim trong xterm-256color. Điều đó đã được thêm vào tháng 6 năm 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

Cái cách mà dim được sử dụng trong Terminal.app bên ngoài không được chỉ định, nhưng có khả năng được mã hóa cứng (không sử dụng mô tả thiết bị đầu cuối). Nhưng screentmuxkhông biết làm thế nào các chuỗi thoát đi vào, nhưng biết rằng dimnó không được đề cập trong mô tả thiết bị đầu cuối, do đó không được hỗ trợ.

Bạn có thể cập nhật cơ sở dữ liệu terminfo của mình để thêm dimtính năng này vào các mô tả thiết bị đầu cuối này, bằng cách sử dụng infocmpticcác tiện ích:

  • sử dụng infocmpđể có được các mô tả thiết bị đầu cuối hiện có cho xterm-256colorscreen-256color. Điều này chỉ hiển thị đầu tiên; tất nhiên bạn sẽ lặp lại quá trình cho mô tả thứ hai:

    infocmp -1x xterm-256color> foo

  • chỉnh sửa tệp văn bản được tạo bởi infocmp , thêm dòng này

    dim=\E[2m,
    

    và thay thế dòng bằng sgr=dòng này:

    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,
    
  • sử dụng tic để thay thế mô tả thiết bị đầu cuối:

    sudo tic -x foo

Lưu ý: Điểm của câu hỏi là hỏi tại sao điều này xảy ra; Nicholas Marriott cung cấp thông tin về cách giải quyết vấn đề.


Cảm ơn bạn đã giải thích kỹ lưỡng của bạn. Mặc dù bạn đã cung cấp tài liệu tham khảo, tôi vẫn không thực sự hiểu những gì ncursescơ sở dữ liệu thiết bị đầu cuối đang có. Tôi đã cố đọc lên, nhưng lời giải thích vượt quá kiến ​​thức nền tảng của tôi. Tái bút: Tôi đã có homebrew trên hệ thống của mình và tôi rất thích thử nghiệm bất cứ điều gì bạn có thể đề xuất.
Vào

Có một sửa chữa liên quan đến một cài đặt bia?
hẹn hò

Có vẻ như cả MacPorts và homebrew đều có bản 6.1, bao gồm các thay đổi được đề cập ở trên.
Thomas Dickey

1

Dễ dàng sửa chữa

Thêm mã sau vào ~/.tmux.conf.

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

Giải thích dự kiến

Application.app dường như không có dimchỉ thị (xem số 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

Đây là đầu ra của lệnh tmux showmsgs -Tchạy bên trong Tmux .

Mặt khác, Terminal.app "gửi" dimdù sao đi nữa (không biết làm thế nào hoặc tại sao ), vì nó đang hoạt động, như trong hình trên.

Thêm dimchỉ thị bị thiếu ( một cách kỳ diệu ) sẽ giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.