renomear o nome da janela tmux para prompt_command, ps1 ou nome do host ssh remoto?


25

Eu adoraria poder renomear meu título da janela do tmux automaticamente para prompt_command, ps1 ou apenas o nome do host de uma máquina sshpara a qual eu devo . ter 9 janelas abertas rotuladas como "ssh" é realmente inútil. Fazendo o sysadmin funcionar, abro novas telas e ssh ao redor para renomeá-las manualmente.

Uma coisa que notei é tmuxatualizar o xtermtítulo da janela, então eu sinto que ele precisa saber.

Qualquer ajuda? Eu estaria disposto a voltar para screenconseguir esse recurso.

Respostas:


15

Não conheço nenhuma maneira de fazê-lo olhar PS1diretamente para você.

No entanto, tmuxentende os mesmos comandos para definir o nome da janela screen.

Portanto, você pode definir uma função como essa no seu ~/.bashrcou ~/.zshrc:

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

e depois ligue settitlede qualquer lugar.

Por exemplo, você pode incluí-lo em sua PS1variável, por exemplo

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

ou via PROMPT_COMMAND:

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

Agora eu entendo que você está tmuxexecutando na área de trabalho e deseja que os sshcomandos tenham o nome do host em vez disso ssh, isso é muito mais fácil.

Como você adicionou settitleao seu local ~/.bashrc, tudo o que você quer fazer é adicionar também:

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

Substitua bash pelo zsh ou algo mais apropriado, se necessário.


Isso realmente não nomeia o título da janela como o nome do host da caixa remota sem ter a configuração .bashrc na caixa remota. Obrigado, apesar de eu ter aprendido alguma habilidade.
user68782

Se tudo o que você deseja é o nome do host no seu local, é muito mais fácil. Espere um segundo ...
Mikel

brilhante! obrigado. Desculpe, minha incapacidade de explicar minha solicitação resultou em duas perguntas. novamente, obrigado!
user68782

Como o tmux altera o título da janela por um capricho, isso pode ser sobrescrito muito rapidamente por alterações normais do tmux no título da janela.
UtahJarhead

Obrigado! Eu usei PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- já que com o código do @ Mikel não recebi nome de host e -bash: : No such file or directoryerro antes de cada prompt de comando. Parece-me que o $()bash tentaria executar quaisquer settitle retornos . (Eu estou correndo bash no Linux.)
tuomassalo

35

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

Esta é a maneira correta de definir títulos do tmux em uma janela. A variável $ TMUX_PANE é configurada pelo tmux e é usada para diferenciar entre diferentes painéis.


2
Como é a janela ativa, acho que não -t${TMUX_PANE}é necessário (pelo menos não era para mim).
5604 Christopher

8
@Christopher Se você estiver executando, digamos, sleep 3e alternar entre janelas, caso contrário, o prompt emitirá o comando para a janela errada quando o sono for concluído. (Esta é a razão pela qual eu vim aqui, +1).
quornian

16

Apenas para pessoas que vieram aqui pesquisando como alterar o título de uma sessão do tmux:

Ctrl+ B,$

Isso fornecerá um prompt, onde você poderá renomear a sessão ativa.

Para alterar a janela ativa, use o komma:

Ctrl+ B,,

veja: Como renomear uma sessão no tmux?


8

Combinando as respostas de Mikel e UtahJarhead, usei o seguinte .zshrcpara resolver esse problema:

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

Eu tenho a renomeação automática de janela ativada por padrão e não consigo encontrar uma maneira de reativá-la depois de sair do host remoto. Portanto, saio completamente da janela - não é um problema para o meu fluxo de trabalho. Se você preferir renomeá-lo para, digamos, 'bash', substitua a exitlinha por tmux rename-window "bash".


1
Estou usando o tmux rename-window hostname -sapós o comando ssh "@ $", basicamente "redefine" o título para minha máquina "gateway".
22613 Andrerei

7

Em vez de exitou tmux rename-window "bash"você pode 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
}

Isso reativa a função normal que renomeia automaticamente a janela para os próximos comandos.

O ifbloco impede (sem ele) renomear tmuxa janela atual dos sshcomandos usados ​​em outros shells (fora de tmux).


Eu optei por um pouco if env | grep -q "TMUX_PANE"; thendas ps -p...coisas, mas o mesmo princípio.
Atomicules 18/04/19

1

Sei que isso já foi respondido há muito tempo, mas pensei em adicionar o que eu brinquei e encontrei (com base na resposta aceita) .. Adicionei isso ao / etc / bashrc de todos os meus servidores (fácil de faça com tecido, fantoche, etc)

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

E define o nome da janela automaticamente na tela ou tmux.


usamos DNS interno, então hostname -sremove o material de domínio extra, de modo que mostra server1.internal.local-se como apenas server1
Brian

1

Outra solução seria renomear a janela ativa para o nome anterior, após a sessão 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
}

0

Isso funciona no tmux 2.1zsh localmente e nos 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
}

Eu tive que desativar a opção allow-rename manualmente antes de alterar o nome do Windows - caso contrário, ela foi alterada para o caminho atual na maioria dos meus servidores (também usando o zsh). A coisa boa é: se você reativar a opção allow-rename, ela funcionará imediatamente.


0

Adicione isto a .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
}

0

Eu observaria em todos esses exemplos com:

command ssh "$@"

Você pode pegar o código de saída e sair da função com ele, caso contrário, coisas como:

ssh server false

Retornará 0.

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

Sai do ssh com o código de retorno do ssh.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.