Как я могу автоматически обновить заголовок на рабочем экране xterm?

14

Это немного продолжение этого вопроса . Я работаю в tcsh на экране GNU в Xterm .

У меня есть следующее в моем .cshrc:

alias res_t 'xtset -t %h:%d "(%u:%g)" %e'       # reset titlebar
res_t                                           # reset title right now
alias precmd res_t

И это прекрасно работает!

Однако, когда я запускаю экран, я вижу, что заголовок не обновляется с текущим каталогом. Как я могу заставить экран обновлять заголовок xterm?

Натан Феллман
источник
Вы уже нашли решение, которое сработало для вас?
Трей Ханнер
Я попробовал предложенные ответы, но они не сработали. Вот почему я не принял их и не проголосовал против них.
Натан Феллман

Ответы:

4

Вы можете установить заголовок окна xterm, добавив его в свой .tcshrcили .cshrc(замените свой текущий precmdпсевдоним):

alias precmd 'echo -n "\033]0;${PWD}\a"'

Убедитесь в том , что это единственный precmd псевдоним в вашем .cshrcи .tcshrcфайлы при использовании этого. Этот метод отображает текущий каталог как заголовок окна в xterm терминале gnome независимо от того, открыт ли сеанс экрана GNU.

Мой ответ был основан на этом .

Трей Ханнер
источник
3

Я понимаю, что вы используете tcsh, так что это, вероятно, не сработает ... На всякий случай, если кто-то ищет способ bash сделать это.

Если ваши системы (локальные / удаленные) работают под управлением bash, вы можете использовать переменную окружения "PROMPT_COMMAND", чтобы установить заголовок окна. PROMPT_COMMAND проверяется до отображения приглашения.

(в вашем .bashrc):

export PROMPT_COMMAND='history -a && echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007'

Объяснение:

'history -a'

Это устанавливает оболочку для добавления в файл истории при каждом завершении команды, а не после завершения всей оболочки. (Это не связано с этим примером).

'echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"'

Это повторяет управляющий код "\ 033] 0;" который устанавливает заголовок окна с переменными "user" @ "host" (удаляя наибольшее совпадение справа налево "."), а затем рабочий каталог (заменяя '~' на '$ HOME').

Приведенный выше трюк будет работать с любым терминальным приложением, которое поддерживает динамическое изменение заголовка окна (что делают все iTerm, Terminal.app, urxvt, aterm, eTerm. Xterm и т. Д.). Вы также можете посмотреть переменную оболочки "TITLEBAR" в документации bash, она похожа.

wawawawa
источник
1
это не будет работать, когда внутри gnuscreen. по крайней мере, это не работает для меня. вот почему я здесь :)
gcb
2

Это должно работать в любой оболочке, но это грязный взлом .screenrc. Он работает над строкой hardstatus, что может быть неприемлемо для некоторых пользователей. Но он работает в gnome-Terminal на последней версии Ubuntu, даже без строки termcapinfo ниже. В некоторых ситуациях могут потребоваться более глубокие настройки (например, я не тестировал PuTTY).

# enable xterm title setting; may not be necessary on some platforms
termcapinfo xterm*|rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

# dirty hack: put xterm title escapes in the hardstatus
# this example will yield "user@host || screen Win#:(windowtitle)
defhstatus "$USER@^EH || screen ^E:(^Et)"
# now turn it off so it doesn't print in the hardstatus line
hardstatus off

# and finally, use caption as a replacement hardstatus
caption always '%{= kG}[%{G}%H%{G}][%= %{= kw}%?%-Lw%?%{R}(%{W}%n*%f%t%?(%u)%?%{R})%{w}%?%+Lw%?%?%= %{G}][%{B}%C%a %M.%d%{G}]'

Нашел по этой ссылке .

шарлатан
источник
2
setenv TITLE "%{\033]0;%n@%m:%~\007%}"
set prompt = "${TITLE}%n@%m:%~%#"
SirDice
источник
1
Но будет ли это обновлять название при запускеscreen
Натан Феллман
1
Это прекрасно работает с экраном 4.00.02 + tcsh 6.12.00. Предполагается, что у вас hardstatusправильно установлена ​​переменная экрана и поддерживается termcap / terminfo hs|ts|fs|ds.
Даррен Холл
что играет хардстатус здесь?
gcb
2

Эта страница (которая была связана выше) является решением, однако вам нужно убедиться, что строка терминала в строке совпадает со строкой идентификатора вашего терминала (т. Е. С переменной TERM), иначе она не будет иметь никакого эффекта.

Вот краткое изложение того, что я сделал, и это сработало для меня после нескольких лет, не потратив достаточно времени, чтобы понять это:

  1. Узнайте, какая строка идентификатора вашего терминала, запустив:

    echo $TERM
    

    Вероятно, он скажет что-то вроде «xterm» или «linux» или «rxvt».

  2. Теперь добавьте следующую строку в ваш файл .screenrc (или создайте его, если он не существует), расположенный в вашем домашнем каталоге (~ / .screenrc):

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

    Ключ должен убедиться, что «xterm» - это строка идентификатора вашего TERM, которую вы получили выше. Вы можете сделать несколько строк для каждого другого типа термина, который вы используете.

Например, у меня есть этот файл .screenrc, потому что я использую и xterms, и тип термина «linux» при SShing в поле:

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

Надеюсь, это поможет, и это абсолютно не зависит от оболочки. Помните, что если вы запускаете screen от имени пользователя root, вам нужно изменить ~ root / .screenrc в дополнение к своему собственному файлу ~ / .screenrc, например так.

Адам Штрол
источник
1

Инструкции, приведенные здесь, позволили мне обновить заголовок в rxvt из bash для меня - что, возможно, не поможет, но я подумал, что это стоит изучить (раздел «Информационная строка состояния», если ссылка не переходит на правую часть страницы)

Барри
источник