aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md5
-rw-r--r--Cargo.toml4
-rw-r--r--README.md14
-rw-r--r--var/shell-complete.rs59
4 files changed, 82 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7e40ca2..13944e1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+Unreleased
+----------
+- Added bash completion support via `shell-complete` utility program
+
+
0.3.2
-----
- Added the `list` command that lists all attached Nitrokey devices
diff --git a/Cargo.toml b/Cargo.toml
index 2a05d6a..627ee63 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -36,6 +36,10 @@ exclude = ["ci/*", "rustfmt.toml"]
[badges]
gitlab = { repository = "d-e-s-o/nitrocli", branch = "master" }
+[[bin]]
+name = "shell-complete"
+path = "var/shell-complete.rs"
+
[profile.release]
opt-level = "z"
lto = true
diff --git a/README.md b/README.md
index f32b227..3206f4e 100644
--- a/README.md
+++ b/README.md
@@ -112,6 +112,20 @@ It is recommended that the resulting executable be installed in a
directory accessible via the `PATH` environment variable.
+#### Bash Completion
+**nitrocli** comes with Bash completion support for options and
+arguments to them. A completion script can be generated via the
+`shell-complete` utility program and then only needs to be sourced to
+make the current shell provide context-sensitive tab completion support.
+```bash
+$ cargo run --bin=shell-complete > nitrocli.bash
+$ source nitrocli.bash
+```
+
+The generated completion script can be installed system-wide as usual
+and sourced through Bash initialization files, such as `~/.bashrc`.
+
+
Known Problems
--------------
diff --git a/var/shell-complete.rs b/var/shell-complete.rs
new file mode 100644
index 0000000..0a525d8
--- /dev/null
+++ b/var/shell-complete.rs
@@ -0,0 +1,59 @@
+// shell-complete.rs
+
+// *************************************************************************
+// * Copyright (C) 2020 Daniel Mueller (deso@posteo.net) *
+// * *
+// * This program is free software: you can redistribute it and/or modify *
+// * it under the terms of the GNU General Public License as published by *
+// * the Free Software Foundation, either version 3 of the License, or *
+// * (at your option) any later version. *
+// * *
+// * This program 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 General Public License for more details. *
+// * *
+// * You should have received a copy of the GNU General Public License *
+// * along with this program. If not, see <http://www.gnu.org/licenses/>. *
+// *************************************************************************
+
+use std::io;
+
+use structopt::clap;
+use structopt::StructOpt as _;
+
+#[allow(unused)]
+mod nitrocli {
+ include!("../src/arg_util.rs");
+
+ // We only need a stripped down version of the `Command` macro.
+ macro_rules! Command {
+ ( $name:ident, [ $( $(#[$doc:meta])* $var:ident$(($inner:ty))? => $exec:expr, ) *] ) => {
+ #[derive(Debug, PartialEq, structopt::StructOpt)]
+ pub enum $name {
+ $(
+ $(#[$doc])*
+ $var$(($inner))?,
+ )*
+ }
+ };
+ }
+
+ include!("../src/arg_defs.rs");
+}
+
+/// Generate a bash completion script for nitrocli.
+///
+/// The script will be emitted to standard output.
+#[derive(Debug, structopt::StructOpt)]
+pub struct Args {
+ /// The command for which to generate the bash completion script.
+ #[structopt(default_value = "nitrocli")]
+ pub command: String,
+}
+
+fn main() {
+ let args = Args::from_args();
+ let mut app = nitrocli::Args::clap();
+ app.gen_completions_to(&args.command, clap::Shell::Bash, &mut io::stdout());
+}