Принудительный заголовок на экране GNU

9

По умолчанию заголовок сеанса экрана - это имя последней введенной команды, что хорошо для меня, но в некоторых случаях я хотел бы изменить его. Я знаю команду Ctrl- A A, но она только меняет название до следующей команды, и я бы хотел, чтобы она оставалась там до тех пор, пока я не приму иное решение.

РЕДАКТИРОВАТЬ: Вот preexecфункция, которую я нашел в моем.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi
gregseth
источник

Ответы:

9

Зависит от того, как все настроено, но по умолчанию что-то вроде этого должно работать.

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
Mikel
источник
Команда, которую вы даете, делает то же самое, что и Ctrl-A A. А что касается приглашения, вы имеете в виду, что я должен изменить $PS1всякий раз, когда я хочу, чтобы заголовок не менялся?
gregseth
Я имею в виду, проверить, не содержит ESC k что-то ESC \. То же самое PROMPT_COMMAND.
Микель
ESC может быть написано \eили \033.
Микель
Ссылки на экранные заголовки документов должны содержать необходимую информацию
Mikel
5

Если заголовок вашего окна отражает приложение, запущенное в данный момент в окне, это потому, что ваша оболочка делает это. Если он это делает, это потому, что ваш дистрибутив, ваш системный администратор или вы настроили его.

Если команда отображается как заголовок окна во время ее выполнения, это делается 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функции, когда я вручную устанавливаю заголовок, или что-то в этом роде?
gregseth
@gregseth: В общем, это немного сложно объяснить, но если вы опубликуете свою preexecфункцию, я или кто-то другой, возможно, предложу простое изменение.
Жиль "ТАК - перестань быть злым"
Я собирался упомянуть preexec, но Грег не сказал, что он использовал zsh. Это научит меня. ;-)
Микель
@Mikel: Мое объяснение было лучше, чем ваше, но ваш новый preexecдизайн лучше, чем мой.
Жиль "ТАК - перестань быть злым"
Согласен. :-) Мой оригинальный ответ пытался научить ОП найти ответ для себя. Ваш был более полезным. В любом случае, мы все победим.
Микель