5

我想用当前正在执行的命令更新 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

该方法来自这里: 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 窗格标题中显示当前命令,但它不起作用。有没有其他人对此有更好的解决方案,或者关于上述问题的建议?

谢谢。

4

3 回答 3

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

}

该函数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 functraceor set -T(如问题中相关人员所述)导致 RVM 中断。建议它的原因是允许在子shell 中更改提示,但缺少这个对我来说不是问题。

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

于 2013-01-18T10:00:50.980 回答
2

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

于 2013-05-30T19:16:25.213 回答
2

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

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

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

不便之处在于您必须在任何命令之前添加一个额外的单词前缀,但我偶尔会这样做,仅当命令打算运行一段时间(例如,tail)时。

于 2014-06-30T15:13:10.720 回答