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

时间:2013-01-16 11:02:50

标签: bash tmux

我想用当前执行命令更新tmux pane-title,如果没有命令,则更新当前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

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

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

前缀
"'"' DEBUG"

以及

所有剩余的命令
"

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

$ ps -h $$
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html

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

感谢。

3 个答案:

答案 0 :(得分:4)

以下是每次在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

}

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

函数title用于方便最终用户:它更改$TMUX_PANE_TITLE中默认标题的值。最终用户可以随时通过执行以下操作将标题更改为:

$ title my new pane title

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

Bash在显示提示之前执行$PROMPT_COMMAND中的任何内容。这样设置是为了在每次提示之前执行update_title函数以将提示设置为默认标题。

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

其他说明

  • 在解决这个问题时,我发现set -o functraceset -T(由问题中链接的人员描述)会导致RVM中断。提出建议的原因是允许改变子弹,但缺乏这个对我来说不是问题。

  • 要获得初始标题,我想使用更简洁的ps -ho comm $$,但这似乎在tmux内部无法正常运行。我不确定为什么会选择其他有效的方法。

答案 1 :(得分:2)

我不确定你是否可以将它设置为窗格的标题(如果它还没有)(看起来在我的tmux 1.8上它已经将命令声明为窗格的标题),但是有未记录的#{pane_current_command}变量,您可以在包含该命令的状态栏字符串中使用该变量。

答案 2 :(得分:1)

作为替代方案,您可以使用此单行函数在tmux中为命令添加前缀:

panewrap () { printf "\033]2;%s\033\\" "$1"; "$@"; }

它会将窗格标题设置为launche命令($1 - 命令名称)并将其执行传递给终端($@ - 命令名及其所有参数)。

给您带来的不便是您必须在任何命令之前添加一个额外的单词前缀,但我偶尔会这样做,只有当命令打算运行很长一段时间时(例如,尾部)。