TOOLS: add script for generating a zsh completion script

As discussed in #775
This commit is contained in:
Alessandro Ghedini 2014-06-08 15:52:20 +02:00 committed by wm4
parent 09dd1ed47c
commit da27eceb85
1 changed files with 129 additions and 0 deletions

129
TOOLS/zsh.pl Executable file
View File

@ -0,0 +1,129 @@
#!/usr/bin/perl
# Generate ZSH completion
use strict;
use warnings;
my $mpv = $ARGV[0] || 'mpv';
my @opts = parse_opts("$mpv --list-options", '^ (\-\-[^\s\*]*)\*?\s*(.*)');
my @ao = parse_opts("$mpv --ao=help", '^ ([^\s\:]*)\s*: (.*)');
my @vo = parse_opts("$mpv --vo=help", '^ ([^\s\:]*)\s*: (.*)');
my @af = parse_opts("$mpv --af=help", '^ ([^\s\:]*)\s*: (.*)');
my @vf = parse_opts("$mpv --vf=help", '^ ([^\s\:]*)\s*: (.*)');
my ($opts_str, $ao_str, $vo_str, $af_str, $vf_str);
$opts_str .= qq{ '$_': \\\n} foreach (@opts);
chomp $opts_str;
$ao_str .= qq{ '$_' \\\n} foreach (@ao);
chomp $ao_str;
$vo_str .= qq{ '$_' \\\n} foreach (@vo);
chomp $vo_str;
$af_str .= qq{ '$_' \\\n} foreach (@af);
chomp $af_str;
$vf_str .= qq{ '$_' \\\n} foreach (@vf);
chomp $vf_str;
my $tmpl = <<"EOS";
#compdef mpv
# mpv zsh completion
_x_arguments -C -s \\
$opts_str
'*:files:->mfiles'
case \$state in
ao)
local -a values
values=(
$ao_str
)
_describe -t values 'audio outputs' values
;;
vo)
local -a values
values=(
$vo_str
)
_describe -t values 'video outputs' values
;;
af)
local -a values
values=(
$af_str
)
_describe -t values 'audio filters' values
;;
vf)
local -a values
values=(
$vf_str
)
_describe -t values 'video filters' values
;;
mfiles)
_tags files urls
while _tags; do
_requested files expl 'media file' _files -g \\
"*.(#i)(asf|asx|avi|flac|flv|m1v|m2p|m2v|m4v|mjpg|mka|mkv|mov|mp3|mp4|mpe|mpeg|mpg|ogg|ogm|ogv|qt|rm|ts|vob|wav|webm|wma|wmv)(-.)" && ret=0
if _requested urls; then
while _next_label urls expl URL; do
_urls "\$expl[@]" && ret=0
compadd -S '' "\$expl[@]" \{dvd,vcd,cdda,cddb,tv\}:// && ret=0
done
fi
(( ret )) || return 0
done
;;
esac
EOS
print $tmpl;
sub parse_opts {
my ($cmd, $regex) = @_;
my @list;
my @lines = split /\n/, `$cmd`;
foreach my $line (@lines) {
if ($line !~ /^$regex/) {
next;
}
my $entry = "$1:";
if (defined $2) {
my $desc = $2;
$desc =~ s/\:/\\:/;
$entry .= $desc;
}
$entry .= ':->ao' if ($1 eq '--ao');
$entry .= ':->vo' if ($1 eq '--vo');
$entry .= ':->af' if ($1 eq '--af');
$entry .= ':->vf' if ($1 eq '--vf');
push @list, $entry if ($line =~ /^$regex/)
}
return @list;
}