Установить заголовок окна xterm (PuTTY) при использовании экрана?

12

Я пытаюсь screenустановить свой xtermтитул. У меня это работает за пределами screen, но screenсохраняет то, что название было на месте, когда я начал это. Вот мой .bashrc:

function bash_prompt_command () {
    # Сколько символов $ PWD должно быть сохранено
    местный pwdmaxlen = 25
    # Укажите, что было усечение dir
    local trunc_symbol = ".."
    local dir = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    local 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
case "$ {TERM}" в
    "Xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {Titlebar} \ [\ е [1; 32m \] [\ е [0; 36m \] \ и \ е [1; 32m \] @ \ е [1; 33m \] \ ч \ е [ 1; 32м \]] \ e [0; 37м \] \ $ {NEW_PWD} / \ e [1; 32м \] \ $ \ [\ e [0м "
        ;;
    «Экран»)
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ек \ е \\\]
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32 м \] [\ e [0; 36 м \] \ u \ e [1; 32 м \]] \ e [0; 37 м \] \ $ {NEW_PWD} / \ e [1; 32 м \] \ $ $ {ESC} \ [\ e [0 м "
        ;;
    *)
        PS1 = "\ [\ е [1; 32m \] [\ е [0; 36m \] \ и \ е [1; 32m \] @ \ е [1; 33m \] \ ч \ е [1; 32m \ ]] \ e [0; 37 м \] \ $ {NEW_PWD} / \ e [1; 32 м \] \ $ \ [\ e [0 м "
    ;;
ESAC

И вот мой .screenrc:

hardstatus всегда последний
строка с твердым статусом '% {= 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} = "screen" titlelebar на

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

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

CRB
источник
Это не работает. Я не понимаю почему.
Джеймс Самнерс
Я определил , что параметр , hardstatus alwayslastlineкак я могу сделать для screenпредотвращает screenот установки xtermназвания. Теперь, если я могу просто выяснить, как сделать оба одновременно.
Джеймс Самнерс
Это потому, что в вашем хардстате есть% t (для заголовка)?
CRB
Нет. Просто удалите это и получите тот же результат. Я считаю, что мне нужно будет установить псевдоним, screenкоторый устанавливает заголовок окна и затем запускает программу. А потом просто разочаровывайтесь в динамических терминалах при использовании screen. :(
Джеймс Самнерс
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 говорит, что это ограничение экрана
agnul
7

На самом деле, есть способ отправить escape-последовательности прямо в xterm, проходя через экран. Найти его было непросто, но по коду экрана (src / ansi.c) я думаю, что он существует с 2005 года. У меня он работает в xterm, Gnome Terminal и putty. Я нашел примечание в Mintty Source, указывающее, что оно не работает там просто потому, что они не обрабатывают DCS (если это не было исправлено недавно).

Из документации для экрана ниже (по адресу http://www.gnu.org/software/screen/manual/html_node/Control-Septions.html ).

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

ANSI DCS (строка управления устройством) - это управляющий код, который используется для отправки непосредственно на терминал (я думаю, что это было его первоначальное назначение много лет назад). Такая строка завершается escape-кодом ST (терминатор строки).

Оберните строку, чтобы задать заголовок окна терминала в блоке DCS..ST, и он будет проходить через экран и корректно обновляться, даже если hardstatus всегда последний.

DCS = \ 033P, ST = \ 033 \

Пример - чтобы обновить заголовок окна с текущим рабочим каталогом, используйте

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

Лучше поздно, чем никогда! Надеюсь, это кому-нибудь поможет.

На всякий случай, если я не прав насчет изменений источника экрана: я запускаю последнюю версию из git screen-session, которая, в свою очередь, использует почти последнюю версию из git screen (с некоторыми изменениями, специфичными для screen-session). Но сообщения журнала поступают с экрана 2005 года (вы можете увидеть изменения, внесенные в этот коммит в отношении обработки DCS, если вы клонируете репозиторий на экране git и используете приведенную ниже команду).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
bwillan
источник
1

CRB вроде как хорошо, но

а) код выхода, который он использует, у меня не работает. Это должно быть \033kвместо \033_. Смотрите screen (1)ниже "TITLES (naming windows)". Так и должно быть:

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

б) этот вид экранирования используется только для установки заголовка экранного окна. Один экземпляр экрана может иметь несколько окон, каждое из которых имеет имя, то есть то, что отображается в hardstatusи captionс tescape-последовательностью.

c) нормальное экранирование bash работает, если вы установили правильное terminfo для 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

0x89
источник
1

Я не собираюсь отвечать на вопрос полностью, но позвольте мне предложить способ решения проблемы. Многие оконные менеджеры поддерживают спецификацию EWMH . Существует также инструмент командной строки, wmctrlкоторый может взаимодействовать с ними. Используя этот инструмент, можно легко изменить заголовок активного окна с помощью следующей команды:

  wmctrl -r :ACTIVE: -T "FooTitle"

Также возможно изменить значок окна, макет и другие свойства. Этот инструмент, вероятно, не будет работать для PuTTY, поскольку Windows не поддерживает EWMH, но большинство систем Linux должны принять его.

С этим методом не имеет значения, используете ли вы screenили нет.

grwlf
источник
0

Последние 2 недели я искал много форумов и не нашел ответа на вопрос:

Как получить весь вывод команды в заголовок Putty?

Нужно, чтобы другие программы знали, когда выполняются некоторые задания на сервере, и правильно ли это сделано. Plink stdout и stdin не работали, я использовал много твиков с задержками ожидания и для некоторых команд, которые не работали для других. XSEL и XCLIP не могут быть установлены на этом сервере.

Итак, вот решение:

  1. Получить вывод команды в файл.
  2. Эхо этого файла в заголовок.

На клиенте замазки и сервере suse это выглядит так:

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

Надеюсь, кто-то сможет использовать это. Конечно, он не будет работать для всех типов серверов и настроек клиента замазки, но идея должна работать хорошо.

Яцек Домагала
источник