tmux 未对 PS1 提示着色

tmux 未对 PS1 提示着色

我最近决定更改我的 PS1 变量以适应一些漂亮的 Solarized 颜色,以满足我的终端观看乐趣。当不在 tmux 会话中时,一切都很棒!彩虹、小马、独角兽和独特的提示!凉爽的!

然而问题出在 tmux 内部。我已经验证 PS1 的值正是我期望的值,并且与 tmux 未运行时的值相同,即\[\033]0;\w\007\]\[\[\]\]\u\[\]@\[\[\]\]\h\[\]:\[\]\W\[\]$ \[\].

我的 .bash_profile 中的所有别名等也按预期运行。 tmux 也正常显示颜色,其echo -ne "\033[1;33m hi"行为与预期相同gls --color

我的 .bash_profile 中当前的相关行是export PS1="\[\033]0;\w\007\]\[\[\]\]\u\[\]@\[\[\]\]\h\[\]:\[\]\W\[\]$ \[\]",尽管最初我是在 .bash_prompt 文件中获取脚本来处理一些条件等。我尝试恢复到更简单的版本。

执行bash将导致提示着色,但必须在每个窗格中完成。export PS1=[that long string I've already posted]将不会。

我的.tmux.conf如下:

set-option -g default-command "reattach-to-user-namespace -l /usr/local/bin/bash"
set -g default-terminal "xterm-256color"
set-window-option -g automatic-rename on
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"

.bash_profile的相关部分:

export TERM="xterm-256color"
if which tmux >/dev/null 2>&1; then
    test -z "$TMUX" && (tmux attach || tmux new-session)
fi

我正在使用 macOS Sierra、iTerm 2,我已经尝试了当前自制版本的 bash 和系统 bash(当前使用自制版本)tmux 2.4。

我还在touch testing_touch_from_bash_profile具有两个窗格的 tmux 会话中放置了 .bash_profile ,杀死了一个窗格,打开了一个窗格并验证了该文件确实已创建。

echo $TERM返回xterm-256color

我已确保在退出 tmux 以测试设置更改时,我已退出 tmux 并且当前没有 tmux 进程通过ps -ax | grep tmux.

奇怪的是,只要我在每个 tmux 窗格中执行此操作,获取 .bash_prompt 脚本也会更改颜色。

我看过https://stackoverflow.com/questions/21005966/tmux-prompt-not-following-normal-bash-prompt-ps1-w并尝试在 .tmux.conf 第一行的 bash 调用之后添加 --login 标志。启动 tmuxtmux new bash将导致第一个窗格着色,但后续窗格不会着色。

$PS1 变量似乎在所有方面都受到尊重,除了对任何字段进行着色之外。

有人有主意吗?

答案1

在我的机器上,解决方案是添加

set -g default-terminal "xterm-256color"

~/.tmux.conf

答案2

我对这个问题的解决方案是设置

force_color_prompt=yes

在我的.bashrc。现在我的 tmux 提示符有了颜色。

答案3

你的 PS1 还提供黑白输出。

然而切换回我的给了我颜色,所以你应该能够找出不同的,我使用

$ echo $PS1
\[\033[01;31m\]\t \[\033[01;32m\]durrantm \[\033[02;36m\]\h \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"` \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$

git_branch 是我的一个 bash 函数,它是:

git_branch () { 
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

你的与我的:

在此输入图像描述

这在 OSX 和 Ubuntu 上的工作原理相同

答案4

我在使用 Ubuntu 20.04 时遇到了这个问题。

尽管潘基的回答为我工作,我发现自己source ~/.bashrc每次登录时总是指定多路复用器外壳跟随埃瓦里斯特格德的评论。

这是我修复它的方法

.tmux首先,在计算机的主目录中创建一个名为~/.tmux.conf.

接下来,输入您要使用的配置多路复用器放入其中并保存。对我来说,我需要的配置与GNU 屏幕Ubuntu默认使用的软件包,所以我将文件内容复制~/.bashrc到该~/.tmux.conf文件中。这样,如果我必须编辑任何配置多路复用器,我不会篡改这个GNU 屏幕

笔记~/.bashrc:如果您不关心关注点分离,您可以跳过此步骤并仅使用该文件。

~/.bash_profile接下来,将该文件添加到、~/.bash_login和文件中~/.profile。应将其添加到文件底部:

source "$HOME/.tmux.conf"

或者

source "$HOME/.bashrc"

这是一个例子:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

source "$HOME/.tmux.conf"

笔记~/.bash_profile文件优先,~/.bash_login文件次之,~/.profile文件最后。

就这样。

我希望这有帮助

相关内容