默认情况下,屏幕会话的标题是最后输入的命令的名称,这对我来说很好,但在某些情况下我想更改它。我知道命令Ctrl- A A,但它只会更改标题,直到下一个命令,我希望它保留在那里,直到我做出其他决定。
编辑:
这是preexec
我在我的中找到的功能.zshrc
if [[ "$TERM" == "screen" ]]; then
local CMD=${1[(wr)^(*=*|sudo|-*)]}
echo -n "\ek$CMD\e\\"
fi
答案1
取决于如何设置,但默认情况下,类似的东西应该可以工作。
settitle() {
printf "\033k$1\033\\"
}
然后运行:
settitle NEWTITLE
。
看屏幕标题文档和GNU 屏幕常见问题解答更多细节。
给定的Ctrl+仅在下一个命令之前更改它,它可能由(所有 shell)或/ (仅 bash)或/ (仅 zsh)A A设置。$PS1
$PROMPT_COMMAND
DEBUG trap
precmd
preexec
您应该寻找与它一起或之后出现的任何地方\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
在旁边
您甚至可以通过不对和进行硬编码来将其扩展到所有终端(例如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
答案2
如果您的窗口标题反映了当前在窗口中运行的应用程序,那是因为您的 shell 正在执行此操作。如果是这样,那是因为您的发行版、您的系统管理员或您对其进行了配置。
如果命令在运行时显示为窗口标题,则这是由preexec
(在 zsh 中)或bash下的模拟。
如果每个命令完成时标题发生变化,则这是通过precmd
zsh 中的函数、 bash 中的参数或任何 shell 中PROMPT_COMMAND
的提示符(参数)的一部分来完成的。 PS1
(更改标题的命令是任何应用程序作为终端输出流的一部分发出的转义序列,因此可以将其嵌入提示中。)
在 shell 初始化文件中查找转义序列,如\e]0;new title\a
,\e]2;new title\a
或( , , ...)。如果没有相关内容,则该设置可能位于系统文件中(例如,);然后在您自己的初始化文件中覆盖该参数或函数。\eknew title\e\\
~/.bashrc
~/.zshrc
/etc/bash.bashrc
/etc/zsh/zshrc
看米克尔的回答中的可重写标题设置preexec
。