289 lines
12 KiB
Bash
289 lines
12 KiB
Bash
# Temporarily change options.
|
||
'builtin' 'local' '-a' 'p10k_config_opts'
|
||
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases')
|
||
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
|
||
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
|
||
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
|
||
|
||
() {
|
||
emulate -L zsh
|
||
setopt no_unset
|
||
|
||
autoload -Uz is-at-least && is-at-least 5.1 || return
|
||
|
||
# Unset all configuration options.
|
||
unset -m 'POWERLEVEL9K_*'
|
||
|
||
# Left prompt segments.
|
||
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
|
||
dir # current directory
|
||
vcs # git status
|
||
context # user@host
|
||
command_execution_time # previous command duration
|
||
virtualenv # python virtual environment
|
||
prompt_char # prompt symbol
|
||
)
|
||
|
||
# Right prompt segments.
|
||
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
|
||
nix_shell_with_name
|
||
)
|
||
|
||
# Defines character set used by powerlevel10k.
|
||
typeset -g POWERLEVEL9K_MODE=nerdfont-complete
|
||
|
||
# When set to `moderate`, some icons will have an extra space after them. This is meant to avoid
|
||
# icon overlap when using non-monospace fonts. When set to `none`, spaces are not added.
|
||
typeset -g POWERLEVEL9K_ICON_PADDING=none
|
||
|
||
# Basic style options that define the overall prompt look.
|
||
typeset -g POWERLEVEL9K_BACKGROUND= # transparent background
|
||
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace
|
||
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space
|
||
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol
|
||
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons
|
||
|
||
# Add an empty line before each prompt except the first. This doesn't emulate the bug
|
||
# in Pure that makes prompt drift down whenever you use the ALT-C binding from fzf or similar.
|
||
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
|
||
|
||
# Green prompt symbol if the last command succeeded.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=002
|
||
# Red prompt symbol if the last command failed.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=001
|
||
# Default prompt symbol.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯'
|
||
# Prompt symbol in command vi mode.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮'
|
||
# Prompt symbol in visual vi mode is the same as in command mode.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='❮'
|
||
# Prompt symbol in overwrite vi mode is the same as in command mode.
|
||
typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false
|
||
|
||
# Grey Python Virtual Environment.
|
||
typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=007
|
||
# Don't show Python version.
|
||
typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
|
||
typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
|
||
|
||
# Blue current directory.
|
||
typeset -g POWERLEVEL9K_DIR_FOREGROUND=blue
|
||
|
||
# Context format when root: user@host. The first part white, the rest grey.
|
||
typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%7F%n%f%007F@%m%f'
|
||
# Context format when not root: user@host. The whole thing grey.
|
||
typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%007F%n@%m%f'
|
||
# Don't show context unless root or in SSH.
|
||
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION=
|
||
|
||
# Show previous command duration only if it's >= 5s.
|
||
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5
|
||
# Don't show fractional seconds. Thus, 7s rather than 7.3s.
|
||
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
|
||
# Duration format: 1d 2h 3m 4s.
|
||
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'
|
||
# Yellow previous command duration.
|
||
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=007
|
||
|
||
# Branch icon. Set this parameter to '\uF126 ' for the popular Powerline branch icon.
|
||
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 '
|
||
|
||
# Untracked files icon. It's really a question mark, your font isn't broken.
|
||
# Change the value of this parameter to show a different icon.
|
||
typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
|
||
|
||
# Version control system colors.
|
||
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=2
|
||
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=3
|
||
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=2
|
||
typeset -g POWERLEVEL9K_VCS_CONFLICTED_FOREGROUND=3
|
||
typeset -g POWERLEVEL9K_VCS_LOADING_FOREGROUND=8
|
||
|
||
# Nix shell color.
|
||
typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=0
|
||
typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4
|
||
|
||
# Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line.
|
||
typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION=
|
||
|
||
function prompt_nix_shell_with_name() {
|
||
if [[ -n "${IN_NIX_SHELL-}" ]]; then
|
||
if [[ "${name-nix-shell}" != nix-shell ]] && [ "${name-shell}" != shell ]; then
|
||
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON -t "$name"
|
||
else
|
||
p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# VCS_STATUS_* parameters are set by gitstatus plugin. See reference:
|
||
# https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh.
|
||
function my_git_formatter() {
|
||
emulate -L zsh
|
||
|
||
if [[ -n $P9K_CONTENT ]]; then
|
||
# If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from
|
||
# gitstatus plugin). VCS_STATUS_* parameters are not available in this case.
|
||
typeset -g my_git_format=$P9K_CONTENT
|
||
return
|
||
fi
|
||
|
||
if (( $1 )); then
|
||
# Styling for up-to-date Git status.
|
||
local meta='%f' # default foreground
|
||
local clean='%002F' # green foreground
|
||
local modified='%003F' # yellow foreground
|
||
local untracked='%004F' # blue foreground
|
||
local conflicted='%001F' # red foreground
|
||
else
|
||
# Styling for incomplete and stale Git status.
|
||
local meta='%244F' # grey foreground
|
||
local clean='%244F' # grey foreground
|
||
local modified='%244F' # grey foreground
|
||
local untracked='%244F' # grey foreground
|
||
local conflicted='%244F' # grey foreground
|
||
fi
|
||
|
||
local res
|
||
|
||
if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then
|
||
local branch=${(V)VCS_STATUS_LOCAL_BRANCH}
|
||
|
||
# If local branch name is at most 32 characters long, show it in full.
|
||
# Otherwise show the first 12 … the last 12.
|
||
(( $#branch > 32 )) && branch[13,-13]="…" # <-- this line
|
||
|
||
if (( VCS_STATUS_HAS_CONFLICTED)); then
|
||
res+="${conflicted}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
|
||
else
|
||
if (( VCS_STATUS_HAS_STAGED || VCS_STATUS_HAS_UNSTAGED )); then
|
||
res+="${modified}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
|
||
else
|
||
if (( VCS_STATUS_HAS_UNTRACKED )); then
|
||
res+="${untracked}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
|
||
else
|
||
res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
|
||
fi
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
if [[ -n $VCS_STATUS_TAG
|
||
# Show tag only if not on a branch.
|
||
&& -z $VCS_STATUS_LOCAL_BRANCH # <-- this line
|
||
]]; then
|
||
local tag=${(V)VCS_STATUS_TAG}
|
||
# If tag name is at most 32 characters long, show it in full.
|
||
# Otherwise show the first 12 … the last 12.
|
||
(( $#tag > 32 )) && tag[13,-13]="…" # <-- this line
|
||
res+="${meta}#${clean}${tag//\%/%%}"
|
||
fi
|
||
|
||
# Display the current Git commit if there is no branch and no tag.
|
||
# Tip: To always display the current Git commit, delete the next line.
|
||
[[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line
|
||
res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}"
|
||
|
||
# Show tracking branch name if it differs from local branch.
|
||
if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then
|
||
res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}"
|
||
fi
|
||
|
||
typeset -g my_git_format=$res
|
||
}
|
||
|
||
functions -M my_git_formatter 2>/dev/null
|
||
|
||
# Don't count the number of unstaged, untracked and conflicted files in Git repositories with
|
||
# more than this many files in the index. Negative value means infinity.
|
||
#
|
||
# If you are working in Git repositories with tens of millions of files and seeing performance
|
||
# sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output
|
||
# of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's
|
||
# config: `git config bash.showDirtyState false`.
|
||
typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1
|
||
|
||
# Don't show Git status in prompt for repositories whose workdir matches this pattern.
|
||
# For example, if set to '~', the Git repository at $HOME/.git will be ignored.
|
||
# Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'.
|
||
typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~'
|
||
|
||
# Disable the default Git status formatting.
|
||
typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true
|
||
|
||
# Install our own Git status formatter.
|
||
typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}'
|
||
typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}'
|
||
|
||
# Enable counters for staged, unstaged, etc.
|
||
typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1
|
||
|
||
# Icon color.
|
||
typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=007
|
||
typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=008
|
||
|
||
# Show status of repositories of these types. You can add svn and/or hg if you are
|
||
# using them. If you do, your prompt may become slow even when your current directory
|
||
# isn't in an svn or hg reposotiry.
|
||
typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
|
||
|
||
# These settings are used for repositories other than Git or when gitstatusd fails and
|
||
# Powerlevel10k has to fall back to using vcs_info.
|
||
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=002
|
||
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=004
|
||
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=003
|
||
|
||
##########################[ end git configuration ]###########################
|
||
|
||
# Don't wait for Git status even for a millisecond, so that prompt always updates
|
||
# asynchronously when Git state changes.
|
||
typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0
|
||
|
||
# Cyan ahead/behind arrows.
|
||
typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=cyan
|
||
|
||
# Don't show remote branch, current tag or stashes.
|
||
# typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind)
|
||
|
||
# When in detached HEAD state, show @commit where branch normally goes.
|
||
typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@'
|
||
|
||
# Don't show staged, unstaged, untracked indicators.
|
||
# typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON=$'\b'
|
||
|
||
# Show '*' when there are staged, unstaged or untracked files.
|
||
typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*'
|
||
|
||
# Show '⇣' if local branch is behind remote.
|
||
typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='⇣'
|
||
|
||
# Show '⇡' if local branch is ahead of remote.
|
||
typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='⇡'
|
||
|
||
# Don't show the number of commits next to the ahead/behind arrows.
|
||
typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1
|
||
|
||
# Remove space between '⇣' and '⇡'.
|
||
# typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${P9K_CONTENT/⇣* ⇡/⇣⇡}'
|
||
|
||
# Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt
|
||
# when accepting a command line. Supported values:
|
||
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off
|
||
|
||
# Instant prompt mode.
|
||
typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose
|
||
|
||
# Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized.
|
||
# For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload
|
||
# can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you
|
||
# really need it.
|
||
typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true
|
||
|
||
# If p10k is already loaded, reload configuration.
|
||
# This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true.
|
||
(( ! $+functions[p10k] )) || p10k reload
|
||
}
|
||
|
||
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
|
||
'builtin' 'unset' 'p10k_config_opts'
|