diff --git a/Makefile b/Makefile index 1ab7e06d781..10b10aec786 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ test: executable: scripts/pyinstaller.py -completion: data/completion/gallery-dl data/completion/_gallery-dl +completion: data/completion/gallery-dl data/completion/_gallery-dl data/completion/gallery-dl.fish man: data/man/gallery-dl.1 data/man/gallery-dl.conf.5 @@ -46,3 +46,6 @@ data/completion/gallery-dl: gallery_dl/option.py scripts/completion_bash.py data/completion/_gallery-dl: gallery_dl/option.py scripts/completion_zsh.py $(PYTHON) scripts/completion_zsh.py + +data/completion/gallery-dl.fish: gallery_dl/option.py scripts/completion_fish.py + $(PYTHON) scripts/completion_fish.py diff --git a/scripts/completion_fish.py b/scripts/completion_fish.py new file mode 100755 index 00000000000..86608510dc4 --- /dev/null +++ b/scripts/completion_fish.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. + +"""Generate fish completion script from gallery-dl's argument parser""" + +import util +from gallery_dl import option + + +TEMPLATE = """complete -c gallery-dl -x +%(opts)s +""" + +opts = [] +for action in option.build_parser()._actions: + if not action.option_strings: + continue + + opt = "complete -c gallery-dl" + + if action.metavar: + if action.metavar == "FILE": + opt += " -r -F" + elif action.metavar == "PATH": + opt += " -x -a '(__fish_complete_directories)'" + else: + opt += " -x" + + if len(action.option_strings) == 1: + opt += " -l '" + action.option_strings[0].replace("--", "", 1) + "'" + else: + opt += " -s '" + action.option_strings[0].replace( + "-", "", 1) + "' -l '" + action.option_strings[1].replace( + "--", "", 1) + "'" + + opt += " -d '" + action.help.replace("'", '"') + "'" + + opts.append(opt) + +PATH = util.path("data/completion/gallery-dl.fish") +with open(PATH, "w", encoding="utf-8") as file: + file.write(TEMPLATE % {"opts": "\n".join(opts)}) diff --git a/setup.py b/setup.py index 1a5c315fabe..bf1d92791de 100644 --- a/setup.py +++ b/setup.py @@ -35,6 +35,7 @@ def check_file(fname): for (path, files) in [ ("share/bash-completion/completions", ["data/completion/gallery-dl"]), ("share/zsh/site-functions" , ["data/completion/_gallery-dl"]), + ("share/fish/vendor_completions.d" , ["data/completion/gallery-dl.fish"]), ("share/man/man1" , ["data/man/gallery-dl.1"]), ("share/man/man5" , ["data/man/gallery-dl.conf.5"]), ]