在 tmux 中模拟 GNU Screen 的 shelltitle

在 tmux 中模拟 GNU Screen 的 shelltitle

我正在尝试shelltitle在 tmux 中模拟 GNU Screen 的功能。我的 中有以下内容~/.bashrc

if [[ "$TERM" == screen* ]]; then
    SCREEN_ESC='\[\ek\e\\\]'
else
    SCREEN_ESC=''
fi

PS1="\n\w ${SCREEN_ESC}$ "

以及我的以下内容~/.screenrc

shelltitle        "$ |bash"

设置shelltitle使 GNU Screen 在 shell 中搜索换行符,并删除从$PS1转义字符开始的所有字符,并将其替换为之后找到的第一个单词。这在 手册页:

它的工作原理如下:您必须修改 shell 提示符以输出空标题转义序列 (<esc>k<esc>) 作为提示符的一部分。提示的最后部分必须与您为标题的搜索部分指定的字符串相同。设置完成后,屏幕将使用 title-escape-sequence 清除上一个命令名称并为下一个命令做好准备。然后,当从 shell 收到换行符时,将搜索提示符的末尾。如果找到,它将抓取匹配字符串后的第一个单词并将其用作命令名称。如果命令名称以“!”、“%”或“^”开头,屏幕将优先使用下一行的第一个单词(如果找到),而不是刚刚找到的名称。

这与 tmux 不同,tmuxset-option -g set-titles on只捕获进程名称。因此,Python 脚本的script.py标题将是script.py Screen(这是我想要的方式),而它的标题将是python tmux(我不想要的。)

我知道一个人可以重命名 tmux 窗口经过:

printf '\033kWINDOW_NAME\033\\'

所以我想知道是否有某种方法可以让 tmux 知道我已经输入了一个新命令。如果有某种方法可以获取最后输入的命令,我可以使用 Bash 来PROMPT_COMMAND执行此操作。有任何想法吗?

答案1

唉,多年后,解决方案!我在 tmux 和错过屏幕行为方面也遇到了同样的问题。简而言之:

将其添加到.bashrc

if [ -v "TMUX" ]; then
    PS0='$(printf "\033k%s\033" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'
    PROMPT_COMMAND="printf '\033kBASH\033\\'"

和这个tmux.conf

set -g allow-rename on

有关 的解释bashrcPS0请看一下: 将 bash shell 中执行的每个命令传递给变量

因为PROMPT_COMMANDBASH在返回 bash 时用作标签,所以您可以放置​​任何您喜欢的内容(即>_)。或者您可以省略PROMPT_COMMAND并保留最后执行的命令以在标签上看到。

相关内容