glib/gio/completion/gio
Ondrej Holy b3bf1e263e gio: Always include mounts in the results
Mounts are currently completed only if the prefix looks like scheme,
however, this doesn't work well if the mounts have also path component.
Let's always include them to fix this issue. The mounts are cached by the
volume monitors, so it should not significantly affect the performance.
2019-10-07 09:21:19 +02:00

120 lines
3.7 KiB
Plaintext

#
# Copyright (C) 2018 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of the
# licence, or (at your option) any later version.
#
# This 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 Lesser General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Check for bash
[ -z "$BASH_VERSION" ] && return
####################################################################################################
# Check whether the suggestions have common prefix (i.e. suggestions won't be
# shown and prefix will be completed first)
__has_common_prefix() {
for (( i = 1; i < ${#COMPREPLY[@]}; i++ )); do
if [[ "${COMPREPLY[i-1]:${#cur}:1}" != "${COMPREPLY[i]:${#cur}:1}" ]]; then
return 1 # False
fi
done
return 0 # True
}
# Complete file location
__gio_location() {
# Prevent breaking on colons, we have to work with uris
local cur
_get_comp_words_by_ref -n : cur
# Resolve dirname for dir listing
local dir=""
if [[ $cur =~ "/"$ ]]; then
dir="$cur"
elif [[ $cur =~ "/" ]]; then
# Subtract basename because dirname cmd doesn't work well with schemes
dir=${cur%$(basename "$cur")}
fi
# List volumes and mounts
local mounts=( )
while IFS=$'\n' read mount; do
# Do not care about local mounts
[[ "$mount" =~ ^"file:" ]] && continue
# Use only matching mounts
[[ "$mount" =~ ^"$cur" && "$mount" != "$cur" ]] && mounts+=("$mount")
done < <(gio mount -li | sed -n -r 's/^ *(default_location|activation_root)=(.*)$/\2/p' | sort -u)
# Workaround to unescape dir name (e.g. "\ " -> " ")
declare -a tmp="( ${dir} )"
unescaped_dir="${tmp[0]}"
# List files
local files=()
local names=()
while IFS=$'\t' read name size type; do
# Escape name properly
local escaped_name="$(printf "%q" "$name")"
# Append slash for directories and space for files
if [[ "$type" == "(directory)" ]]; then
escaped_name="$escaped_name/"
else
escaped_name="$escaped_name "
fi
path="$dir$escaped_name"
# Use only matching paths
if [[ "$path" =~ ^"$cur" ]]; then
files+=("$path")
names+=("$escaped_name")
fi
done < <(gio list -hl "$unescaped_dir" 2> /dev/null)
COMPREPLY=("${files[@]}" "${mounts[@]}")
# Workaround to show suggestions as basenames only
if ! __has_common_prefix; then
COMPREPLY=("${mounts[@]} ${names[@]}")
# Workaround to prevent overwritting suggestions, it adds empty
# suggestion, otherwise names with colons will be corrupted
COMPREPLY+=(" ")
return 0
fi
# Workaround to complete names with colons, it removes colon prefix from
# COMPREPLY
__ltrim_colon_completions "$cur"
}
__gio() {
# Complete subcommands
if (( ${COMP_CWORD} == 1 )); then
COMPREPLY=($(compgen -W "help version cat copy info list mime mkdir monitor mount move open rename remove save set trash tree" -- "${COMP_WORDS[1]}"))
compopt +o nospace
return 0
fi
# Complete file locations
__gio_location
}
####################################################################################################
complete -o nospace -F __gio gio