Trueline: 具有真彩色支持的 Bash Powerline 风格提示符
Trueline 是一个快速且可扩展的 Powerline 风格 bash 提示符,支持真彩色(24位)和精美字形。
其纯 Bash 代码实现和整体功能模仿了优秀的 Pureline 命令提示符。然而 Trueline 还增加了使用 RGB 颜色代码的能力,扩展了提示符分段中的图标/字形使用(灵感来自 Powerlevel9k),简化了配置,并且除其他功能外,还显示当前输入模式(在 vi 模式下)。
安装
下载此仓库中的 trueline.sh
脚本,并在 .bashrc
文件中源引用它:
$> git clone https://github.com/petobens/trueline ~/trueline
$> echo 'source ~/trueline/trueline.sh' >> ~/.bashrc
或者
$> wget https://raw.githubusercontent.com/petobens/trueline/master/trueline.sh -P ~/
$> echo 'source ~/trueline.sh' >> ~/.bashrc
如果你使用支持"Powerline"字形的字体,比如包含在出色的 Nerd Fonts 项目中的字体,那么提示符应该能正确渲染,无需进一步配置(只要你喜欢上图所示的默认设置)。
自定义
自定义和扩展提示符很容易,有几个可用的分段选项。
所有设置都放在 .bashrc
中,必须在实际源引用 trueline.sh
文件之前定义(否则将使用默认设置)。为了说明这是如何工作的,让我们从一个简单的配置示例开始:
declare -A TRUELINE_COLORS=(
[light_blue]='75;161;207'
[grey]='99;99;100'
[pink]='199;88;157'
)
declare -a TRUELINE_SEGMENTS=(
'working_dir,light_blue,black,normal'
'git,grey,black,normal'
'time,white,black,normal'
'newline,pink,black,bold'
)
declare -A TRUELINE_SYMBOLS=(
[git_modified]='*'
[git_github]=''
[segment_separator]=''
[working_dir_folder]='...'
[working_dir_separator]='/'
[working_dir_home]='~'
[newline]='❯'
[clock]='🕒'
)
TRUELINE_GIT_SHOW_STATUS_NUMBERS=false
TRUELINE_GIT_MODIFIED_COLOR='grey'
TRUELINE_WORKING_DIR_SPACE_BETWEEN_PATH_SEPARATOR=false
_trueline_time_segment() {
local prompt_time="${TRUELINE_SYMBOLS[clock]} \t"
if [[ -n "$prompt_time" ]]; then
local fg_color="$1"
local bg_color="$2"
local font_style="$3"
local segment="$(_trueline_separator)"
segment+="$(_trueline_content "$fg_color" "$bg_color" "$font_style" " $prompt_time ")"
PS1+="$segment"
_trueline_record_colors "$fg_color" "$bg_color" "$font_style"
fi
}
source ~/trueline/trueline.sh
这会生成以下提示符(基本上复制了极简 ZSH Pure 提示符):
你可以在上面的配置中看到,基本上有 5 个不同/相关的设置:颜色、分段、符号、选项和扩展。让我们逐一分解这些设置。
颜色
颜色通过名为 TRUELINE_COLORS
的关联数组定义。该数组的键是颜色名称,值是 RGB 颜色代码:
declare -A TRUELINE_COLORS=(
[color_name]='red;green;blue'
)
默认颜色大致基于 Atom 的 One Dark 主题,由以下定义:
declare -A TRUELINE_COLORS=(
[black]='36;39;46'
[cursor_grey]='40;44;52'
[green]='152;195;121'
[grey]='171;178;191'
[light_blue]='97;175;239'
[mono]='130;137;151'
[orange]='209;154;102'
[purple]='198;120;221'
[red]='224;108;117'
[special_grey]='59;64;72'
[white]='208;208;208'
)
在源引用 Trueline 脚本之前在 bashrc 文件中定义的任何 TRUELINE_COLORS
数组实际上会更新上述默认数组(在覆盖现有键和添加不存在的键的意义上)。这基本上意味着始终可以使用默认颜色,只有在真正需要新的额外颜色时才需要定义数组。
注意: 你可以定义任何你想要的颜色名称,除了 default_bg
,它被 Trueline 用来获取默认终端背景颜色。
分段
提示符分段在名为 TRUELINE_SEGMENTS
的有序数组中定义,其结构如下:
declare -a TRUELINE_SEGMENTS=(
'segment_name,segment_fg_color,segment_bg_color,font_style'
)
其中分段前景和背景颜色名称是 TRUELINE_COLORS
数组的键,字体样式可以是 bold
、dim
、italic
、normal
或 underlined
。数组中元素的顺序定义了每个分段在提示符中渲染的顺序。
Trueline 提供以下分段(状态表示它们是否默认启用/渲染):
段名称 | 状态 | 描述 |
---|---|---|
aws_profile | 已启用 | 当前AWS配置文件 |
bg_jobs | 已启用 | 后台作业数量 |
cmd_duration | 已禁用 | 上一条命令执行时间 |
conda_env | 已启用 | 当前Anaconda环境 |
exit_status | 已启用 | 上一条命令的返回码 |
git | 已启用 | git分支/远程仓库和仓库状态 |
newline | 已禁用 | 将提示符段分割成多行 |
read_only | 已启用 | 只读目录指示器 |
user | 已启用 | 用户名和主机名(根据ssh状态显示) |
venv | 已启用 | Python虚拟环境 |
working_dir | 已启用 | 当前工作目录 |
distro_icon | 已禁用 | 当前Linux发行版图标 |
但可以轻松添加更多段(参见扩展)。
要启用换行段,可以使用以下配置:
declare -a TRUELINE_SEGMENTS=(
'working_dir,mono,cursor_grey,normal'
'git,grey,special_grey,normal'
'newline,black,orange,bold'
)
效果如下:
符号
符号(即图标/字形)通过名为TRUELINE_SYMBOLS
的关联数组定义,其中每个条目的键是(预定义的)段符号名称,值是实际的符号/图标:
declare -A TRUELINE_SYMBOLS=(
[segment_symbol_name]='|' # 实际符号
)
下表显示了当前预定义的符号名称及其默认值(即实际字形或相应的nerd-font unicode代码):
符号名称 | 字形 | 符号名称 | 字形 | |
---|---|---|---|---|
aws_profile | U+f52c | newline_root | U+f52c | |
bg_jobs | U+f085 | ps2 | ... | |
distro_icon | U+ebc6 | read_only | U+f023 | |
exit_status | U+ea87 | segment_separator | U+e0b0 | |
git_ahead | U+f55c | ssh | U+f817 | |
git_behind | U+f544 | timer | U+fa1e | |
git_bitbucket | U+f171 | venv (和conda) | U+e73c | |
git_branch | U+e0a0 | vimode_cmd | N | |
git_github | U+f408 | vimode_ins | I | |
git_gitlab | U+f296 | working_dir_folder | U+e5fe | |
git_modified | U+f44d | working_dir_home | U+f015 | |
newline | U+f155 | working_dir_separator | U+e0b1 |
与TRUELINE_COLORS
一样,在加载Trueline脚本之前在bashrc文件中定义的任何TRUELINE_SYMBOLS
数组实际上会使用上面显示的默认符号更新数组(因此只有在覆盖某些图标或添加新图标时才需要定义此类数组)。
选项
大多数Trueline设置都通过上述3个结构控制。但是Trueline还定义了一系列控制一些额外选项的变量。特别是我们可以区分段内和外部选项。这些选项及其默认值定义如下:
段内
以下段有自己的(子)设置:
- git:
TRUELINE_GIT_SHOW_STATUS_NUMBERS=true
: 布尔变量,决定是否在相应的修改/落后状态符号旁显示实际修改的文件数和落后/领先的提交数。TRUELINE_GIT_MODIFIED_COLOR='red'
: 修改文件的符号和数量的前景色。TRUELINE_GIT_BEHIND_AHEAD_COLOR='purple'
: 落后/领先提交的符号和数量的前景色。
- user:
TRUELINE_USER_ROOT_COLORS=('black' 'red')
: root用户的前景色和背景色。TRUELINE_USER_SHOW_IP_SSH=false
: 布尔变量,决定是否在ssh连接中显示IP地址或主机名。TRUELINE_USER_ALWAYS_SHOW_HOSTNAME=false
: 布尔变量,决定是否始终显示IP地址或主机名(不仅在ssh连接中)。TRUELINE_USER_SHORTEN_HOSTNAME=false
: 布尔变量,决定是显示完整主机名(host.domain.com)还是缩短的主机名(host)。
- working_dir:
TRUELINE_WORKING_DIR_SPACE_BETWEEN_PATH_SEPARATOR=true
: 布尔变量,决定是否在路径分隔符前后添加空格。TRUELINE_WORKING_DIR_ABBREVIATE_PARENT_DIRS=false
: 布尔变量,设置为true时显示完整工作目录(而不是截断它)。每个父目录缩短为TRUELINE_WORKING_DIR_ABBREVIATE_PARENT_DIRS_LENGTH
。TRUELINE_WORKING_DIR_ABBREVIATE_PARENT_DIRS_LENGTH=1
: 启用TRUELINE_WORKING_DIR_ABBREVIATE_PARENT_DIRS
时每个父目录的长度。
外部
TRUELINE_SHOW_VIMODE=false
: 布尔变量,决定是否显示当前vi模式(如果设置为true
且vi模式尚未启用,则Trueline将启用它;否则必须在.bashrc
中通过set -o vi
单独启用vi模式)。设置为true
时,会首先显示一个新段(即在TRUELINE_SEGMENTS
中定义的任何其他段之前),其外观可以通过以下变量控制:TRUELINE_VIMODE_INS_COLORS_STYLE=('black' 'light_blue' 'bold')
: 插入模式段的前景/背景颜色和字体样式。TRUELINE_VIMODE_CMD_COLORS_STYLE=('black' 'green' 'bold')
: 命令模式段的前景/背景颜色和字体样式。TRUELINE_VIMODE_INS_CURSOR='vert'
: 插入模式光标形状(可能的值为vert
、block
和under
)。TRUELINE_VIMODE_CMD_CURSOR='block'
: 命令模式光标形状(可能的值为vert
、block
和under
)。
扩展
通过遵循此模板,可以轻松将新段添加到提示符中:
_trueline_new_segment_name_segment() {
local some_content=$(...)
if [[ -n "$some_content" ]]; then
local fg_color="$1"
local bg_color="$2"
local font_style="$3"
local segment="$(_trueline_separator)"
segment+="$(_trueline_content "$fg_color" "$bg_color" "$font_style" " $some_content ")"
PS1+="$segment"
_trueline_record_colors "$fg_color" "$bg_color" "$font_style"
fi
}
然后只需在TRUELINE_SEGMENTS
数组中包含new_segment_name
。
欢迎提交包含新段的PR!