summaryrefslogtreecommitdiffstats
path: root/etc/mpv.bash-completion
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--etc/mpv.bash-completion123
1 files changed, 123 insertions, 0 deletions
diff --git a/etc/mpv.bash-completion b/etc/mpv.bash-completion
new file mode 100644
index 0000000..d5d504a
--- /dev/null
+++ b/etc/mpv.bash-completion
@@ -0,0 +1,123 @@
+#!/bin/bash
+
+#
+# This file is part of mpv.
+#
+# mpv 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 License, or (at your option) any later version.
+#
+# mpv 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 mpv. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# Cache all the mpv options
+_mpv_options=$(mpv --no-config --list-options)
+
+_mpv_get_args()
+{
+ local doc=$(echo "$_mpv_options" | grep -E "^\\s*$1\\s")
+ local partial="$2"
+ local type=$(echo "$doc" | awk '{print $2;}')
+
+ # We special-case profiles to ensure we read the config
+ if [ "$1" = "--show-profile" ]; then
+ type="ShowProfile"
+ elif [ "$1" = "--profile" ]; then
+ type="Profile"
+ fi
+
+ declare -a candidates
+ case $type in
+ String)
+ if echo "$doc" | grep -q '\[file\]' ; then
+ if [ "$cur" = '=' ]; then
+ # Without this, _filedir will try and complete files starting with '='
+ cur=""
+ fi
+ _filedir 2>/dev/null || COMPREPLY=($(compgen -f))
+ return 0
+ else
+ candidates=($(mpv --no-config $1=help | grep -v ':' | awk '{print $1;}'))
+ candidates+=("help")
+ fi
+ ;;
+ Flag)
+ candidates=("yes" "no" "help")
+ ;;
+ Choices:|Object)
+ candidates=($(mpv --no-config $1=help | grep -v ':' | awk '{print $1;}'))
+ candidates+=("help")
+ ;;
+ Image)
+ candidates=($(mpv --no-config $1=help))
+ candidates=("${candidates[@]:2}")
+ candidates+=("help")
+ ;;
+ Profile)
+ candidates=($(mpv $1=help | grep -v ':' | awk '{print $1;}'))
+ candidates+=("help")
+ ;;
+ ShowProfile)
+ candidates=($(mpv $1= | grep -v ':' | awk '{print $1;}'))
+ ;;
+ *)
+ # There are other categories; some of which we could do something smarter
+ # about, with enough work.
+ ;;
+ esac
+ COMPREPLY=($(compgen -W "${candidates[*]}" -- "${partial}"))
+ if [ ${#COMPREPLY[@]} -gt 1 ]; then
+ compopt -o nospace mpv
+ fi
+}
+
+# This regex detects special options where we don't want an '=' appended
+_mpv_special_regex='\s(Flag.*\[not in config files\]|Print)'
+_mpv_skip_regex='\sremoved \[deprecated\]'
+_mpv_regular_options=($(echo "$_mpv_options" | grep -vE "$_mpv_skip_regex" | \
+ grep -vE "$_mpv_special_regex" | awk '{print "\\"$1;}' | grep '\--'))
+_mpv_special_options=($(echo "$_mpv_options" | grep -vE "$_mpv_skip_regex" | \
+ grep -E "$_mpv_special_regex" | awk '{print "\\"$1;}' | grep '\--'))
+
+_mpv()
+{
+ compopt +o nospace mpv
+
+ # _filedir requires the current candidate be in $cur
+ local cur=${COMP_WORDS[COMP_CWORD]}
+ local prev=${COMP_WORDS[((COMP_CWORD - 1))]}
+
+ if [ "$cur" = '=' ]; then
+ # If the current word is '=' then we are looking for an argument for the
+ # option specified by the previous word.
+ _mpv_get_args "$prev"
+ elif [ "$prev" = '=' ]; then
+ # If the previous word is '=' then we are completing an argument for the
+ # option specified by the word before the '='.
+ local prevprev=${COMP_WORDS[((COMP_CWORD - 2))]}
+ _mpv_get_args "$prevprev" "$cur"
+ else
+ case $cur in
+ -*)
+ COMPREPLY=($(compgen -W "${_mpv_regular_options[*]}" -S '=' -- "${cur}"))
+ local normal_count=${#COMPREPLY[@]}
+ COMPREPLY+=($(compgen -W "${_mpv_special_options[*]}" -- "${cur}"))
+ if [ $normal_count -gt 0 -o ${#COMPREPLY[@]} -gt 1 ]; then
+ compopt -o nospace mpv
+ fi
+ ;;
+ *)
+ _filedir 2>/dev/null || COMPREPLY=($(compgen -f))
+ ;;
+ esac
+ fi
+}
+
+complete -F _mpv mpv