cambiar el nombre de la ventana tmux a prompt_command, ps1 o nombre de host ssh remoto?

25

Me encantaría poder cambiar el nombre de mi ventana tmux automáticamente a prompt_command, ps1 o simplemente el nombre de host de una máquina a la que iré ssh. tener 9 ventanas abiertas con la etiqueta "ssh" es realmente inútil. Al hacer el trabajo de administrador del sistema, abro nuevas pantallas y ssh alrededor para cambiarles el nombre manualmente.

Una cosa que noté es que tmuxactualiza el xtermtítulo de la ventana, así que siento que tiene que saberlo.

¿Alguna ayuda? Incluso estaría dispuesto a volver screensi pudiera obtener esta función.

usuario68782
fuente

Respuestas:

15

No conozco ninguna forma de hacer que te mire PS1directamente.

Sin embargo, tmuxentiende los mismos comandos para configurar el nombre de la ventana que lo screenhace.

Entonces puede definir una función como esta en su ~/.bashrco ~/.zshrc:

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

y luego llamar settitledesde cualquier lugar.

Por ejemplo, podría incluirlo en su PS1variable, p. Ej.

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

o vía PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Ahora entiendo que se está tmuxejecutando en su escritorio y desea que los sshcomandos tengan el nombre de host en lugar de ssheso, eso es mucho más fácil.

Dado que ha agregado settitlea su local ~/.bashrc, todo lo que quiere hacer es agregar esto también:

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

Reemplace bash con zsh, o algo más apropiado si es necesario.

Mikel
fuente
Esto realmente no nombra el título de la ventana al nombre de host de la caja remota sin tener la configuración .bashrc en la caja remota. Gracias aunque aprendí algo hábil.
user68782
Si todo lo que quieres es el nombre de host en tu lado local, eso es mucho más fácil. Espera un segundo ...
Mikel
¡brillante! gracias. Lo siento, mi incapacidad para explicar mi solicitud resultó en dos preguntas. ¡gracias otra véz!
user68782
A medida que tmux cambia el título de su ventana por capricho, esto puede sobrescribirse rápidamente mediante cambios normales en el título de la ventana por tmux.
UtahJarhead
¡Gracias! Solía PROMPT_COMMAND='settitle $HOSTNAME:$PWD', ya que con el código de @ Mikel no obtuve un nombre de host y un -bash: : No such file or directoryerror antes de cada símbolo del sistema. Me parece que $()haría que bash intente ejecutar lo que sea que settitle devuelva . (Estoy ejecutando bash en Linux.)
tuomassalo
35

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

Esta es la forma correcta de configurar títulos tmux en una ventana. La variable $ TMUX_PANE es establecida por tmux y se usa para diferenciar entre diferentes paneles.

UtahJarhead
fuente
2
Como es la ventana activa, no creo que -t${TMUX_PANE}sea ​​necesario (al menos no fue para mí).
Christopher
8
@Christopher Si está ejecutando, por ejemplo, sleep 3y cambia de ventana, el mensaje emitiría el comando a la ventana incorrecta cuando finalice el modo de suspensión. (Esta es la razón por la que vine aquí, +1).
Quornian
16

Solo para las personas que vinieron aquí buscando cómo cambiar el título de una sesión tmux:

Ctrl+ B,$

Esto le dará un aviso, donde puede cambiar el nombre de la sesión activa.

Para cambiar la ventana activa, use komma en su lugar:

Ctrl+ B,,

ver: ¿Cómo cambio el nombre de una sesión en tmux?

rubo77
fuente
8

Combinando las respuestas de Mikel y UtahJarhead, utilicé lo siguiente .zshrcpara resolver este problema:

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

Tengo el cambio de nombre automático de la ventana habilitado de forma predeterminada, y no puedo encontrar una manera de volver a habilitarlo después de salir del host remoto. Por lo tanto, solo salgo de la ventana por completo, no es un problema para mi flujo de trabajo. Si prefiere cambiarle el nombre, por ejemplo, 'bash', puede reemplazar la exitlínea con tmux rename-window "bash".

Christopher
fuente
1
Estoy usando tmux rename-window hostname -sdespués del comando ssh "@ $", básicamente "restablece" el título de mi máquina "gateway".
andrei
7

En lugar de exito tmux rename-window "bash"puedes usar

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
}

Esto reactiva la función normal que renombra automáticamente la ventana para los siguientes comandos.

El ifbloque impide (sin él) renombrar tmuxla ventana actual de los sshcomandos utilizados en otros shells (fuera de tmux).

tarczewski
fuente
Fui por una en if env | grep -q "TMUX_PANE"; thenlugar de las ps -p...cosas, pero el mismo principio.
atomicules
1

Sé que esto ha sido respondido hace mucho tiempo, pero pensé que agregaría lo que he manipulado y encontrado (basado en la respuesta aceptada). He agregado esto al / etc / bashrc de todos mis servidores (fácil de hacer con tela, marioneta, etc.)

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

Y establece el nombre de la ventana automáticamente en pantalla o tmux.

Brian
fuente
utilizamos dns internos, por lo que hostname -selimina el material de dominio adicional, de modo que server1.internal.local aparece como solo server1
Brian
1

Otra solución sería cambiar el nombre de la ventana activa a su nombre anterior, después de la sesión 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
fuente
0

Esto funciona para tmux 2.1y con zsh localmente y en servidores:

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
}

Tuve que deshabilitar la opción de cambio de nombre manualmente antes de cambiar el nombre de Windows; de lo contrario, se cambió a la ruta actual en la mayoría de mis servidores (también usando zsh allí). Lo bueno es que si vuelve a habilitar la opción permitir-renombrar, funciona de inmediato.

FSchndr
fuente
0

Agregue esto a .profileo.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
}
usuario536642
fuente
0

Me gustaría señalar en todos estos ejemplos con:

command ssh "$@"

Es posible que desee tomar el código de salida y salir de la función con él, de lo contrario, cosas como:

ssh server false

Devolverá 0.

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

Saldrá de ssh con el código de retorno de ssh.

josefwells
fuente