Skip to content
Permalink
Browse files

add support for interactive selection with fzf (#74)

Present a fuzzy search choice in "kubectx" and "kubens" commands without
arguments.

![demo2](https://user-images.githubusercontent.com/159209/44478683-40f16d00-a5f3-11e8-99e2-f32f2a3539c1.gif)

Fixes #71.
  • Loading branch information...
ahmetb committed Aug 22, 2018
1 parent 7b23263 commit 8df92316d69d618f1c464903b382e600eb36a3d4
Showing with 52 additions and 4 deletions.
  1. +12 −2 README.md
  2. BIN img/kubectx-interactive.gif
  3. +16 −1 kubectx
  4. +24 −1 kubens
@@ -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.

-----
Binary file not shown.
17 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
25 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

0 comments on commit 8df9231

Please sign in to comment.
You can’t perform that action at this time.