Зависит от того, как все настроено, но по умолчанию что-то вроде этого должно работать.
settitle() {
printf "\033k$1\033\\"
}
Затем запустите:
settitle NEWTITLE
,
Для получения более подробной информации смотрите документацию к заголовку экрана и faq экрана GNU .
Учитывая, что Ctrl+ A Aтолько изменяет его до следующей команды, он, вероятно, устанавливается $PS1
(всеми оболочками), или $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
а также в случае необходимости.
В СТОРОНЕ
Вы можете даже распространить это на все терминалы (например 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
Ctrl-A A
. А что касается приглашения, вы имеете в виду, что я должен изменить$PS1
всякий раз, когда я хочу, чтобы заголовок не менялся?\e
или\033
.Если заголовок вашего окна отражает приложение, запущенное в данный момент в окне, это потому, что ваша оболочка делает это. Если он это делает, это потому, что ваш дистрибутив, ваш системный администратор или вы настроили его.
Если команда отображается как заголовок окна во время ее выполнения, это делается
preexec
функцией (в zsh) или ее эмуляцией в bash .Если заголовок изменяется после завершения каждой команды, это делается
precmd
функцией в zsh,PROMPT_COMMAND
параметром в bash или как часть приглашения (PS1
параметра) в любой оболочке. (Команда для изменения заголовка является escape-последовательностью, генерируемой любым приложением как часть выходного потока терминала, поэтому она может быть встроена в приглашение.)Посмотрите на последовательность побега , как
\e]0;new title\a
,\e]2;new title\a
или\eknew title\e\\
в файле инициализации оболочки (~/.bashrc
,~/.zshrc
, ...). Если нет ничего релевантного, настройка может быть в системном файле (например/etc/bash.bashrc
,/etc/zsh/zshrc
); затем переписать этот параметр или функцию в свой собственный файл инициализации.См . Ответ Микеля о настройке перезаписываемого заголовка в
preexec
.источник
preexec
функцию, определенную в моем .zshrc. Дело в том, что такое поведение я хочу ... большую часть времени. Я хотел бы иметь возможность отключить его на лету на одном конкретном экране. Может быть, есть переменная, которую я могу получить вpreexec
функции, когда я вручную устанавливаю заголовок, или что-то в этом роде?preexec
функцию, я или кто-то другой, возможно, предложу простое изменение.preexec
, но Грег не сказал, что он использовалzsh
. Это научит меня. ;-)preexec
дизайн лучше, чем мой.