Zsh
在 GNU 螢幕上強制顯示標題
預設情況下,螢幕會話的標題是最後輸入的命令的名稱,這對我來說很好,但在某些情況下我想更改它。我知道命令
Ctrl
-A
A
,但它只會在下一個命令之前更改標題,我希望它留在那裡直到我另有決定。編輯: 這是
preexec
我在我的.zshrc
if [[ "$TERM" == "screen" ]]; then local CMD=${1[(wr)^(*=*|sudo|-*)]} echo -n "\ek$CMD\e\\" fi
取決於事情是如何設置的,但預設情況下,這樣的事情應該可以工作。
settitle() { printf "\033k$1\033\\" }
然後執行:
settitle NEWTITLE
.有關更多詳細資訊,請參閱螢幕標題文件和GNU 螢幕常見問題解答。
鑑於
Ctrl
+A
A
僅在下一個命令之前更改它,它可能由$PS1
(所有 shell)或$PROMPT_COMMAND
/DEBUG trap
(僅限 bash)或precmd
/preexec
(僅限 zsh)設置。您應該尋找任何出現
\e
或\033
出現在它之後k
或\\
之後的地方,基本上就像我settitle
上面的範例一樣。更新
你說你有一個習慣
preexec
。為什麼不改成這樣:
if [[ "$TERM" == "screen" ]]; then local CMD=${1[(wr)^(*=*|sudo|-*)]} echo -n "\ek${TITLE:-$CMD}\e\\" fi
然後您可以通過執行設置自定義標題:
TITLE="my title"
並通過執行取消設置標題
TITLE=
不要忘記進行更改
precmd
,$PS1
如有必要也要進行更改。在旁邊
您甚至可以通過不對 and 進行硬編碼將其擴展到所有終端(例如,
xterm
等gnome-terminal
)。\ek``\e\\
我就是這樣做的:
terminit() { # determine the window title escape sequences case "$TERM" in aixterm|dtterm|putty|rxvt|xterm*) titlestart='\033]0;' titlefinish='\007' ;; cygwin) titlestart='\033];' titlefinish='\007' ;; konsole) titlestart='\033]30;' titlefinish='\007' ;; screen*) # status line #titlestart='\033_' #titlefinish='\033\' # window title titlestart='\033k' titlefinish='\033\' ;; *) if type tput >/dev/null 2>&1 then if tput longname >/dev/null 2>&1 then titlestart="$(tput tsl)" titlefinish="$(tput fsl)" fi else titlestart='' titlefinish='' fi ;; esac } # or put it inside a case $- in *i* guard if test -t 0; then terminit fi # set the xterm/screen/etc. title settitle() { test -z "${titlestart}" && return 0 printf "${titlestart}$*${titlefinish}" }
然後你可以改變你
preexec
的:if [[ "$TERM" == "screen" ]]; then local CMD=${1[(wr)^(*=*|sudo|-*)]} settitle "${TITLE:-$CMD}" fi