2013-01-16 79 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

相關問題