diff options
Diffstat (limited to '')
-rw-r--r-- | etc/mpv.bash-completion | 123 |
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 |