2013-01-16 41 views
3

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

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

这部分作品 - 它需要什么,但会导致其他问题:在一个新的壳第一提示带有前缀

"'"' DEBUG" 

并用

" 
所有剩余指令

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

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

所以,虽然上面并允许显示在TMUX窗格标题电流指令,这是行不通的。有没有其他人有更好的解决办法,或者有什么不对的建议?

谢谢。

+0

你会介意给出一个例子,说明输入一些命令后你想要输出什么? – Rubens

+0

基本上无论是在(bash)tmux窗格中运行应该在窗格标题中体现。因此,如果我输入了“vim〜/ .bashrc”,那么面板标题将会显示“”vim〜/ .bashrc“。当该命令结束并且bash提示符返回时,面板标题将显示为”bash“。上面所做的是,它只是在我的问题中试图描述一些其他不良的副作用。 – starfry

+0

我不知道您使用的是什么版本的'tmux',但是我的窗格标题没有变化我使用'tmux 1.6' – Rubens

回答

3

下面是每次在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中的默认标题的值。最终用户可以在任何时候改变其标题为whever他们希望通过执行:

$ title my new pane title 

初始标题被设定到运行的壳(即“的bash”)的名称。

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

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

其他说明

  • 而工作了这一点,我发现set -o functraceset -T(如在这个问题挂人描述的)导致RVM打破。提出这个建议的原因是为了允许提示在subsole中改变,但缺乏这对我来说不是问题。

  • 为了得到最初的标题,我想使用更简洁的ps -ho comm $$,但是这似乎不适用于tmux内部,上面已经有了。我不知道为什么如此选择了其他可行的东西。

2

我不知道,如果你可以将其设置为面板的标题,如果它是不是已经(它看起来像我的TMUX 1.8,它已经指出的命令作为面板的标题),但是在您的状态栏字符串中可能会使用包含该命令的未公开的#{pane_current_command}变量。

+0

它不再无证,它位于FORMATS下的联机帮助页中。 –

1

作为替代方案,你可以用这一个班轮功能TMUX前缀你的命令:

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

它将设置窗格标题launche命令($1 - 命令名),并通过它执行到终端([email protected] - 命令名称及其所有参数)。

不便之处是您必须在任何命令之前添加一个附加词语,但偶尔会这样做,只有命令旨在运行相当长一段时间(例如,尾部)时。

+0

发布在此答案中的链接看起来像是一个钓鱼页面。请谨慎行事。 – RajaRaviVarma

+0

@RajaRaviVarma删除它。感谢您指出 – nazikus

相关问题