我正在尝试shelltitle
在 tmux 中模拟 GNU Screen 的功能。我有以下内容~/.bashrc
:
if [[ "$TERM" == screen* ]]; then
SCREEN_ESC='\[\ek\e\\\]'
else
SCREEN_ESC=''
fi
PS1="\n\w ${SCREEN_ESC}$ "
Run Code Online (Sandbox Code Playgroud)
以及我的以下内容~/.screenrc
:
shelltitle "$ |bash"
Run Code Online (Sandbox Code Playgroud)
设置shelltitle
使 GNU Screen 在 shell 中搜索换行符并去除$PS1
转义字符之前的所有字符,并将其替换为之后找到的第一个单词。这在手册页中有更清楚的解释
:
这是它的工作原理:您必须修改您的 shell 提示以输出一个空的标题转义序列 (<esc>k<esc>) 作为您的提示的一部分。提示的最后一部分必须与您为标题的搜索部分指定的字符串相同。设置完成后, screen 将使用 title-escape-sequence 清除前一个命令名称并为下一个命令做好准备。然后,当从 shell 接收到换行符时,将搜索提示的结尾。如果找到,它将抓取匹配字符串后的第一个单词并将其用作命令名称。如果命令名称以 '!'、'%' 或 '^' 开头,屏幕将优先使用下一行的第一个单词(如果找到)而不是刚刚找到的名称。
这与set-option -g set-titles on
仅捕获进程名称的tmux 不同。因此,Python 脚本的script.py
标题将script.py
与 Screen 中的一样(这是我想要的方式),而它的标题将python
与 tmux 中的一样(我不想要。)
我知道可以通过以下方式重命名 tmux 窗口:
printf '\033kWINDOW_NAME\033\\'
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有什么方法可以让 tmux 知道我输入了一个新命令。如果有某种方法可以让我输入最后一个命令,我可以使用 BashPROMPT_COMMAND
来执行此操作。有任何想法吗?
唉,多年后,解决方案!我在 tmux 和错过屏幕行为方面也遇到了同样的问题。简而言之:
将其添加到.bashrc
if [ -v "TMUX" ]; then
PS0='$(printf "\033k%s\033" "$(HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//")")'
PROMPT_COMMAND="printf '\033kBASH\033\\'"
Run Code Online (Sandbox Code Playgroud)
和这个tmux.conf
set -g allow-rename on
Run Code Online (Sandbox Code Playgroud)
有关 的解释bashrc
,PS0
请查看以下内容:
将 bash shell 中执行的每个命令传递给变量
因为PROMPT_COMMAND
我BASH
在返回 bash 时用作标签,所以您可以放置任何您喜欢的内容(即>_
)。或者您可以省略PROMPT_COMMAND
并保留最后执行的命令以在标签上看到。