
在 Windows 上,tmux
透過 MobaXterm 連接到 CentOS 7 上的 1.8。
理想情況下,我希望我的 tmux 視窗具有我在活動窗格中鍵入的最後一個命令的名稱(例如,而不是cd /home
列印)。我不知道該怎麼做,所以我試圖找出如何使名稱與活動窗格相符。我試過bash
{pane_current_command}
PS1
這個答案中的建議在我的 bashrc 中:
settitle() {
printf "\033k$1\033\\"
}
basic_prompt='${USER:0:3}@${PWD:${#PWD}<15?0:(-15)}'
PROMPT_COMMAND='if [ $? -eq 0 ]; then ((counter++)); else counter=0; fi; settitle($basic_prompt)'
PS1='(\[\e[4m\]${USER:0:3}\[\e[0m\]@\[\e[34m\]${PWD:${#PWD}<15?0:(-15)}\[\e[m\])[$counter]\\$ '
並得到了
bash: PROMPT_COMMAND: line 10: syntax error near unexpected token '$basic_prompt'
有沒有辦法透過最後完成的命令來命名 tmux 視窗?
如果沒有,我怎麼能正確地將其設為 my
PS1
,它是基於我的使用者名稱和路徑動態的?
答案1
解決了 tmux 2.6 和 tmux 1.8(在兩者上進行了測試)。
若要tmux
顯示動態視窗標題,請將您的標題編輯~/.bashrc
為類似以下內容:
settitle() {
printf "\033k$1\033\\"
}
dynamic_window_title='${USER:0:3}@${PWD:${#PWD}<25?0:(-25)}'
PROMPT_COMMAND='if [ "$TERM" =~ "screen" ]; then eval prompt=$dynamic_window_title; settitle "$prompt"; fi;'
並且您(可能)需要您~/.tmux.conf
擁有:
setw -g automatic-rename on
據我了解,settitle()
基本上是在執行每個命令後重命名視窗。我不完全明白它是如何做到這一點的。
PROMPT_COMMAND
是 bash 的一部分,在您運行每個命令後運行,它允許您做一些很酷的事情,例如追蹤您連續輸入了多少個正確的 bash 命令,除了我們在這裡不斷重新定義我們的標題之外。
$TERM
是一個環境變量,對我來說,它要么在 tmux 中設置為“screen”(或類似“screen-256color”),要么在使用 MobaXterm 時設置為“xterm”。我們會檢查這一點,因為否則您$PS1
不在 tmux 中時基本上會重複列印。
必須dynamic_title
用單引號括起來,否則它將在您獲取時定義~/.bashrc
,而不是動態的。但是,您需要在某個時候定義它,否則您的視窗將被按字面重命名${USER:0:3}@${PWD:${#PWD}<15?0:(-15)}
。這就是eval
創建一個字串,它實際上就是您想要的視窗標題。然後我們只需將該字串賦予settitle()
,用雙引號括起來,以便空格正常工作。