Skip to content

Commit

Permalink
add support for interactive selection with fzf (#74)
Browse files Browse the repository at this point in the history
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 8df9231
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 4 deletions.
14 changes: 12 additions & 2 deletions README.md
Expand Up @@ -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/)):

Expand All @@ -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.

-----
Expand Down
Binary file added img/kubectx-interactive.gif
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 16 additions & 1 deletion kubectx
Expand Up @@ -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)"
Expand Down Expand Up @@ -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
Expand Down
25 changes: 24 additions & 1 deletion kubens
Expand Up @@ -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)"
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 8df9231

Please sign in to comment.