renommer le nom de la fenêtre tmux en prompt_command, ps1 ou nom d'hôte ssh distant?

25

Je serais ravi de pouvoir renommer automatiquement le titre de ma fenêtre tmux en prompt_command, ps1 ou tout simplement le nom d'hôte d'une machine sur laquelle je vais ssh. avoir 9 fenêtres ouvertes étiquetées "ssh" est vraiment inutile. Faire le travail sysadmin j'ouvre de nouveaux écrans et ssh autour de beaucoup pour les renommer manuellement.

Une chose que j'ai remarquée est la tmuxmise à jour du xtermtitre de la fenêtre, donc j'ai l'impression qu'il faut le savoir.

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

user68782
la source

Réponses:

15

Je ne connais aucun moyen de le faire regarder PS1directement.

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

Vous pouvez donc définir une fonction comme celle-ci dans votre ~/.bashrcou ~/.zshrc:

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

puis appelez settitlede n'importe où.

Par exemple, vous pouvez l'inclure dans votre PS1variable, 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 vous voulez que les sshcommandes aient le nom d'hôte plutôt que ssh, c'est beaucoup plus facile.

Étant donné que vous avez ajouté settitleà votre section locale ~/.bashrc, tout ce que vous voulez faire, c'est l'ajouter aussi:

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

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

Mikel
la source
Cela ne nomme vraiment pas le titre de la fenêtre au nom d'hôte de la boîte distante sans avoir la configuration .bashrc sur la boîte distante. Merci, bien que j'aie appris une certaine nappe.
user68782
Si tout ce que vous voulez, c'est le nom d'hôte de votre côté local, c'est beaucoup plus facile. Attendez une seconde ...
Mikel
brillant! Je vous remercie. Désolé, mon incapacité à expliquer ma demande a entraîné deux questions. Merci encore!
user68782
Comme tmux change son titre de fenêtre sur un coup de tête, cela peut très rapidement être écrasé par des modifications normales du titre de la fenêtre par tmux.
UtahJarhead
Merci! J'ai utilisé PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- car avec le code de @ Mikel, je n'ai reçu aucun nom d'hôte et une -bash: : No such file or directoryerreur avant chaque invite de commande. Il me semble que le $()ferait essayer à bash d'exécuter n'importe quel settitle retour . (Je cours bash sur linux.)
tuomassalo
35

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 est utilisée pour différencier les différents volets.

UtahJarhead
la source
2
Comme c'est la fenêtre active, je ne pense pas que ce -t${TMUX_PANE}soit nécessaire (du moins ce n'était pas pour moi).
Christopher
8
@Christopher Si vous exécutez, disons, sleep 3et changez de fenêtre, l'invite émettrait sinon la commande dans la mauvaise fenêtre une fois le sommeil terminé. (C'est la raison pour laquelle je suis venu ici, +1).
quornian le
16

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

Ctrl+ B,$

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

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

Ctrl+ B,,

voir: Comment renommer une session dans tmux?

rubo77
la source
8

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

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

Le changement de nom de fenêtre automatique est activé par défaut et je ne trouve pas de moyen de le réactiver après avoir quitté l'hôte distant. Ainsi, je quitte tout simplement la fenêtre - pas un problème pour mon flux de travail. Si vous préférez le renommer par exemple en «bash», vous pouvez remplacer la exitligne par tmux rename-window "bash".

Christophe
la source
1
J'utilise tmux rename-window hostname -saprès la commande ssh "@ $", il "réinitialise" essentiellement le titre sur ma machine "passerelle".
andrei
7

Au lieu de exitou 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
}

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

Le ifbloc empêche de (sans lui) renommer tmuxla fenêtre courante des sshcommandes utilisées sur d'autres shells (hors tmux).

tarczewski
la source
J'ai opté pour un if env | grep -q "TMUX_PANE"; thenau lieu de l' ps -p...étoffe, mais le même principe.
atomicules
1

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

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

Et il définit automatiquement le nom de la fenêtre dans screen ou tmux.

Brian
la source
nous utilisons des DNS internes, donc nous hostname -ssupprimons les éléments de domaine supplémentaires, de sorte que server1.internal.local apparaisse comme juste server1
Brian
1

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
}
chimay
la source
0

Cela fonctionne pour dans tmux 2.1et 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 l'option allow-rename manuellement avant de changer le nom de Windows - sinon il a été changé pour le chemin actuel sur la plupart de mes serveurs (également en utilisant zsh là-bas). La bonne chose est: si vous réactivez l'option allow-rename, cela fonctionne immédiatement.

FSchndr
la source
0

Ajoutez ceci à .profileou.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
}
user536642
la source
0

Je noterais dans tous ces exemples avec:

command ssh "$@"

Vous voudrez peut-être saisir le code de sortie et quitter la fonction avec, sinon des choses comme:

ssh server false

Renvoie 0.

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

Quittera ssh avec le code retour du ssh.

josefwells
la source