紀錄 Powerlevel10k ~/.p10k.zsh 的客製化設定心得。
傳送門 (Table of Contents)
客製化 .p10k.zsh 並讓修改生效
$ vi ~/.p10k.zsh
$ source ~/.zshrc
如何改變 Prompt 顏色
基本原則
.p10k.zsh 裡搜尋 "COLOR"、"FOREGROUND"、"BACKGROUND" 字眼,會看到很多顏色配置參數,包含前景色(文字顏色)和背景色,都可以調整。
例如「指令執行時間」的顏色配置參數,更改色碼代號就可以:
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=4
色碼表
p10k 裡用到的色碼代號是從 0~255,執行以下指令可以檢視每個色碼和對應的顏色:
$ for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done
Refs
icon 無法顯示或顯示成文字模式
例如 os mac icon、鎖頭 icon、disk icon 顯示不正常:
這是字元集設定的關係,修改以下參數:
## 原本可能是
typeset -g POWERLEVEL9K_MODE=ascii
## 改成
typeset -g POWERLEVEL9K_MODE=nerdfont-complete
客製化 Prompt 指令輸入點的符號
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯ $'
客製化 Prompt Segment 資訊種類
設定左右 Prompt 分別想顯示的資訊種類
參數:
- POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
- POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
打開註解 #
就能開啟該 segment,也可以任意安插順序:
# The list of segments shown on the left. Fill it with the most important segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
# os_icon # os identifier
dir # current directory
vcs # git status
# =========================[ Line #2 ]=========================
newline # \n
prompt_char # prompt symbol
)
.....
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
status # exit code of the last command
command_execution_time # duration of the last command
background_jobs # presence of background jobs
direnv # direnv status (https://direnv.net/)
asdf # asdf version manager (https://github.com/asdf-vm/asdf)
virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html)
anaconda # conda environment (https://conda.io/)
.....
Refs: romkatv/powerlevel10k – Segment
Segment: 資料夾寫入權限 (dir_writable)
雖然 dir
Segment 的 icon 有包含鎖頭 icon 效果,但不夠顯眼,我還是習慣有個獨立的 dir_writable
Segment 很顯眼地提示我。
Powerlevel10k 好像已經沒有支援 dir_writable 這個 Segment 的客製化,但還是支援基本的顯示。
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
# os_icon # os identifier
dir # current directory
dir_writable
vcs # git status
Segment: 指令執行時間 (command_execution_time)
修改顏色配置
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=4
為什麼沒有每次顯示秒數? —— 秒數門檻設定
預設要執行時間超過 3 秒的指令才會顯示,門檻可以修改:
# Show duration of the last command if takes at least this many seconds.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3
Segment: Exit Code 的顯示 (status)
為什麼 status 的 segment 已經打開,error 時仍沒有出現
以下參數需要從 false 改成 true:
typeset -g POWERLEVEL9K_STATUS_ERROR=false
Segment: 版本控制 (vcs)
客製化 staged/unstaged/conflict/untracked 的 Icon
預設只是普通的 ?
/ ~
/ +
/ !
符號,可以自己客製化:
## before
typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
.....
(( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}"
(( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}"
(( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}"
## after
typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='\uF059'
.....
(( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}"$'\uF28D'"${VCS_STATUS_NUM_CONFLICTED}"
(( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}"$'\uF055'"${VCS_STATUS_NUM_STAGED}"
(( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}"$'\uF06A'"${VCS_STATUS_NUM_UNSTAGED}"
代碼表參考:Cheatsheet | Font Awesome
可以先在 command line 上測試代碼印出的效果:
$ echo 'f060='"\uf060" 'f061='"\uf061" 'f062='"\uf062" 'f063='"\uf063" 'f0b2='"\uf0b2" 'f06a='"\uf06a" 'f071='"\uf071" 'f05a='"\uf05a"
客製化 Prompt 裡 Segment 之間分隔符號
Powerlevel10k 內建已經提供了很不錯的經典設定,如果你有興趣打造更強烈個人風格,例如這篇文章弄得特別炫,可以對分隔符號做客製化。
分隔符號的參數:
# Separator between same-color segments on the left.
# 左邊 prompt 的分隔號 for 同顏色
typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\uf060'
# Separator between same-color segments on the right.
# 右邊 prompt 的分隔號 for 同顏色
typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\uf061'
# Separator between different-color segments on the left.
# 左邊 prompt 的分隔號 for 不同顏色
typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uf062'
# Separator between different-color segments on the right.
# 右邊 prompt 的分隔號 for 不同顏色
typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uf063'
# The right end of left prompt.
# 左 prompt 的右端
typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uf0b2'
# The left end of right prompt.
# 右邊 prompt 的左端
typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uf06a'
# The left end of left prompt.
# 左 prompt 的左端
typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uf071'
# The right end of right prompt.
# 右邊 prompt 的右端
typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uf192'
# Left prompt terminator for lines without any segments.
# 看不出效果
typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uf058'
下圖是用以上分隔符號設定的實驗效果,可以檢視每個參數實際發揮效果的地方: