[zsh] Powerlevel10k 設定心得筆記

紀錄 Powerlevel10k ~/.p10k.zsh 的客製化設定心得。

客製化 .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'

下圖是用以上分隔符號設定的實驗效果,可以檢視每個參數實際發揮效果的地方:

發表留言