Forcer le titre sur l'écran GNU

9

Par défaut, le titre d'une session d'écran est le nom de la dernière commande entrée, ce qui me convient, mais dans certains cas, j'aimerais le changer. Je connais la commande Ctrl- A A, mais elle ne change le titre que jusqu'à la prochaine commande, et j'aimerais qu'elle y reste jusqu'à ce que je décide autrement.

EDIT: Voici la preexecfonction que j'ai trouvée dans mon.zshrc

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

Réponses:

9

Cela dépend de la façon dont les choses sont configurées, mais par défaut, quelque chose comme ça devrait fonctionner.

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

Exécutez ensuite:

settitle NEWTITLE.

Voir la documentation sur le titre de l'écran et la FAQ sur l'écran GNU pour plus de détails.

Étant donné que Ctrl+ A Ane le modifie que jusqu'à la prochaine commande, il est probablement défini par $PS1(tous les shells), ou $PROMPT_COMMAND/ DEBUG trap(bash uniquement) ou precmd/ preexec(zsh uniquement).

Vous devriez chercher un endroit qui \eou \033apparaît avec kou \\après, au fond comme mon settitleexemple ci - dessus.

MISE À JOUR

Vous avez dit que vous aviez une coutume preexec.

Pourquoi ne pas le changer en ceci:

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

Ensuite, vous pouvez définir un titre personnalisé en exécutant:

TITLE="my title"

et annulez le titre en exécutant

TITLE=

N'oubliez pas de changer precmdet $PS1aussi si nécessaire.

DE CÔTÉ

Vous pouvez même l' étendre à tous les terminaux (par exemple xterm, gnome-terminal, etc.) par pas coder en dur le \eket \e\\.

Voici comment je le fais:

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}"
}

Ensuite, vous pouvez changer votre preexecpour:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
la source
La commande que vous donnez fait exactement la même chose que Ctrl-A A. Et à propos de l'invite, vous voulez dire que je dois modifier $PS1chaque fois que je veux que le titre ne change pas?
gregseth
Je veux dire, vérifiez qu'il ne contient pas ESC k quelque chose ESC \. Idem PROMPT_COMMAND.
Mikel
ESC pourrait être écrit \eou \033.
Mikel
Les liens vers les documents sur le titre de l'écran doivent contenir les informations nécessaires
Mikel
5

Si le titre de votre fenêtre reflète l'application en cours d'exécution dans la fenêtre, c'est parce que votre shell le fait. Si c'est le cas, c'est parce que votre distribution, votre administrateur système ou vous l'avez configuré.

Si la commande apparaît comme le titre de la fenêtre pendant l'exécution de la commande, cela se fait par la preexecfonction (en zsh), ou une émulation de celle-ci sous bash .

Si le titre change à la fin de chaque commande, cela se fait par la precmdfonction dans zsh, le PROMPT_COMMANDparamètre dans bash ou dans le cadre de l'invite ( PS1paramètre) dans n'importe quel shell. (La commande pour changer le titre est une séquence d'échappement émise par n'importe quelle application dans le cadre du flux de sortie du terminal, elle peut donc être intégrée dans une invite.)

Recherchez une séquence d'échappement comme \e]0;new title\a, \e]2;new title\aou \eknew title\e\\dans votre fichier d'initialisation du shell ( ~/.bashrc, ~/.zshrc, ...). S'il n'y a rien de pertinent, le paramètre peut être dans un fichier système (par exemple /etc/bash.bashrc, /etc/zsh/zshrc); puis remplacez ce paramètre ou cette fonction dans votre propre fichier d'initialisation.

Voir la réponse de Mikel pour un paramètre de titre remplaçable dans preexec.

Gilles 'SO- arrête d'être méchant'
la source
Merci, vous avez été très clair. J'ai en effet trouvé une preexecfonction définie dans mon .zshrc. Le truc c'est que c'est le comportement que je veux ... la plupart du temps. J'aimerais pouvoir le désactiver à la volée sur un écran spécifique. Il y a peut-être une variable que je peux obtenir dans la preexecfonction lorsque je définis manuellement le titre, ou quelque chose comme ça?
gregseth
@gregseth: C'est un peu difficile à expliquer en général, mais si vous postez votre preexecfonction, moi ou quelqu'un d'autre peut probablement suggérer un changement simple.
Gilles 'SO- arrête d'être méchant'
J'allais le mentionner preexec, mais Greg n'a pas dit qu'il utilisait zsh. Ça va m'apprendre. ;-)
Mikel
@Mikel: Mon explication était meilleure que la vôtre, mais votre nouveau preexecdesign est meilleur que le mien.
Gilles 'SO- arrête d'être méchant'
Je suis d'accord. :-) Ma réponse originale essayait d'apprendre au PO à trouver la réponse par lui-même. Le vôtre a été plus immédiatement utile. De toute façon, nous gagnons tous.
Mikel