diff --git a/README.md b/README.md index d009b160..0960308d 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,17 @@ sudo apt install kubectx ----- -### Customizing current context colors +### Interactive mode + +If you want `kubectx` and `kubens` commands to present you an interactive menu +with fuzzy searching, you just need to [install +`fzf`](https://github.com/junegunn/fzf) in your PATH. + +![kubectx interactive search with fzf](img/kubectx-interactive.gif) + +----- + +### Customizing colors If you like to customize the colors indicating the current namespace or context, set the environment variables `KUBECTX_CURRENT_FGCOLOR` and `KUBECTX_CURRENT_BGCOLOR` (refer color codes [here](https://linux.101hacks.com/ps1-examples/prompt-color-using-tput/)): @@ -136,7 +146,7 @@ export KUBECTX_CURRENT_FGCOLOR=$(tput setaf 6) # blue text export KUBECTX_CURRENT_BGCOLOR=$(tput setaf 7) # white background ``` -Colors in the output can be disabled by setting the +Colors in the output can be disabled by setting the [`NO_COLOR`](http://no-color.org/) environment variable. ----- diff --git a/img/kubectx-interactive.gif b/img/kubectx-interactive.gif new file mode 100644 index 00000000..5a7152a4 Binary files /dev/null and b/img/kubectx-interactive.gif differ diff --git a/kubectx b/kubectx index 3eb813b3..ba40e7e1 100755 --- a/kubectx +++ b/kubectx @@ -89,6 +89,17 @@ switch_context() { kubectl config use-context "${1}" } +choose_context_interactive() { + local choice + choice="$(FZF_DEFAULT_COMMAND='kubectx' fzf --ansi || true)" + if [[ -z "${choice}" ]]; then + echo 2>&1 "error: you did not choose any of the options" + exit 1 + else + set_context "${choice}" + fi +} + set_context() { local prev prev="$(current_context)" @@ -170,7 +181,11 @@ delete_context() { main() { if [[ "$#" -eq 0 ]]; then - list_contexts + if [[ -t 1 && "$(type fzf &>/dev/null; echo $?)" -eq 0 ]]; then + choose_context_interactive + else + list_contexts + fi elif [[ "${1}" == "-d" ]]; then if [[ "$#" -lt 2 ]]; then echo "error: missing context NAME" >&2 diff --git a/kubens b/kubens index b57a85e0..30331be7 100755 --- a/kubens +++ b/kubens @@ -85,6 +85,25 @@ switch_namespace() { echo "Active namespace is \"${2}\".">&2 } +choose_namespace_interactive() { + # directly calling kubens via fzf might fail with a cryptic error like + # "$FZF_DEFAULT_COMMAND failed", so try to see if we can list namespaces + # locally first + if [[ -z "$(list_namespaces)" ]]; then + echo >&2 "error: could not list namespaces (is the cluster accessible?)" + exit 1 + fi + + local choice + choice="$(FZF_DEFAULT_COMMAND='kubens' fzf --ansi || true)" + if [[ -z "${choice}" ]]; then + echo 2>&1 "error: you did not choose any of the options" + exit 1 + else + set_namespace "${choice}" + fi +} + set_namespace() { local ctx prev ctx="$(current_context)" @@ -137,7 +156,11 @@ swap_namespace() { main() { if [[ "$#" -eq 0 ]]; then - list_namespaces + if [[ -t 1 && "$(type fzf &>/dev/null; echo $?)" -eq 0 ]]; then + choose_namespace_interactive + else + list_namespaces + fi elif [[ "$#" -eq 1 ]]; then if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then usage