web-dev-qa-db-fra.com

renommer le nom de la fenêtre tmux en Prompt_command, ps1 ou ssh distant?

J'aimerais pouvoir pouvoir renommer automatiquement le titre de la fenêtre de tmux en Prompt_command, ps1 ou simplement le nom d’hôte d’une machine pour laquelle j’ai ssh. avoir 9 fenêtres ouvertes étiquetées "ssh" est vraiment inutile. En faisant sysadmin, j'ouvre de nouveaux écrans et ssh autour de beaucoup pour les renommer manuellement.

Une chose que j’ai remarquée est que tmux met à jour le titre de la fenêtre xterm afin que j’ai l’impression qu’il doit le savoir.

De l'aide? Je serais même prêt à retourner à screen si je pouvais obtenir cette fonctionnalité.

24
user68782

Je ne connais aucun moyen de le faire regarder directement à votre PS1.

Cependant, tmuxcomprend les mêmes commandes pour définir le nom de la fenêtre que screenname__.

Ainsi, vous pouvez définir une fonction comme celle-ci dans vos ~/.bashrc ou ~/.zshrc:

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

puis appelez settitlede n’importe où.

Par exemple, vous pouvez l’inclure dans votre variable PS1, par exemple.

PS1='$Host:$PWD$(settitle $Host:$PWD)$ '

ou via Prompt_COMMAND:

Prompt_COMMAND='$(settitle $Host:$PWD)'
# and don't change PS1

Je comprends maintenant que vous avez tmuxexécuté sur votre bureau et que vous souhaitez que les commandes sshaient le nom d’hôte plutôt que sshname__, c’est beaucoup plus facile.

Étant donné que vous avez ajouté settitleà votre ~/.bashrc local, tout ce que vous voulez faire est d'ajouter ceci également:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

Remplacez bash par zsh, ou par quelque chose d'autre plus approprié si nécessaire.

15
Mikel

tmux rename-window -t${TMUX_PANE} "Title Text"

C’est la bonne façon de définir les titres tmux dans une fenêtre. La variable $ TMUX_PANE est définie par tmux et permet de différencier les différents volets.

35
UtahJarhead

Juste pour les personnes qui sont venues ici en cherchant comment changer le titre d'une session tmux:

Ctrl + B$

Cela vous donnera une invite, où vous pouvez renommer la session active.

Pour changer la fenêtre active, utilisez plutôt komma:

Ctrl + B,

voir: Comment renommer une session dans tmux?

15
rubo77

En combinant les réponses de Mikel et d'UtahJarhead, j'ai utilisé ce qui suit dans .zshrc pour résoudre ce problème:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

Le renommage automatique des fenêtres est activé par défaut et je ne trouve pas le moyen de le réactiver après avoir quitté l'hôte distant. Ainsi, je viens de quitter la fenêtre entièrement - pas un problème pour mon flux de travail. Si vous préférez le renommer en, par exemple, 'bash', vous pouvez remplacer la ligne exit par tmux rename-window "bash".

8
Christopher

Au lieu de exit ou tmux rename-window "bash", vous pouvez utiliser

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

Ceci réactive la fonction normale qui renomme automatiquement la fenêtre pour les prochaines commandes.

Le bloc if empêche de renommer (sans le renommer) tmux la fenêtre en cours à partir de ssh commandes utilisées sur d’autres shells (à partir de tmux).

7
tarczewski

Une autre solution serait de renommer la fenêtre active en son nom précédent, après la session ssh:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}
1
chimay

Je sais que cela a été répondu il y a longtemps, mais je pensais ajouter ce que j'ai tripoté et trouvé (en fonction de la réponse acceptée). J'ai ajouté cela au fichier/etc/bashrc de tous mes serveurs (facile à utiliser). faire avec du tissu, marionnette, etc)

settitle() {
    printf "\033k$1\033\\"
}
bash_Prompt_command() {
    settitle "`hostname -s`:$PWD"
}
Prompt_COMMAND=bash_Prompt_command

Et il définit le nom de la fenêtre automatiquement à l'écran ou tmux.

1
Brian

Cela fonctionne dans tmux 2.1 et avec zsh localement et sur les serveurs:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

J'ai dû désactiver manuellement l'option autoriser/renommer avant de changer le nom de la fenêtre - sinon, le chemin actuel de la plupart de mes serveurs a été modifié (également à l'aide de zsh). La bonne chose est que si vous réactivez l'option allow-rename, cela fonctionne immédiatement.

0
FSchndr

Je noterais dans tous ces exemples avec:

command ssh "$@"

Vous voudrez peut-être récupérer le code de sortie et quitter la fonction, sinon, par exemple:

ssh server false

Retournera 0.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Sortira ssh avec le code de retour de ssh.

0
josefwells

Ajoutez ceci à .profile ou .bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}
0
user536642