Встановити назву вікна xterm (PuTTY) під час використання екрана?


12

Я намагаюся домогтися, screenщоб встановити свою xtermназву. У мене це працює поза межами screen, але screenзберігає те, що заголовок мав місце, коли я його починав. Ось мій .bashrc:

функція bash_prompt_command () {
    # Скільки символів $ PWD слід зберегти
    локальний pwdmaxlen = 25
    # Вкажіть, що відбулося усічення
    локальний trunc_symbol = ".."
    місцевий dir = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    локальний pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    потім
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    фі

    експорт NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Колірна діаграма @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
випадок "$ {TERM}" у
    "xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [ 1; 32м \]] \ е [0; 37м \] \ $ {NEW_PWD} / \ e [1; 32м \] \ $ \ [\ е [0м "
        ;;
    "екран")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32м \] \ $ $ {ESC} \ [\ e [0м "
        ;;
    *)
        PS1 = "\ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [1; 32m \ ]] \ e [0; 37м \] \ $ {NEW_PWD} / \ e [1; 32м \] \ $ \ [\ е [0м "
    ;;
есак

І ось мій .screenrc:

hardstatus завждилайн
hardstatus string '% {= kg} [% {Y}% H% {g}] [% =% {= kw}%?% - Lw%?% {= b kR} (% {W}% n-% t%? (% u)%?% {= b kR})% {= kw}%?% + Lw%?%?% =% {g}] [% {Y}% l% {g}]% {g} [% {B}% m.% d.% Y% {G}% c% {g}] '

termcapinfo xterm | xterms | xs | rxvt ti @: te @
termcapinfo xterm 'hs: ts = \ E] 2;: fs = \ 007: ds = \ E] 2; екран \ 007'

altscreen на
оболонка '$ | bash'

Що я роблю неправильно?

Оновлення (19 серпня 2010 р.): Проблема полягає в тому, що ви не можете оновити назву терміналу зсередини екрану, коли ви встановили alwayslastline. Тож моє рішення полягало в тому, щоб просто відмовитись і погодитися на заздалегідь визначений, корисний заголовок для моїх сеансів на екрані. Моє оновлення .bashrcта .screenrcйого можна знайти на веб-сайті http://bitbucket.org/jsumners/rcfiles/src .

Відповіді:


4

Коди евакуації різні на екрані .

Це за межами екрана:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

еквівалентний цьому внутрішньому екрану:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

Змінення регістру заголовків $ {TERM} = "екран" на

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

вирішить вашу проблему.


Це не працює. Я не розумію, чому.
Джеймс Самнерс

Я визначив, що цей параметр, hardstatus alwayslastlineяк я роблю, не screenдозволяє screenвстановлювати xtermназву. Тепер, якщо я можу просто зрозуміти, як робити і те й інше одночасно.
Джеймс Самнерс

Це тому, що ваш жорсткий контур містить% t (для заголовка) у ньому?
крб

Ні. Просто видалили це і отримали той же результат. Я вважаю, що мені доведеться встановити псевдонім, screenякий встановлює назву вікна, а потім запускає програму. А потім просто відмовтеся від динамічних назв терміналів під час використання screen. :(
Джеймс Самнерс

1
bugs.launchpad.net/byobu/+bug/338722/comments/10 каже, що це обмеження на екрані
agnul

7

Насправді, існує спосіб переслати послідовності втечі безпосередньо в xterm, проходячи через екран. Знайти це було непросто, але за допомогою екранного коду (src / ansi.c) я думаю, що він існує з 2005 року. У мене він працює у xterm, Gnome Terminal та putty. Я знайшов замітку у монетному джерелі, вказуючи, що вона не працює там просто тому, що вони не обробляють DCS (якщо це не було виправлено недавно).

З документації для екрана нижче (на http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html )

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

ANSI DCS (Device Control String) - код евакуації, який використовується для надсилання безпосередньо до терміналу (я думаю, це було його первісне призначення з багатьох років тому). Такий рядок закінчується кодом виходу ST (String Terminator).

Оберніть рядок, щоб встановити заголовок вікна терміналу всередині блоку DCS..ST, і він проходить через екран і оновлює правильно, навіть із жорсткою лінією.

DCS = \ 033P, ST = \ 033 \

Приклад - для оновлення заголовка вікна використовуйте поточну робочу директорію

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

Краще пізно, ніж ніколи! Сподіваюся, що це комусь допоможе.

На всякий випадок, коли я помиляюсь щодо змін джерела екрана: я запускаю останню програму з git screen session, яка, в свою чергу, використовує майже останню програму з git екрана (з деякими змінами, характерними для екранного сеансу). Але повідомлення журналу датовані екраном 2005 року (ви можете побачити зміни, внесені до цього комітету щодо обробки DCS, якщо ви клонуєте екран git repo і скористаєтесь командою нижче).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c

1

crb - це своєрідне право, але

а) код, який він використовує, не працює для мене. Це має бути \033kзамість \033_. Дивіться screen (1)під "TITLES (naming windows)". Так має бути:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

б) подібний тип евакуації використовується лише для встановлення заголовка екрана. Один екземпляр екрана може мати декілька вікон, кожне з них має ім’я, тобто те, що відображається у hardstatusта captionіз tпослідовністю втечі.

в) нормальне вимкнення баш працює, якщо встановити правильний термінфо для xterm у .screenrc:

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(це також works on my machineдля шпаклівки)

Тож для того, щоб встановити правильний заголовок і для екрана екрана, і для заголовка putty / xterm, я використовую щось таке:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

Для довідки: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html


1

Я не збираюся відповідати на питання повністю, але дозвольте запропонувати спосіб вирішення питання. Багато менеджерів вікон підтримують специфікацію EWMH . Існує також інструмент командного рядка, wmctrlякий здатний взаємодіяти з ними. За допомогою цього інструменту можна легко змінити назву активного вікна за допомогою наступної команди:

  wmctrl -r :ACTIVE: -T "FooTitle"

Також можливо змінити піктограму вікна, макет та інші властивості. Інструмент, ймовірно, не працюватиме для PuTTY, оскільки Windows не підтримує EWMH, але більшість систем Linux повинні прийняти його.

При цьому методі не має значення, використовуєте ви його screenчи ні.


0

Останні 2 тижні я шукав багато форумів, і не знайшов відповіді на запитання:

Як отримати весь вихід команди до заголовка Putty?

Потрібно, щоб інші програми знали, коли виконується певна робота на сервері і чи правильно це робиться чи неправильно. Pdd stdout і stdin не працювали, я використовував багато налаштувань із затримкою очікування, а для деяких команд, які працювали для інших, немає. XSEL та XCLIP не вдалося встановити на цьому сервері.

Тож ось рішення:

  1. Отримати командний висновок у файлі.
  2. Відлучіть цей файл до заголовка.

На сервері putty client і suse це виглядає приблизно так:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

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

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