Created
March 8, 2017 08:46
-
-
Save bagage/aa0f558c027447f29cea6a78558a3cfc to your computer and use it in GitHub Desktop.
autocompletion zsh/bash linphone
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (C) 2012 Belledonne Comunications, Grenoble, France | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with this program; if not, write to the Free Software | |
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
# Created by Gautier Pelloux-Prayer on 2014/10/24. | |
# This script adds auto-completion for liblinphone_tester binary for Bash and | |
# Zsh. To use it, just type: `source liblinphone_completion`, then for each | |
# supported exectuable (see end of file), you will get auto-completions. | |
# To use it permanently, source this file in your .rc file (.bashrc or .zshrc). | |
_liblinphone_complete() { | |
local completions command_requiring_argument prev_arg latest_arg available_tasks has_not_set_suite suite_name | |
if [ -n "$BASH_VERSION" ]; then | |
set -- "${COMP_WORDS[@]}" #convert them to arguments (eg $1,$#,$@,etc.) | |
elif [ -n "$ZSH_VERSION" ]; then | |
local args | |
read -cA args #read list of arguments user entered | |
set -- "${args[@]}" #convert them to arguments (eg $1,$#,$@,etc.) | |
fi | |
#skip program name | |
program=$1 | |
shift | |
# if user required help, do not complete anything | |
if ! grep -q -- "--help" <<< "$@"; then | |
# retrieve the last argument | |
latest_arg="" | |
prev_arg="" | |
latest_is_empty=0 | |
for arg in "$@"; do | |
if [ ! -z "$arg" ]; then | |
prev_arg="$latest_arg" | |
latest_arg="$arg" | |
else | |
latest_is_empty=1 | |
fi | |
done | |
# get the tasks available, from --help | |
available_tasks="$($program 2>&1 --help | sed -nE "s/.*--([^ ]*).*/--\\1/p")" | |
# these commands expect an argument | |
command_requiring_argument="$($program 2>&1 --help | sed -nE "s/.*--(.*) <.*/--\\1/p")" | |
# remove all already provided tasks (it's useless to provide them twice) | |
if [[ ! -z "$@" ]]; then | |
current_tasks=$(echo $@ | grep -Eo -- "--([^ ])*" | tr '\n' '|' | sed 's/|/$|/g')--$ | |
if [ ! -z "$current_tasks" ]; then | |
available_tasks=$(echo "$available_tasks" | grep -vE -- "(${current_tasks})") | |
fi | |
fi | |
# remove --test option if --suite is not provided yet! | |
has_not_set_suite=$(grep -q -- "--suite" <<< "$@"; echo $?) | |
if [ $has_not_set_suite = 1 ]; then | |
available_tasks=$(echo "$available_tasks" | grep -v -- --test) | |
fi | |
# if latest arg does not start with '--', it is a custom value | |
if [ $latest_is_empty = 0 ] && ! grep -q -- '^--' <<< "$latest_arg"; then | |
if [ "$prev_arg" = "--test" ] && [ $has_not_set_suite = 0 ]; then | |
suite_name=$(echo $@ | sed -nE 's/.*--suite ([^(--)]*) (--.*)$/\1/p' |sed "s@\\\\@@g") | |
completions="$($program --list-tests $suite_name)" | |
elif [ "$prev_arg" = "--suite" ] || [ "$prev_arg" = "--list-tests" ]; then | |
completions="$($program --list-suites)" | |
fi | |
elif [ "$latest_arg" = "--test" ]; then | |
# list available tests if --suite was provided | |
if [ $has_not_set_suite = 0 ]; then | |
suite_name=$(echo $@ | sed -nE 's/.*--suite ([^(--)]*) (--.*)/\1/p' |sed "s@\\\\@@g") | |
completions="$($program --list-tests $suite_name)" | |
fi | |
elif [ "$latest_arg" = "--suite" ] || [ "$latest_arg" = "--list-tests" ]; then | |
completions="$($program --list-suites)" | |
# we are waiting for a custom value, so do not hint anything | |
elif [[ ! -z "$latest_arg" ]] && grep -q -- "^$latest_arg$" <<< "$command_requiring_argument"; then | |
completions="" | |
else | |
completions="$available_tasks" | |
fi | |
fi | |
if [ ! -z "$completions" ]; then | |
if [ -n "$BASH_VERSION" ]; then | |
IFS=$'\n' #if that even necessary? | |
COMPREPLY=($(compgen -W "${completions}" -- ${COMP_WORDS[COMP_CWORD]})) | |
elif [ -n "$ZSH_VERSION" ]; then | |
reply=( "${(ps:\n:)completions}" ) | |
fi | |
fi | |
} | |
for tester in liblinphone_tester mediastreamer2_tester belle_sip_tester pcap_playback \ | |
bench mediastream msaudiocmp mtudiscover videodisplay linphone lpc2xml_test \ | |
lp-gen-wrappers xml2lpc_test; do | |
if [ -n "$BASH_VERSION" ]; then | |
complete -F _liblinphone_complete $tester | |
elif [ -n "$ZSH_VERSION" ]; then | |
compctl -K _liblinphone_complete $tester | |
else | |
echo "Your shell might be not supported! Only bash and zsh tested." | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment