aboutsummaryrefslogtreecommitdiff
path: root/docs/pages/3-features/3-comp.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/pages/3-features/3-comp.md')
-rw-r--r--docs/pages/3-features/3-comp.md111
1 files changed, 111 insertions, 0 deletions
diff --git a/docs/pages/3-features/3-comp.md b/docs/pages/3-features/3-comp.md
index 1d436dd..a871d10 100644
--- a/docs/pages/3-features/3-comp.md
+++ b/docs/pages/3-features/3-comp.md
@@ -4,3 +4,114 @@
</p>
---
+
+## Enable Feature
+
+`comp` is the command-line completion feature provided by **Mingling**. Its approach is not static completion but rather dynamic completion by invoking your program itself.
+
+Enable this feature as follows:
+
+```toml
+[dependencies]
+mingling = {
+ version = "...",
+ features = ["comp"]
+}
+```
+
+## Setup
+
+Once `comp` is enabled, `gen_program!` will automatically generate a `CompletionDispatcher`, which is a command with the node `__comp`: the completion script will call this subcommand.
+
+Add this [Dispatcher](pages/2-basic/3-dispatcher) to your [Program](pages/2-basic/1-program):
+
+```rust
+fn main() {
+ let mut program = ThisProgram::new();
+ program.with_dispatcher(CompletionDispatcher);
+ program.exec();
+}
+```
+
+## Usage
+
+You can use the `completion!` macro to bind completion logic to your command entry point. The syntax is as follows:
+
+```rust
+// Define Dispatcher
+dispatcher!("test-comp",
+ TestCompletionCommand => TestCompletionEntry
+);
+
+// Establish completion logic, bound to `TestCompletionEntry`
+#[completion(TestCompletionEntry)]
+fn comp_test_comp_cmd(_ctx: &ShellContext) -> Suggest {
+ suggest!()
+}
+```
+
+You can obtain the context passed by the shell via `ShellContext` and return the generated suggestions:
+
+```rust
+#[completion(TestCompletionEntry)]
+fn comp_test_comp_cmd(ctx: &ShellContext) -> Suggest {
+ if ctx.current_word.starts_with("-") {
+ // Comp flags
+ return suggest!(
+ "--name": "Names",
+ "--age": "Age"
+ );
+ }
+
+ if ctx.previous_word == "--name" {
+ return suggest!("Bob", "Alice"); // Comp names
+ }
+
+ if ctx.previous_word == "--age" {
+ return suggest!(); // If typing age, suggest nothing
+ }
+
+ suggest!() // Comp nothing
+}
+```
+
+> 🎬 Logic
+>
+> When the user inputs `bin test-<TAB>`, it completes to `bin test-comp`.
+>
+> When the user inputs `bin test-comp -<TAB>`, it suggests `--age` / `--name`.
+>
+> When the user inputs `bin test-comp --name <TAB>`, it suggests `Bob` / `Alice`.
+>
+> In other cases, no suggestions are generated.
+
+## Generate Completion Script
+
+Any shell requires registering a relevant completion script to enable your command's completion capability. However, **Mingling** provides a related build script:
+
+Please add the following to `build-dependencies` in your `Cargo.toml`:
+
+```toml
+[build-dependencies]
+mingling = { version = "...", features = ["comp"] }
+```
+
+Next, call the following logic in your project's `build.rs`:
+
+```rust
+use mingling::build::build_comp_scripts;
+
+fn main() {
+ // Generate completion scripts for the current program
+ // build_comp_scripts().unwrap();
+
+ // Or specify a specific name
+ build_comp_scripts("your_cmd").unwrap();
+}
+```
+
+`build_comp_scripts` will generate the corresponding completion scripts based on your platform and output them to the `target` directory.
+
+> The completion script does not contain the actual completion logic;
+>
+> it is just a thin invocation layer.