如何在 tmux 窗格标题中显示当前命令

sta*_*fry 5 bash tmux

我想用当前正在执行的命令更新 tmux 窗格标题,或者如果没有命令,则使用当前 shell 的名称。到目前为止我想出的是这个,在 bashrc 中:

case ${TERM} in

  screen*)       
    PROMPT_COMMAND='printf "\033]2;bash\033\\"'
    set -o functrace
    trap 'echo -ne "\033]2;$BASH_COMMAND\033\\"' DEBUG
    ;;

   ...

esac
Run Code Online (Sandbox Code Playgroud)

该方法源自此处:http : //www.davidpashley.com/articles/xterm-titles-with-bash.html

这部分有效 - 它完成了所需但会导致其他问题:新 shell 中的第一个提示前缀为

"'"' DEBUG"
Run Code Online (Sandbox Code Playgroud)

以及所有剩余的命令

"
Run Code Online (Sandbox Code Playgroud)

它还可以防止在命令行上给出的某些命令失败,例如:

$ ps -h $$
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Run Code Online (Sandbox Code Playgroud)

因此,虽然上述确实允许在 tmux 窗格标题中显示当前命令,但它不起作用。有没有其他人对此有更好的解决方案,或者对上述问题有什么建议?

谢谢。

sta*_*fry 6

这是每次在 BASH 中执行命令时更新 tmux 窗格标题的一种方法。将如下代码放入~/.bashrc

case ${TERM} in

    screen*)

        # user command to change default pane title on demand
        function title { TMUX_PANE_TITLE="$*"; }

        # function that performs the title update (invoked as PROMPT_COMMAND)
        function update_title { printf "\033]2;%s\033\\" "${1:-$TMUX_PANE_TITLE}"; }

        # default pane title is the name of the current process (i.e. 'bash')
        TMUX_PANE_TITLE=$(ps -o comm $$ | tail -1)

        # Reset title to the default before displaying the command prompt
        PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'update_title'   

        # Update title before executing a command: set it to the command
        trap 'update_title "$BASH_COMMAND"' DEBUG

        ;;

        ... other cases for different terminals ...

esac
Run Code Online (Sandbox Code Playgroud)

}

该函数update_title打印更改 tmux 窗格标题的转义序列。它将窗格标题设置为默认值( 的值$TMUX_PANE_TITLE)或作为参数给出的任何内容。

该函数title是为了最终用户的方便:它更改$TMUX_PANE_TITLE. 最终用户可以随时通过以下方式将标题更改为他们想要的任何位置:

$ title my new pane title
Run Code Online (Sandbox Code Playgroud)

初始标题设置为正在运行的 shell 的名称(即“bash”)。

Bash 在$PROMPT_COMMAND显示提示之前执行任何操作。这被设置为update_title在每个提示之前执行该函数以将提示设置为默认标题。

陷阱导致 Bash$BASH_COMMAND在执行任何命令之前先执行。它被设置为update_title在每个命令之前执行该函数以将提示设置为该命令的文本。

其他注意事项

  • 在解决这个问题时,我发现set -o functraceor set -T(如问题中链接的人所述)导致 RVM 损坏。建议它的原因是允许在子shell 中更改提示,但缺少这个对我来说不是问题。

  • 为了获得最初的标题,我想使用更简洁的,ps -ho comm $$但这在 tmux 中似乎不起作用,上面的内容就位。我不知道为什么选择其他有效的方法。