From b8947f2f8ac55e1cd3d0ddf4494fa5cc6b5d1ccf Mon Sep 17 00:00:00 2001 From: Oleg Guba Date: Mon, 15 Jun 2026 17:56:38 -0700 Subject: [PATCH] perf(kubectx)!: load context asynchronously BREAKING CHANGE: kubectx_prompt_info uses the async prompt API by default on supported zsh versions. Set async-prompt to no for synchronous behavior, or force when calling it through a wrapper function. --- plugins/kubectx/README.md | 15 ++++++++++++++ plugins/kubectx/kubectx.plugin.zsh | 33 +++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/plugins/kubectx/README.md b/plugins/kubectx/README.md index e3987b42f..f9474ca8a 100644 --- a/plugins/kubectx/README.md +++ b/plugins/kubectx/README.md @@ -22,6 +22,21 @@ RPS1='$(kubectx_prompt_info)' PROMPT="$PROMPT"'$(kubectx_prompt_info)' ``` +The context is loaded asynchronously on supported versions of zsh so that +`kubectl` does not block the prompt. To restore synchronous behavior, add this +before Oh My Zsh is sourced: + +```zsh +zstyle ':omz:alpha:plugins:kubectx' async-prompt no +``` + +If your theme calls `kubectx_prompt_info` indirectly through another function, +force registration of the async handler instead: + +```zsh +zstyle ':omz:alpha:plugins:kubectx' async-prompt force +``` + ### Custom context names You can rename the default context name for better readability or additional formatting. diff --git a/plugins/kubectx/kubectx.plugin.zsh b/plugins/kubectx/kubectx.plugin.zsh index f1ca990ad..a5d5ce8b8 100644 --- a/plugins/kubectx/kubectx.plugin.zsh +++ b/plugins/kubectx/kubectx.plugin.zsh @@ -1,6 +1,6 @@ typeset -g -A kubectx_mapping -function kubectx_prompt_info() { +function _omz_kubectx_prompt_info() { (( $+commands[kubectl] )) || return local current_ctx=$(kubectl config current-context 2> /dev/null) @@ -13,3 +13,34 @@ function kubectx_prompt_info() { # the context name, as it could contain a % character. echo "${kubectx_mapping[$current_ctx]:-${current_ctx:gs/%/%%}}" } + +function kubectx_prompt_info() { + if (( ${+_OMZ_ASYNC_OUTPUT} )) \ + && [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_kubectx_prompt_info]-}" ]]; then + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_kubectx_prompt_info]}" + fi +} + +local _style +if zstyle -t ':omz:alpha:plugins:kubectx' async-prompt \ + || { is-at-least 5.0.6 && zstyle -T ':omz:alpha:plugins:kubectx' async-prompt }; then + function _defer_async_kubectx_register() { + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT-}:${RPS1-}:${RPS2-}:${RPS3-}:${RPS4-}" in + *(\$\(kubectx_prompt_info\)|\`kubectx_prompt_info\`)*) + _omz_register_handler _omz_kubectx_prompt_info + ;; + esac + + add-zsh-hook -d precmd _defer_async_kubectx_register + unset -f _defer_async_kubectx_register + } + + autoload -Uz add-zsh-hook + precmd_functions=(_defer_async_kubectx_register $precmd_functions) +elif zstyle -s ':omz:alpha:plugins:kubectx' async-prompt _style && [[ $_style == "force" ]]; then + _omz_register_handler _omz_kubectx_prompt_info +else + function kubectx_prompt_info() { + _omz_kubectx_prompt_info + } +fi