将tmux窗口名称重命名为hint_command,ps1或远程ssh主机名?


25

我希望能够将我的tmux窗口标题自动重命名为hint_command,ps1或仅重命名为我ssh要使用的计算机的主机名。打开9个标记为“ ssh”的窗口真的没有用。进行sysadmin的工作我打开新的屏幕,然后在屏幕上四处切换以手动重命名它们。

我注意到的一件事是tmux更新xterm窗口标题,因此我感觉它必须知道。

有什么帮助吗?screen如果可以使用此功能,我什至愿意回头再说。

Answers:


15

我不知道有什么办法可以PS1直接看您的眼神。

但是,tmux了解与设置窗口名称相同的命令screen

因此,您可以在~/.bashrc或中定义如下函数~/.zshrc

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

然后settitle从任何地方打电话。

例如,您可以将其包含在PS1变量中,例如

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

或通过PROMPT_COMMAND

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

现在,我了解到您已经tmux在桌面上运行了,并且您希望ssh命令使用主机名而不是ssh,这要容易得多。

鉴于您已将您添加settitle到local ~/.bashrc,所以您还想要添加以下内容:

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

用zsh替换bash,或在必要时使用其他更合适的方法。


这确实没有将窗口标题命名为远程框的主机名,而远程框上没有.bashrc设置。谢谢,尽管我确实学到了一些技巧。
user68782 2011年

如果您想要的只是您本地的主机名,那就容易得多。稍等...
Mikel

辉煌!谢谢。对不起,我无法解释我的要求,导致了两个问题。再次,谢谢!
user68782 2011年

当tmux随心所欲地更改其窗口标题时,tmux可以通过正常更改窗口标题来很快覆盖它。
犹他州黑德州

谢谢!我使用了PROMPT_COMMAND='settitle $HOSTNAME:$PWD'-由于使用@Mikel的代码,因此-bash: : No such file or directory在每个命令提示符之前我都没有主机名和错误。在我看来,$()这会让bash尝试执行任何settitle 回报。(我在Linux上运行bash。)
tuomassalo

35

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

这是在窗口中设置tmux标题的正确方法。$ TMUX_PANE变量由tmux设置,用于区分不同的窗格。


2
因为它是活动窗口,所以我认为这-t${TMUX_PANE}不是必需的(至少对我而言不是)。
Christopher

8
@Christopher如果您正在运行,例如说要sleep 3切换窗口,那么在睡眠完成时,提示符将向错误的窗口发出命令。(这就是我来这里的原因,+ 1)。
quornian

16

仅针对通过搜索如何更改tmux会话标题的用户来到这里:

Ctrl+ B$

这将提示您,您可以在其中重命名活动会话。

要更改活动窗口,请使用komma代替:

Ctrl+ B,

请参阅:如何在tmux中重命名会话?


8

结合Mikel和UtahJarhead的答案,我使用以下.zshrc方法解决了这个问题:

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

默认情况下,我启用了自动窗口重命名功能,退出远程主机后找不到重新启用它的方法。因此,我只是完全退出窗口-对我的工作流程来说不是问题。如果您更愿意将其重命名,比如说,“庆典”,你可以更换exit同线tmux rename-window "bash"


1
hostname -s在命令ssh“ @ $”之后使用tmux重命名窗口,它基本上将标题重新设置为“网关”机器。
andrei

7

代替exittmux rename-window "bash"您可以使用

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
}

这将重新激活正常功能,该功能会自动重命名下一个命令的窗口。

if块阻止(不带它)tmuxssh其他shell(在之外tmux)中使用的命令重命名当前窗口。


我去找了一个if env | grep -q "TMUX_PANE"; then而不是ps -p...东西,但原理相同。
原子

1

我知道很久以前就已经回答了这个问题,但是我想我应该将自己弄​​弄和发现的内容(基于公认的答案)添加进去。用布,木偶等)

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

并自动在屏幕或tmux中设置窗口名称。


我们使用内部dns,因此hostname -s删除了多余的域内容,因此server1.internal.local仅显示为server1
Brian

1

另一个解决方案是在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

这适用于tmux 2.1本地和服务器上的zsh以及与之一起使用:

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
}

在更改Windows名称之前,我必须手动禁用allow-rename选项-否则它已更改为我大多数服务器上的当前路径(也在此处使用zsh)。好处是:如果重新启用allow-rename选项,它将立即生效。


0

将此添加到.profile.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

我将在所有这些示例中指出:

command ssh "$@"

您可能想要获取退出代码,并使用它退出函数,否则诸如:

ssh server false

将返回0。

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

将使用ssh的返回码退出ssh。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.