我可以让我的终端配色方案根据我的 cwd 变量吗?

我可以让我的终端配色方案根据我的 cwd 变量吗?

不言自明,例如当我的cd Desktop响应是名义上的,除了术语配色方案从分配给的调色板更改~为分配给~/Desktop

答案1

您可以$PROMPT_COMMAND更改终端颜色设置,但它会更改每个终端窗口的配色方案,而不仅仅是当前窗口的配色方案。

对于 14.04,将以下内容放入您的~/.bashrc。在继续之前,您可能需要备份当前的 gconf 设置。

_terminal_colors(){
    local dir="/apps/gnome-terminal/profiles/$TERMINAL_PROFILE"
    
    local bg_default="#30300A0A2424"
    local bg_xterm="#147A147A147A"
    local bg
    
    local fg_default="#FFFFFFFFFFFF"
    local fg_xterm="#EEEEEEEEECEC"
    local fg
    
    local palette_default="#2E2E34343636:#CCCC00000000:#4E4E9A9A0606:#C4C4A0A00000:#34346565A4A4:#757550507B7B:#060698209A9A:#D3D3D7D7CFCF:#555557575353:#EFEF29292929:#8A8AE2E23434:#FCFCE9E94F4F:#72729F9FCFCF:#ADAD7F7FA8A8:#3434E2E2E2E2:#EEEEEEEEECEC"
    local palette_xterm="#000000000000:#CDCB00000000:#0000CDCB0000:#CDCBCDCB0000:#1E1A908FFFFF:#CDCB0000CDCB:#0000CDCBCDCB:#E5E2E5E2E5E2:#4CCC4CCC4CCC:#FFFF00000000:#0000FFFF0000:#FFFFFFFF0000:#46458281B4AE:#FFFF0000FFFF:#0000FFFFFFFF:#FFFFFFFFFFFF"
    local palette
    
    if [[ $PWD == ~/Desktop ||
          $PWD == ~/Desktop/* ]]
    then
        palette="$palette_xterm"
        bg="$bg_xterm"
        fg="$fg_xterm"
    else
        palette="$palette_default"
        bg="$bg_default"
        fg="$fg_default"
    fi
    
    gconftool-2 --set "$dir/palette" --type=string "$palette"
    gconftool-2 --set "$dir/background_color" --type=string "$bg"
    gconftool-2 --set "$dir/foreground_color" --type=string "$fg"
}

TERMINAL_PROFILE="" # Your profile here.
PROMPT_COMMAND="_terminal_colors"

对于 16.04 及更新版本,您需要调整命令以使用dconf而不是gconftool-2。这是一个完全不同的语法和目录结构。


更简单的解决方案

因此,考虑到上述情况的复杂性,我认为在 PS1 提示中设置密码的颜色更简单。这向前和向后兼容,也可能是跨平台的:

_PROMPT_pwd_color(){
    if [[ $PWD == ~/Desktop ||
          $PWD == ~/Desktop/* ]]
    then
        printf "\e[1;31m" # Red
    else
        printf "\e[1;32m" # Green
    fi
}

PS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u@\h\[\e[m\]:\[$(_PROMPT_pwd_color)\]\w\[\e[m\]\n\$ '

答案2

这与我的另一个答案有关,但它使用 ANSI 转义序列来仅为当前终端打开或关闭反向视频模式。

将其放入您的~/.bashrc

_terminal_reverse_video_cwd(){
    if [[ $PWD == ~/Desktop ||
          $PWD == ~/Desktop/* ]]
    then
        printf '\e[?5h' # Reverse
    else
        printf '\e[?5l' # Non-reverse
    fi
}

PROMPT_COMMAND="_terminal_reverse_video_cwd"

反向视频模式有两个令人烦恼的地方:

  1. 只能开启或者关闭,所以此方法只对一个目录有效
  2. 它可能不好看/难以阅读

相关内容