Заголовок заголовку на екрані GNU


9

За замовчуванням назва сеансу на екрані - це ім'я останньої введеної команди, що для мене добре, але в деяких випадках я хотів би змінити її. Я знаю команду Ctrl- A Aале вона змінює лише заголовок до наступної команди, і я хотів би, щоб вона там залишилася, поки я не вирішу інакше.

EDIT: Ось preexecфункція, яку я знайшов у своєму.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi

Відповіді:


9

Залежить, як все налаштовано, але за замовчуванням щось подібне повинно працювати.

settitle() {
    printf "\033k$1\033\\"
}

Потім запустіть:

settitle NEWTITLE.

Докладніші відомості див. У заголовках екрана та документах на екрані 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коли я хочу, щоб заголовок не змінювався?
gregseth

Я маю на увазі перевірити, чи не містить ESC k щось ESC \. Діто PROMPT_COMMAND.
Мікель

ESC може бути написаний \eабо \033.
Мікель

Елементи посилань на заголовки екрана повинні мати необхідну інформацію
Mikel

5

Якщо назва вашого вікна відображає програму, яка зараз працює у вікні, це тому, що ваша оболонка робить це. Якщо це робиться, це тому, що ваш дистрибутив, ваш системний адміністратор або ви його налаштували.

Якщо команда відображається як заголовок вікна під час виконання команди, це робиться preexecфункцією (в zsh), або емуляцією їх під bash .

Якщо заголовок змінюється, коли кожна команда виконується, це робиться precmdфункцією в zsh, PROMPT_COMMANDпараметром в bash або як частина підказки ( PS1параметра) в будь-якій оболонці. (Команда змінити заголовок - це послідовність виходу, яку випускає будь-яка програма як частина вихідного потоку терміналу, тому вона може бути вбудована в підказку.)

Подивіться на послідовність втечі , як \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дизайн кращий, ніж мій.
Жил "ТАК - перестань бути злим"

Я згоден. :-) Моя оригінальна відповідь намагалася навчити ОП шукати відповідь для себе. Ваша була негайно корисною. Так чи інакше, ми всі перемагаємо.
Мікель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.