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