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.
This commit is contained in:
Ahmet Alp Balkan 2018-08-22 10:08:13 -07:00 committed by GitHub
parent 7b23263fc2
commit 8df92316d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 4 deletions

View File

@ -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/)):

BIN
img/kubectx-interactive.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

15
kubectx
View File

@ -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
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

23
kubens
View File

@ -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
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