-
-
Save zish/85dccece461e050077997ff5d7d9c9d4 to your computer and use it in GitHub Desktop.
# Bash Terraform completion | |
# | |
# Originally adapted from | |
# https://gist.github.com/cornfeedhobo/8bc08747ec3add1fc5adb2edb7cd68d3 | |
# | |
# Author: Jeremy Melanson | |
# | |
# Features of this version: | |
# - Uses built-in bash routines for text processing, instead of external tools | |
# (awk, sed, grep, ...). | |
# | |
# - fixes the retrieval of options from the Terraform executble. | |
# | |
# - Optional _init_terraform_completion function, which can enable | |
# command-completion for multiple Terraform executables. | |
# | |
#--- Get options listing from Terraform command. | |
# | |
_terraform_completion_get_opts () { | |
local CMD_EXEC="${1}" | |
local TF_OPT="${2}" | |
local IFS=$'\n' | |
#-- "terraform -help" | |
if [[ "${TF_OPT}" == "" ]]; then | |
for O in $(${CMD_EXEC} -help); do | |
if [[ "${O}" =~ ^\ +([^\ ]+) ]]; then | |
echo -e "${BASH_REMATCH[1]}" | |
fi | |
done | |
#-- "terraform -help XXXX" | |
else | |
for O in $(${CMD_EXEC} -help ${TF_OPT}); do | |
if [[ "${O}" =~ ^\ +(-[^\ =]+=?) ]]; then | |
echo -e "${BASH_REMATCH[1]}" | |
fi | |
done | |
fi | |
} | |
#--- This function is passed to 'complete' for handling completion. | |
# | |
_terraform_completion () { | |
local cur prev words cword opts | |
local O_COMP_WORDBREAKS="${COMP_WORDBREAKS}" | |
export COMP_WORDBREAKS="${COMP_WORDBREAKS//=/}" | |
_init_completion -s || return | |
_get_comp_words_by_ref -n : cur prev words cword | |
COMPREPLY=() | |
local opts="" | |
local CMD_EXEC="${COMP_WORDS[0]}" | |
if [[ ${cword} -eq 1 ]]; then | |
if [[ ${cur} == -* ]]; then | |
if [[ ${cur} == -c* ]]; then | |
compopt -o nospace | |
local CUR_DIR=${cur//-chdir=/} | |
opts="$(compgen -P "-chdir=" -d -- ${CUR_DIR})" | |
opts="${opts:--chdir=}" | |
else | |
opts="-chdir= -help -version" | |
fi | |
else | |
opts="$(_terraform_completion_get_opts ${CMD_EXEC})" | |
fi | |
elif [[ ${cword} -gt 1 ]]; then | |
if [[ ${cword} -eq 2 && ${prev} == -help ]]; then | |
opts="$(_terraform_completion_get_opts ${CMD_EXEC})" | |
else | |
if [[ "${NEW_OPT_TYPE}" != "" ]]; then | |
compopt -o nospace | |
else | |
local TF_COMMAND="${words[1]}" | |
opts="$(_terraform_completion_get_opts ${CMD_EXEC} ${TF_COMMAND})" | |
fi | |
fi | |
fi | |
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) | |
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then | |
if [[ "${COMPREPLY[0]}" =~ =$ ]]; then | |
compopt -o nospace | |
fi | |
fi | |
export COMP_WORDBREAKS="${O_COMP_WORDBREAKS}" | |
return 0 | |
} | |
#--- Initialize Bash Command Completion for multiple Terraform executables. | |
# It searches the PATH for files starting with "terraform", but does not | |
# contain "-" characters. This avoids adding Completion for third-party | |
# Terraform provider plugins that exist as a separate executable | |
# (terraform-provider-XXXX). | |
# | |
_init_terraform_completion () { | |
#-- Regex used when looking for terraform executables. | |
# Looks for "terraform", or "terraform[anything else that isn't a dash]". | |
# This enables Command Completion for multiple versions of Terraform, | |
# if you have them. | |
# | |
local TF_EXEC_PREFIX='^terrafor(m[^-]+|m)$' | |
local ORIG_DIR="${PWD}" | |
local IFS=':' | |
for P in ${PATH}; do | |
if [ -d "${P}" ]; then | |
cd "${P}" | |
else | |
continue | |
fi | |
for E in *; do | |
if [[ "${E}" =~ ${TF_EXEC_PREFIX} ]]; then | |
complete -F _terraform_completion ${E} | |
fi | |
done | |
done | |
cd "${ORIG_DIR}" | |
} | |
complete -F _terraform_completion terraform | |
#--- Optionally enable command completion for multiple Terraform executables. | |
# It currently works with executables in the PATH, that are named similar | |
# to "terraform_XXXX". | |
# | |
# ** If your files are named differently, then you may need to modify the REGEX | |
# ** in TF_EXEC_PREFIX to suit your needs. | |
# | |
# This provides a little simplicity, when working with multiple Terraform versions. | |
# | |
# Uncomment this line to enable: | |
# | |
_init_terraform_completion | |
#--- Remove the initialization function. It is only needed once. | |
unset -f _init_terraform_completion | |
#--- Include command completion for the optional "tf" command. | |
complete -F _terraform_completion tf |
Hi @jwhitcraft. I noticed this problem happening when trying to use autocomplete after the first "-xxxx" option. I just updated the gist with a working version.
I've also verified that using "tf" works. Just update the value of TF_EXEC_PREFIX to be TF_EXEC_PREFIX="^tf$".
Thanks! This is great!
Small nit: Typo on line 133.
It is onluy needed once.
should be It is only needed once.
There's an undefined function (_init_completion) at line 44. I've removed from my copy and seems to be fine.
Thanks for pointing it out @ProfMoo
@jwhitcraft Check out complete-alias. I've tested it with this gist, and I was able to get completion for an alias.
@bgmonroe Are you still experiencing this issue? What version of bash-completion is installed?
No, I've since switched over to zsh, so no longer use the above. Thanks for the follow-up though.
Thanks for this, the only problem that i noticed what that I alias tf to terraform and when when i add that the auto complete it fails when trying to finish the auto complete.
not a huge deal as i was able to get around since i don't use more than one version of terraform, but i thought I would let you know.