bash $PS1 中的顏色程式碼在 tmux 中不起作用
我在我的中設置了一個彩色提示
.bash_profile
:export PS1="\[\033[0:33m\]testprompt@\h\[\033[00m\] "
在 tmux 之外,我得到一個彩色提示閱讀
testprompt@hostname
。在 tmux 會話中,文本已設置,但提示未著色。其他程序正常輸出顏色。
我在以下位置設置了一個彩色終端
.tmux.conf
:set -g default-terminal "xterm-256color"
我在 macOS 上使用預設終端。Bash 和 tmux 是 homebrew 包管理器的最新版本。在 tmux 內部和外部執行相同版本的 bash。
以下環境變數在 tmux 內外完全相同:
$ echo $PS1 \[\033[0:33m\]testprompt@\h\[\033[00m\]` $ echo $TERM xterm-256color $ echo $SHELL /usr/local/bin/bash $ echo $BASH_VERSION 4.4.23(1)-release
Color 非常適用於 tmux 中的其他命令,例如
ls -la
和git log
.fish
shell 在 tmux 中有一個顏色提示。在 tmux 中再次打開一個新bash
實例沒有任何區別 - 仍然沒有顏色。.bash_profile
正在讀取並$PS1
正在設置。提示顏色在螢幕和 tmux 之外的“原始”bash 中工作,而不是在 tmux 中。我錯過了什麼?
雖然您必須始終設置
TERM
環境變數以匹配您的終端類型是正確的,而不是輕率地錯誤地假設您的終端類型是xterm-*
,但這實際上與問題無關,因為TERM
環境變數與文字無關嵌入在提示中的控制序列。問題是您在控制序列中使用子參數,而不是參數。參數由分號分隔
;
,如 ECMA-48:1991 § 5.4.2 中所述。子參數用冒號分隔:
,如 ITU-T T.416:1993 § 13.1.8 中所述。您的外部終端仿真器顯然是處理子參數的仿真器之一,該仿真器將子參數視為參數。因此
CSI
0
:
3
3
m
被視為 SGR 0 和 SGR 33。其他終端仿真器對正確處理控制序列更為嚴格,或者尚未實現子參數支持。他們可以將其視為具有子參數 33 的 SGR 0、普通 SGR 0(取第一個數字)或僅 SGR 33(取最後一個數字)。幾年前,終端仿真器根本不支持子參數,所以這正在發生變化;並且希望最終它們都能正確支持子參數。在這種情況下,您的提示將是完全錯誤的。☺
就個人而言,我更喜歡 Z shell,它可以像
%F{yellow}
在提示符中一樣使用序列,而不必擔心控制序列是什麼,正確設置它們並將它們標記為非間距。
tmux FAQ指出
tmux 裡面的 TERM 必須是“screen”、“tmux”或類似的(例如“tmux-256color”)。不要費心報告不存在的問題!
xterm-256color
不同於tmux-256color
.