You are not logged in.
Hello everyone!
I would like to introduce my project, crazy-complete, which aims to make shell completion script generation a breeze. You can find it on GitHub.
Key Features
Simple configuration: The tool uses an easy-to-use YAML format
Multi shell support: The tool supports Bash, Fish and Zsh
Option types: All common option types are supported: long-options (--option), short-options (-o) and old-style-options (-option)
Argument types: Options with required arguments, with optional arguments and no arguments are supported
Mutually exclusive options: You can define groups of options that can't be used together
Repeatable options: You can control if an option may be repeated on commandline, or should appear only once
Positional arguments: You can easily define arguments for your program
Built-in completion types: The tool comes with these completions: file, directory, choices, value_list, range, signal, process, pid, command, user, group, service, variable, environment
Custom completions: If the built-ins aren't sufficient, there is the exec command to complete stuff based of a command's output
Conditional options/positionals: You can enable options and positionals based on conditions, like "is there an option present?" or "does an option have a specific value?"
Subommands: You can specify arbitrary levels of subcommands
Robust scripts: Unlike other generation tools, cracy-complete parses the whole commandline according to the specified options (instead of only looking at the last two args, for example)
Efficient scripts: Scripts were made with efficiency in mind. You pay only for what you use.
Well tested: There are over fifty tests per shell to ensure correct behaviour
Other Features
argparse Support: If your program is written in Python and uses the arparse-module, there is a chance that you can generate scripts (or YAML files) from the argparse.ArgumentParsers's definitions
Help text parser: If your program comes with a help text, there is a chance that you can generate YAML definition files by parsing it's output
If you're tired of maintaining completion scripts for different shells, crazy-complete may be for you.
Even if you decide against using generated scripts, the output of the tool may serve as an inspiration.
Let me know what you think. If you need support or have any questions or improvement-ideas, don't hesitate to ask!
(And if you like the tool, please give it a star on GitHub)
Finally, here is a short exmaple of a definition file:
# Fictional example of a program with subcommands.
prog: "net"
help: "Network utility program"
options:
- option_strings: ["-h", "--help"]
help: "show this help message and exit"
---
prog: "net configure"
aliases: ["setup"]
help: "Configure a network interface"
options:
- option_strings: ["--mode", "-m"]
metavar: "mode"
help: "Specify the mode for the interface"
complete: ["choices", {"static": "Use static IP mode", "dhcp": "Use DHCP mode"}]
- option_strings: ["--ip"]
metavar: "IP"
help: "Set IP address (for --mode=static)"
complete: ["none"]
# Only show this option if --mode=static, or -m static
when: "option_is --mode -m -- static"
positionals:
- number: 1
metavar: "interface"
help: "Specify interface"
# Complete files that are found in /sys/class/net
complete: ["file", {"directory": "/sys/class/net"}]
---
prog: "net monitor"
aliases: ["watch"]
help: "Monitor network"
options:
- option_strings: ["--protocol", "-p"]
help: "Specify which protocol to monitor"
# Use the first word of each line in /etc/protocols for argument completion
complete: ["exec", "grep -o -E '^\\w+' /etc/protocols"]
- option_strings: ["--verbose", "-v"]
multiple_option: true # can be specified multiple times
help: "Enable verbose mode"
group: "output_mode" # mutually exclusive to --quiet
- option_strings: ["--quiet", "-q"]
help: "Enable quiet mode"
group: "output_mode" # mutually exclusive to --verbose
Offline