Définir le titre de la fenêtre xterm (PuTTY) lors de l'utilisation de l'écran?

12

J'essaie screende définir mon xtermtitre. J'ai ce travail en dehors de screen, mais screenconserve le titre en place quand je l'ai commencé. Voici mon .bashrc:

function bash_prompt_command () {
    # Combien de caractères du $ PWD doit être conservé
    pwdmaxlen local = 25
    # Indique qu'il y a eu troncature dir
    local trunc_symbol = ".."
    dir local = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    pwdoffset local = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    ensuite
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    Fi

    exporter NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Nuancier @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
cas "$ {TERM}" dans
    "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; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "écran")
        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; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = "\ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [1; 32m \ ]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
    ;;
esac

Et voici mon .screenrc:

hardstatus alwayslastline
chaîne de statut fixe '% {= 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; screen \ 007'

altscreen activé
titre du shell '$ | bash'

Qu'est-ce que je fais mal?

Mise à jour (19 août 2010): Le problème est que vous ne pouvez pas mettre à jour le titre du terminal depuis l'écran lorsque vous définissez alwayslastline. Donc, ma solution était de simplement abandonner et de me contenter d'un titre prédéterminé et utile pour mes sessions d'écran. Mon mis à jour .bashrcet .screenrcpeut être trouvé à http://bitbucket.org/jsumners/rcfiles/src .

James Sumners
la source

Réponses:

4

Les codes d'échappement sont différents à l'intérieur de l'écran .

Cet extérieur d'écran:

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

est équivalent à cet écran intérieur:

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

Changer votre cas $ {TERM} = "screen" titlebar en

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

va résoudre votre problème.

crb
la source
Ça ne marche pas. Je ne comprends pas pourquoi.
James Sumners
J'ai déterminé ce paramètre hardstatus alwayslastlinecomme je le fais pour screenempêcher screende définir le xtermtitre. Maintenant, si je peux juste comprendre comment faire les deux en même temps.
James Sumners
Est-ce parce que votre hardstatus contient% t (pour le titre)?
crb
Nan. Supprimez cela et obtenez le même résultat. Je pense que je vais devoir définir un alias pour définir screenle titre de la fenêtre, puis lancer le programme. Et puis abandonnez les titres de terminaux dynamiques lors de l'utilisation screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 dit que c'est une limitation à l'écran
agnul
7

En fait, il existe un moyen d'envoyer des séquences d'échappement directement au xterm, en passant par l'écran. Ce n'était pas facile à trouver, mais à partir du code d'écran (src / ansi.c), je pense que c'est là depuis 2005. Je le fais fonctionner dans xterm, Gnome Terminal et putty. J'ai trouvé une note dans Mintty Source indiquant que cela ne fonctionne pas simplement parce qu'ils ne gèrent pas DCS (sauf si cela a été corrigé récemment).

À partir de la documentation de l'écran ci-dessous (à 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.

L'ANSI DCS (Device Control String) est un code d'échappement qui est utilisé pour envoyer directement à un terminal (je pense que c'était son objectif d'origine il y a de nombreuses années). Une telle chaîne se termine par un code d'échappement ST (String Terminator).

Enveloppez la chaîne pour définir le titre de la fenêtre du terminal dans un bloc DCS..ST, et il passe par l'écran et se met à jour correctement, même avec hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Exemple - pour mettre à jour le titre de la fenêtre avec le répertoire de travail actuel, utilisez

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

Mieux vaut tard que jamais! J'espère que cela aide quelqu'un.

Juste au cas où je me trompe sur les changements de source d'écran: j'utilise la dernière version de screen-session git, qui à son tour utilise presque la dernière version de screen git (avec quelques changements spécifiques à screen-session). Mais les messages du journal sont datés de l'écran 2005 (vous pouvez voir les modifications apportées à ce commit concernant la gestion DCS si vous clonez le dépôt git d'écran et utilisez la commande ci-dessous).

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

crb est un peu juste, mais

a) le code d'échappement qu'il utilise ne fonctionne pas pour moi. Ce devrait être \033kau lieu de \033_. Voir ci- screen (1)dessous "TITLES (naming windows)". Il devrait donc être:

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

b) ce type d'échappement n'est utilisé que pour définir le titre de la fenêtre d'écran. Une instance d'écran peut avoir plusieurs fenêtres, chacune d'elles a un nom, c'est ce qui est affiché dans hardstatuset captionavec la tséquence d'échappement.

c) l'échappement bash normal fonctionne si vous définissez la bonne terminfo pour xterm dans .screenrc:

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

(ceci aussi works on my machinepour le mastic)

Donc, pour définir le bon titre pour la fenêtre d'écran et le titre putty / xterm, j'utilise quelque chose comme:

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

pour référence: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
la source
1

Je ne vais pas répondre complètement à la question, mais permettez-moi de suggérer la façon de résoudre le problème. De nombreux gestionnaires de fenêtres prennent en charge la spécification EWMH . Il existe également un outil en ligne de commande wmctrlqui est capable d'interagir avec eux. En utilisant cet outil, on peut facilement changer le titre de la fenêtre active avec la commande suivante:

  wmctrl -r :ACTIVE: -T "FooTitle"

Il est également possible de changer l'icône de la fenêtre, la disposition et d'autres propriétés.L'outil ne fonctionnera probablement pas pour PuTTY car Windows ne prend pas en charge EWMH, mais la plupart des systèmes Linux devraient l'accepter.

Avec cette méthode, peu importe que vous l'utilisiez screenou non.

grwlf
la source
0

Au cours des 2 dernières semaines, j'ai recherché de nombreux forums et je n'ai pas trouvé la réponse à la question:

Comment obtenir toutes les sorties de commande au titre Putty?

J'en avais besoin pour que d'autres programmes sachent quand certains travaux sur un serveur sont terminés et s'ils sont bien ou mal faits. Plink stdout et stdin ne fonctionnaient pas, j'ai utilisé de nombreux réglages avec des délais d'attente et pour certaines commandes qui ne fonctionnaient pas pour d'autres. XSEL et XCLIP n'ont pas pu être installés sur ce serveur.

Voici donc la solution:

  1. Récupère la sortie de la commande dans un fichier.
  2. Faites écho à ce fichier pour le titre.

Sur le client de mastic et le serveur suse, cela ressemble à ceci:

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

J'espère que quelqu'un pourra l'utiliser. Cela ne fonctionnera pas pour tous les types de serveurs et paramètres de client de mastic, bien sûr, mais l'idée devrait bien fonctionner.

Jacek Domagała
la source