Zsh

在 GNU 螢幕上強制顯示標題

  • November 18, 2013

預設情況下,螢幕會話的標題是最後輸入的命令的名稱,這對我來說很好,但在某些情況下我想更改它。我知道命令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 進行硬編碼將其擴展到所有終端(例如,xtermgnome-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

引用自:https://unix.stackexchange.com/questions/7380