Modifying $COMP_WORDBREAKS in completion script is not the recommended as it is a global variable and the modification could affect the behavior of other completion scripts. As a workaround, this commit uses the _get_comp_words_by_ref which allows user to exclude characters out of $COMP_WORDBREAKS and reassemble input command line. However, as a side effect, the bash completion module cannot handle ':' and '=' correctly in the resulting completions. Thusly, we need to remove those completions. This will reduce the functionality of some fancy completions. For example, COLUMN?:KEY=VALUE will not complete on KEY and VALUE.
Signed-off-by: Alex Wang <al...@nicira.com> --- utilities/ovs-vsctl-bashcomp.bash | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/utilities/ovs-vsctl-bashcomp.bash b/utilities/ovs-vsctl-bashcomp.bash index e79c6a2..3db7165 100755 --- a/utilities/ovs-vsctl-bashcomp.bash +++ b/utilities/ovs-vsctl-bashcomp.bash @@ -36,7 +36,7 @@ _OVS_VSCTL_COMMANDS="$(_ovs_vsctl --commands)" # This doesn't complete on short arguments, so it filters them out. _OVS_VSCTL_OPTIONS="$(_ovs_vsctl --options | awk '/^--/ { print $0 }' \ - | sed -e 's/\(.*\)=ARG/\1=/')" + | sed -e 's/\(.*\)=ARG/\1/')" IFS=$SAVE_IFS declare -A _OVS_VSCTL_PARSED_ARGS @@ -358,7 +358,7 @@ _ovs_vsctl_complete_column_optkey_value () { $_OVSDB_SERVER_LOCATION Open_vSwitch $table) result=$(printf "%s\n" "${columns}" \ - | awk '/key.*value/ { print $1":"; next } + | awk '/key.*value/ { print $1; next } { print $1; next }' \ | _ovs_vsctl_check_startswith_string "$1" | sort | uniq) fi @@ -627,7 +627,7 @@ _ovs_vsctl_process_messages () { # status of the function _ovs_vsctl_complete_argument represents where # it has determined that the next argument will be. _ovs_vsctl_bashcomp () { - local cur valid_globals cmd_args raw_cmd cmd_pos valid_globals valid_opts + local words cword valid_globals cmd_args raw_cmd cmd_pos valid_globals valid_opts local test="false" # Does not support BASH_VERSION < 4.0 @@ -645,6 +645,12 @@ _ovs_vsctl_bashcomp () { <<< "$tmp" export COMP_WORDS export COMP_CWORD="$((${#COMP_WORDS[@]}-1))" + else + # If not in test mode, reassembles the COMP_WORDS and COMP_CWORD + # using just space as word break. + _get_comp_words_by_ref -n "\"'><=;|&(:" -w words -i cword + COMP_WORDS=( "${words[@]}") + COMP_CWORD=${cword} fi # Extract the conf.db path. @@ -661,13 +667,11 @@ _ovs_vsctl_bashcomp () { _OVS_VSCTL_PARSED_ARGS=() _OVS_VSCTL_NEW_RECORDS=() cmd_pos=-1 - cur=${COMP_WORDS[COMP_CWORD]} valid_globals=true valid_opts=true valid_commands=true given_opts="" index=1 - export COMP_WORDBREAKS=" " for word in "${COMP_WORDS[@]:1:${COMP_CWORD}} "; do _OVS_VSCTL_COMP_NOSPACE=false local completion @@ -750,7 +754,10 @@ _ovs_vsctl_bashcomp () { valid_commands=true given_opts="" fi - completion="$(sort -u <<< "$(tr ' ' '\n' <<< ${completion})")" + # colon, equal sign will mess up the completion output, just deletes + # any completion with those signs. + completion="$(sort -u <<< "$(tr ' ' '\n' <<< ${completion})" \ + | sed -e '/:/d; /=/d')" if [ $index -eq $COMP_CWORD ]; then if [ "$test" = "true" ]; then if [ "${_OVS_VSCTL_COMP_NOSPACE}" = "true" ]; then -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev