From 22bda7799b1e1500a701e1a55a189c77119e9e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 1 Aug 2024 10:00:58 +0200 Subject: [PATCH] fix(kubectx): fix display of k8s contexts without double quotes (#12534) BREAKING CHANGE: the `kubectx` plugin now properly displays contexts from the kubectx_mapping array, without using double quotes. Please refer to the plugin README to see how to use it properly. Closes #12534 Co-authored-by: Ken Kelly --- plugins/kubectx/README.md | 48 ++++++++++++++++++++++++------ plugins/kubectx/kubectx.plugin.zsh | 8 +++-- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/plugins/kubectx/README.md b/plugins/kubectx/README.md index d924e745c..e3987b42f 100644 --- a/plugins/kubectx/README.md +++ b/plugins/kubectx/README.md @@ -1,25 +1,55 @@ # kubectx - show active kubectl context -This plugins adds ```kubectx_prompt_info()``` function. It shows name of the -active kubectl context (```kubectl config current-context```). +This plugins adds `kubectx_prompt_info()` function. It shows name of the active +kubectl context (`kubectl config current-context`). You can use it to customize prompt and know if You are on prod cluster ;) -_Example_. Add to **.zshrc**: +To use this plugin, add `kubectx` to the plugins array in your zshrc file: +```zsh +plugins=(... kubectx) ``` + +### Usage + +Add to **.zshrc**: + +```zsh +# right prompt RPS1='$(kubectx_prompt_info)' +# left prompt +PROMPT="$PROMPT"'$(kubectx_prompt_info)' ``` -### custom ctx names +### Custom context names -One can rename default context name for better readability. +You can rename the default context name for better readability or additional formatting. +These values accept [prompt expansion sequences](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) +such as `%F{color}`, `%f`, `%K{color}`, `%k`, `%B`, `%b`, `%U`, `%u`, `%S`, `%s`, `%{...%}`. -_Example_. Add to **.zshrc**: +**Example**: add this to your .zshrc file: + +```zsh +kubectx_mapping[minikube]="mini" +kubectx_mapping[context_name_from_kubeconfig]="$emoji[wolf_face]" +kubectx_mapping[production_cluster]="%{$fg[yellow]%}prod!%{$reset_color%}" +# contexts with spaces +kubectx_mapping[context\ with\ spaces]="%F{red}spaces%f" +# don't use quotes as it will break the prompt +kubectx_mapping["context with spaces"]="%F{red}spaces%f" # ti ``` -kubectx_mapping["minikube"]="mini" -kubectx_mapping["context_name_from_kubeconfig"]="$emoji[wolf_face]" -kubectx_mapping["production_cluster"]="%{$fg[yellow]%}prod!%{$reset_color%}" + +You can also define the whole mapping array at once: + +```zsh +typeset -A kubectx_mapping +kubectx_mapping=( + minikube "mini" + context_name_from_kubeconfig "$emoji[wolf_face]" + production_cluster "%{$fg[yellow]%}prod!%{$reset_color%}" + "context with spaces" "%F{red}spaces%f" +) ``` ![staging](stage.png) diff --git a/plugins/kubectx/kubectx.plugin.zsh b/plugins/kubectx/kubectx.plugin.zsh index a3210facc..f1ca990ad 100644 --- a/plugins/kubectx/kubectx.plugin.zsh +++ b/plugins/kubectx/kubectx.plugin.zsh @@ -7,7 +7,9 @@ function kubectx_prompt_info() { [[ -n "$current_ctx" ]] || return - # use value in associative array if it exists - # otherwise fall back to the context name - echo "${kubectx_mapping[\"$current_ctx\"]:-${current_ctx:gs/%/%%}}" + # Use value in associative array if it exists, otherwise fall back to the context name + # + # Note: we need to escape the % character in the prompt string when coming directly from + # the context name, as it could contain a % character. + echo "${kubectx_mapping[$current_ctx]:-${current_ctx:gs/%/%%}}" }