diff options
| author | Philipp Hagemeister <phihag@phihag.de> | 2014-10-12 23:30:17 +0200 | 
|---|---|---|
| committer | Philipp Hagemeister <phihag@phihag.de> | 2014-10-12 23:30:17 +0200 | 
| commit | 72ebb5e4b4756a05f37ffcd0efaaf5c07ffc1fd1 (patch) | |
| tree | f01d47bd049172708d9d917b71d570fce13df482 | |
| parent | 8450c15c251f65f72d659bf56fae386e877ab66a (diff) | |
| parent | 24f7fb5e1e2fb1e70f553decf07d14892f87b419 (diff) | |
Merge remote-tracking branch 'xu-cheng/zsh-completion'
| -rw-r--r-- | Makefile | 20 | ||||
| -rw-r--r-- | devscripts/zsh-completion.in | 28 | ||||
| -rwxr-xr-x | devscripts/zsh-completion.py | 46 | 
3 files changed, 88 insertions, 6 deletions
@@ -1,7 +1,7 @@ -all: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.fish +all: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.zsh youtube-dl.fish  clean: -	rm -rf youtube-dl.1.temp.md youtube-dl.1 youtube-dl.bash-completion README.txt MANIFEST build/ dist/ .coverage cover/ youtube-dl.tar.gz youtube-dl.fish +	rm -rf youtube-dl.1.temp.md youtube-dl.1 youtube-dl.bash-completion README.txt MANIFEST build/ dist/ .coverage cover/ youtube-dl.tar.gz youtube-dl.zsh youtube-dl.fish  cleanall: clean  	rm -f youtube-dl youtube-dl.exe @@ -9,6 +9,7 @@ cleanall: clean  PREFIX ?= /usr/local  BINDIR ?= $(PREFIX)/bin  MANDIR ?= $(PREFIX)/man +SHAREDIR ?= $(PREFIX)/share  PYTHON ?= /usr/bin/env python  # set SYSCONFDIR to /etc if PREFIX=/usr or PREFIX=/usr/local @@ -22,13 +23,15 @@ else  	endif  endif -install: youtube-dl youtube-dl.1 youtube-dl.bash-completion +install: youtube-dl youtube-dl.1 youtube-dl.bash-completion youtube-dl.zsh youtube-dl.fish  	install -d $(DESTDIR)$(BINDIR)  	install -m 755 youtube-dl $(DESTDIR)$(BINDIR)  	install -d $(DESTDIR)$(MANDIR)/man1  	install -m 644 youtube-dl.1 $(DESTDIR)$(MANDIR)/man1  	install -d $(DESTDIR)$(SYSCONFDIR)/bash_completion.d  	install -m 644 youtube-dl.bash-completion $(DESTDIR)$(SYSCONFDIR)/bash_completion.d/youtube-dl +	install -d $(DESTDIR)$(SHAREDIR)/zsh/site-functions +	install -m 644 youtube-dl.zsh $(DESTDIR)$(SHAREDIR)/zsh/site-functions/_youtube-dl  	install -d $(DESTDIR)$(SYSCONFDIR)/fish/completions  	install -m 644 youtube-dl.fish $(DESTDIR)$(SYSCONFDIR)/fish/completions/youtube-dl.fish @@ -38,7 +41,7 @@ test:  tar: youtube-dl.tar.gz -.PHONY: all clean install test tar bash-completion pypi-files fish-completion +.PHONY: all clean install test tar bash-completion pypi-files zsh-completion fish-completion  pypi-files: youtube-dl.bash-completion README.txt youtube-dl.1 youtube-dl.fish @@ -66,12 +69,17 @@ youtube-dl.bash-completion: youtube_dl/*.py youtube_dl/*/*.py devscripts/bash-co  bash-completion: youtube-dl.bash-completion +youtube-dl.zsh: youtube_dl/*.py youtube_dl/*/*.py devscripts/zsh-completion.in +	python devscripts/zsh-completion.py + +zsh-completion: youtube-dl.zsh +  youtube-dl.fish: youtube_dl/*.py youtube_dl/*/*.py devscripts/fish-completion.in  	python devscripts/fish-completion.py  fish-completion: youtube-dl.fish -youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.fish +youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.zsh youtube-dl.fish  	@tar -czf youtube-dl.tar.gz --transform "s|^|youtube-dl/|" --owner 0 --group 0 \  		--exclude '*.DS_Store' \  		--exclude '*.kate-swp' \ @@ -86,5 +94,5 @@ youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-  		bin devscripts test youtube_dl docs \  		LICENSE README.md README.txt \  		Makefile MANIFEST.in youtube-dl.1 youtube-dl.bash-completion \ -		youtube-dl.fish setup.py \ +		youtube-dl.zsh youtube-dl.fish setup.py \  		youtube-dl diff --git a/devscripts/zsh-completion.in b/devscripts/zsh-completion.in new file mode 100644 index 000000000..b394a1ae7 --- /dev/null +++ b/devscripts/zsh-completion.in @@ -0,0 +1,28 @@ +#compdef youtube-dl + +__youtube_dl() { +    local curcontext="$curcontext" fileopts diropts cur prev +    typeset -A opt_args +    fileopts="{{fileopts}}" +    diropts="{{diropts}}" +    cur=$words[CURRENT] +    case $cur in +        :) +            _arguments '*: :(::ytfavorites ::ytrecommended ::ytsubscriptions ::ytwatchlater ::ythistory)' +        ;; +        *) +            prev=$words[CURRENT-1] +            if [[ ${prev} =~ ${fileopts} ]]; then +                _path_files +            elif [[ ${prev} =~ ${diropts} ]]; then +                _path_files -/ +            elif [[ ${prev} == "--recode-video" ]]; then +                _arguments '*: :(mp4 flv ogg webm mkv)' +            else +                _arguments '*: :({{flags}})' +            fi +        ;; +    esac +} + +__youtube_dl
\ No newline at end of file diff --git a/devscripts/zsh-completion.py b/devscripts/zsh-completion.py new file mode 100755 index 000000000..e8d71928a --- /dev/null +++ b/devscripts/zsh-completion.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +import os +from os.path import dirname as dirn +import sys + +sys.path.append(dirn(dirn((os.path.abspath(__file__))))) +import youtube_dl + +ZSH_COMPLETION_FILE = "youtube-dl.zsh" +ZSH_COMPLETION_TEMPLATE = "devscripts/zsh-completion.in" + + +def build_completion(opt_parser): +    opts = [opt for group in opt_parser.option_groups +            for opt in group.option_list] +    opts_file = [opt for opt in opts if opt.metavar == "FILE"] +    opts_dir = [opt for opt in opts if opt.metavar == "DIR"] + +    fileopts = [] +    for opt in opts_file: +        if opt._short_opts: +            fileopts.extend(opt._short_opts) +        if opt._long_opts: +            fileopts.extend(opt._long_opts) + +    diropts = [] +    for opt in opts_dir: +        if opt._short_opts: +            diropts.extend(opt._short_opts) +        if opt._long_opts: +            diropts.extend(opt._long_opts) + +    flags = [opt.get_opt_string() for opt in opts] + +    with open(ZSH_COMPLETION_TEMPLATE) as f: +        template = f.read() + +    template = template.replace("{{fileopts}}", "|".join(fileopts)) +    template = template.replace("{{diropts}}", "|".join(diropts)) +    template = template.replace("{{flags}}", " ".join(flags)) + +    with open(ZSH_COMPLETION_FILE, "w") as f: +        f.write(template) + +parser = youtube_dl.parseOpts()[0] +build_completion(parser)  | 
