aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2015-03-20 05:44:34 +0100
committerGuilhem Moulin <guilhem@fripost.org>2015-03-20 05:50:30 +0100
commit5331739895d6af6a05f9fb50b16874385c820be4 (patch)
tree1a706c65320257b87d16169e8b51b207aab1ce2a
parentf5a93532349379425d4e3f7669ab4ac9b08052bc (diff)
Bash completion module.
-rw-r--r--bash-completion.sh79
-rwxr-xr-xicevault7
2 files changed, 86 insertions, 0 deletions
diff --git a/bash-completion.sh b/bash-completion.sh
new file mode 100644
index 0000000..e7f0577
--- /dev/null
+++ b/bash-completion.sh
@@ -0,0 +1,79 @@
+# Bash completion support for icevault(1)
+# Copyright © 2015 Guilhem Moulin <guilhem@fripost.org>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+
+_icevault() {
+ local cur prev words cword
+ _init_completion -n := || return
+
+ COMPREPLY=()
+ declare -a files
+ local opts="--debug -h --help -p --show-passwords -s --socket= --version"
+ local args="fill insert dump clip edit ls"
+
+ local OPTIND IFS
+ # find out if our $cur is an optional argument or a command
+ for (( OPTIND = 1; OPTIND < cword; OPTIND++ )); do
+ case "${words[OPTIND]}" in
+ -s) (( OPTIND++ ));;
+ --) break;;
+ -*) ;;
+ *) break;;
+ esac
+ done
+
+ local p
+ # list sockets (and dirs) only
+ if { [ $OPTIND -eq $(( $cword + 1)) ] && [ "$prev" = -s ]; } ||
+ { [ $OPTIND -eq $cword ] && [[ "$cur" =~ ^--socket= ]]; }; then
+ { [ $OPTIND -eq $cword ] && [[ "$cur" =~ ^--socket= ]]; } && cur="${cur#--socket=}"
+ _filedir
+ files=( "${COMPREPLY[@]}" )
+ COMPREPLY=()
+ for p in "${files[@]}"; do
+ [ -d "$p" -o -S "$p" ] && COMPREPLY+=( "$p" )
+ done
+ return
+ fi
+
+ # complete options and commands
+ if [ $OPTIND -eq $cword -a "$cur" ]; then
+ COMPREPLY+=( $(compgen -W "$opts $args" -- "$cur") )
+ [ "${#COMPREPLY[@]}" -eq 1 -a "${COMPREPLY[0]}" = --socket= ] && compopt -o nospace
+ fi
+ [ $(($OPTIND + 1)) -lt $cword ] && return
+
+ local colon_word= # see __ltrim_colon_completions
+ if [ -z "$cur" -a $OPTIND -eq $cword ] ||
+ [ -z "$cur" -a $(($OPTIND + 1)) -eq $cword -a "${words[OPTIND]}" = fill ]; then
+ cur="$(./icevault _geturi)"/ # get URI from webpage
+ else
+ cur=$(dequote "$cur")
+ colon_word=${cur%"${cur##*[:=]}"} # trim words with : or = in COMP_WORDBREAKS
+ fi
+
+ local uri
+ if [ $OPTIND -eq $cword ] || ! [[ "${words[OPTIND]}" =~ :// ]]; then
+ compopt -o filenames -o noquote
+ while read -r -d $'\0' uri; do
+ # quote manually (so we don't quote the : and =)
+ uri=$( echo "${uri#$colon_word}" | sed "s/[][\\{}*?~<>;'\"|&()\!$\` \t]/\\\\&/g" )
+ COMPREPLY+=( "$uri" )
+ done < <(./icevault -0 _complete "$cur")
+ [ "${#COMPREPLY[@]}" -eq 1 -a "${COMPREPLY[0]: -1:1}" = / ] && compopt -o nospace
+ return 0
+ fi
+}
+complete -F _icevault icevault
diff --git a/icevault b/icevault
index 7127c23..45be1e0 100755
--- a/icevault
+++ b/icevault
@@ -552,6 +552,13 @@ if ($command eq '_complete') {
exit;
}
+elsif ($command eq '_geturi') {
+ # used internaly for auto-completion
+ usage(1) if @ARGV;
+ print $LOCALE->encode( &connect($CONFIG{socket}) ), "\n";
+ sendCommand 'QUIT';
+ exit;
+}
elsif ($command eq 'insert') {
usage(1) unless $#ARGV < 1;
my $uri = &connect($CONFIG{socket});