使 tmux 窗口名称使用 bash $PS1

使 tmux 窗口名称使用 bash $PS1

在 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'

  1. 有没有办法通过最后完成的命令来命名 tmux 窗口?

  2. 如果没有,我怎样才能正确地将其设置为我的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(),用双引号括起来,这样空格就可以正常工作。

相关内容