From 08edfaa7dc208789502646c825dbe1b16fb1564e Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Sun, 15 Dec 2024 18:17:31 +0000 Subject: [PATCH] Add powerlevel10k Signed-off-by: Nikolaos Karaolidis --- hosts/common/system/shells/nodejs/default.nix | 6 + hosts/common/system/shells/python/default.nix | 6 + .../common/user/configs/console/zsh/.p10k.zsh | 249 ++++++++++++++++++ .../user/configs/console/zsh/default.nix | 13 +- 4 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 hosts/common/user/configs/console/zsh/.p10k.zsh diff --git a/hosts/common/system/shells/nodejs/default.nix b/hosts/common/system/shells/nodejs/default.nix index b76036c..00ac595 100644 --- a/hosts/common/system/shells/nodejs/default.nix +++ b/hosts/common/system/shells/nodejs/default.nix @@ -3,4 +3,10 @@ pkgs.mkShell { packages = with pkgs; [ nodejs ]; + + shellHook = '' + export P10K_EXTRA_RIGHT_PROMPT_ELEMENTS=( + node_version + ) + ''; } diff --git a/hosts/common/system/shells/python/default.nix b/hosts/common/system/shells/python/default.nix index d4ac783..bdbeb5e 100644 --- a/hosts/common/system/shells/python/default.nix +++ b/hosts/common/system/shells/python/default.nix @@ -11,4 +11,10 @@ pkgs.mkShell { ] )) ]; + + shellHook = '' + export P10K_EXTRA_RIGHT_PROMPT_ELEMENTS=( + virtualenv + ) + ''; } diff --git a/hosts/common/user/configs/console/zsh/.p10k.zsh b/hosts/common/user/configs/console/zsh/.p10k.zsh new file mode 100644 index 0000000..119c109 --- /dev/null +++ b/hosts/common/user/configs/console/zsh/.p10k.zsh @@ -0,0 +1,249 @@ +'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 -o extended_glob + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + dir + vcs + # =========================[ Line #2 ]========================= + newline + prompt_char + ) + + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + status + command_execution_time + background_jobs + direnv + ranger + vim_shell + nix_shell + per_directory_history + "${P10K_EXTRA_RIGHT_PROMPT_ELEMENTS[@]}" + context + # =========================[ Line #2 ]========================= + newline + ) + + typeset -g POWERLEVEL9K_MODE=ascii + typeset -g POWERLEVEL9K_ICON_PADDING=none + typeset -g POWERLEVEL9K_BACKGROUND= + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= + typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + typeset -g POWERLEVEL9K_SHOW_RULER=false + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + + ################################[ prompt_char: prompt symbol ]################################ + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='>' + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='<' + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='^' + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='' + + ##################################[ dir: current directory ]################################## + typeset -g POWERLEVEL9K_DIR_FOREGROUND=31 + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique + typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=103 + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=39 + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true + local anchor_files=( + .git + flake.nix + Cargo.toml + go.mod + package.json + ) + typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" + typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false + typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 + typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 + typeset -g POWERLEVEL9K_DIR_HYPERLINK=false + + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 + + typeset -g POWERLEVEL9K_DIR_CLASSES=() + + #####################################[ vcs: git status ]###################################### + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' + + function my_git_formatter() { + emulate -L zsh + + if [[ -n $P9K_CONTENT ]]; then + typeset -g my_git_format=$P9K_CONTENT + return + fi + + if (( $1 )); then + local meta='%f' + local clean='%76F' + local modified='%178F' + local untracked='%39F' + local conflicted='%196F' + else + local meta='%244F' + local clean='%244F' + local modified='%244F' + local untracked='%244F' + local conflicted='%244F' + fi + + local res + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=${(V)VCS_STATUS_LOCAL_BRANCH} + (( $#branch > 32 )) && branch[13,-13]=".." + res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" + fi + + if [[ -n $VCS_STATUS_TAG + && -z $VCS_STATUS_LOCAL_BRANCH + ]]; then + local tag=${(V)VCS_STATUS_TAG} + (( $#tag > 32 )) && tag[13,-13]=".." + res+="${meta}#${clean}${tag//\%/%%}" + fi + + [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && + res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" + + if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then + res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + + if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then + res+=" ${modified}wip" + fi + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}<${VCS_STATUS_COMMITS_BEHIND}" + (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}>${VCS_STATUS_COMMITS_AHEAD}" + fi + + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}<-${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}->${VCS_STATUS_PUSH_COMMITS_AHEAD}" + (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" + [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" + (( 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}" + (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" + (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}-" + + typeset -g my_git_format=$res + } + functions -M my_git_formatter 2>/dev/null + + typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 + + typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' + + typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true + 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}}' + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=76 + typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=244 + typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION= + + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=178 + + ##########################[ status: exit code of the last command ]########################### + typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true + + typeset -g POWERLEVEL9K_STATUS_OK=true + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='ok' + + typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='ok' + + typeset -g POWERLEVEL9K_STATUS_ERROR=false + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='err' + + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=true + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION= + + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='err' + + ###################[ command_execution_time: duration of the last command ]################### + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=2 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=101 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + + #######################[ background_jobs: presence of background jobs ]####################### + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=70 + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=178 + + #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## + typeset -g POWERLEVEL9K_RANGER_FOREGROUND=178 + + ###########################[ vim_shell: vim shell indicator (:sh) ]########################### + typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=34 + + #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## + typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=74 + + typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=true + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=135 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=130 + + ##################################[ context: user@hostname ]################################## + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=178 + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=180 + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=180 + + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%B%n@%m' + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' + + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= + + #####################################[ Other Settings ]####################################### + + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always + typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet + typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true + + (( ! $+functions[p10k] )) || p10k reload +} + +typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} + +(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} +'builtin' 'unset' 'p10k_config_opts' diff --git a/hosts/common/user/configs/console/zsh/default.nix b/hosts/common/user/configs/console/zsh/default.nix index e15cd89..ae48ed9 100644 --- a/hosts/common/user/configs/console/zsh/default.nix +++ b/hosts/common/user/configs/console/zsh/default.nix @@ -2,7 +2,7 @@ user ? throw "user argument is required", home ? throw "home argument is required", }: -{ config, ... }: +{ config, pkgs, ... }: { environment = { sessionVariables.ZDOTDIR = "$HOME/.config/zsh"; @@ -17,10 +17,21 @@ history = { path = "${home}/.local/share/zsh/history"; expireDuplicatesFirst = true; + append = true; }; historySubstringSearch.enable = true; autosuggestion.enable = true; syntaxHighlighting.enable = true; + plugins = [ + { + name = "powerlevel10k"; + src = pkgs.zsh-powerlevel10k; + file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + } + ]; + initExtra = '' + source ${./.p10k.zsh} + ''; }; home.file.".zshenv".enable = false;