Add nushell completion support (#2009)

* Add nushell completion support

Adds `clap_complete_nushell` crate and implements it into the `niri
completions` command.

* Add nushell to flake.nix autocompletions

* Convert to `TryFrom`

* Fix linting errors

* Move types down

---------

Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
This commit is contained in:
Artrix
2025-07-13 23:29:26 -07:00
committed by GitHub
parent 51b6a495c5
commit 746a7e81b7
5 changed files with 61 additions and 3 deletions
Generated
+11
View File
@@ -643,6 +643,16 @@ dependencies = [
"clap",
]
[[package]]
name = "clap_complete_nushell"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a0c951694691e65bf9d421d597d68416c22de9632e884c28412cb8cd8b73dce"
dependencies = [
"clap",
"clap_complete",
]
[[package]]
name = "clap_derive"
version = "4.5.41"
@@ -2267,6 +2277,7 @@ dependencies = [
"calloop-wayland-source 0.4.0",
"clap",
"clap_complete",
"clap_complete_nushell",
"directories",
"drm-ffi",
"fastrand",
+1
View File
@@ -60,6 +60,7 @@ bytemuck = { version = "1.23.1", features = ["derive"] }
calloop = { version = "0.14.2", features = ["executor", "futures-io"] }
clap = { workspace = true, features = ["string"] }
clap_complete = "4.5.55"
clap_complete_nushell = "4.5.8"
directories = "6.0.0"
drm-ffi = "0.9.0"
fastrand = "2.3.0"
+1
View File
@@ -122,6 +122,7 @@
installShellCompletion --cmd niri \
--bash <($out/bin/niri completions bash) \
--fish <($out/bin/niri completions fish) \
--nushell <($out/bin/niri completions nushell) \
--zsh <($out/bin/niri completions zsh)
install -Dm644 resources/niri.desktop -t $out/share/wayland-sessions
+26 -1
View File
@@ -56,7 +56,7 @@ pub enum Sub {
/// Cause a panic to check if the backtraces are good.
Panic,
/// Generate shell completions.
Completions { shell: Shell },
Completions { shell: CompletionShell },
}
#[derive(Subcommand)]
@@ -108,3 +108,28 @@ pub enum Msg {
/// Print the overview state.
OverviewState,
}
#[derive(Clone, Debug, clap::ValueEnum)]
pub enum CompletionShell {
Bash,
Elvish,
Fish,
PowerShell,
Zsh,
Nushell,
}
impl TryFrom<CompletionShell> for Shell {
type Error = &'static str;
fn try_from(shell: CompletionShell) -> Result<Self, Self::Error> {
match shell {
CompletionShell::Bash => Ok(Shell::Bash),
CompletionShell::Elvish => Ok(Shell::Elvish),
CompletionShell::Fish => Ok(Shell::Fish),
CompletionShell::PowerShell => Ok(Shell::PowerShell),
CompletionShell::Zsh => Ok(Shell::Zsh),
CompletionShell::Nushell => Err("Nushell should be handled separately"),
}
}
}
+22 -2
View File
@@ -10,8 +10,10 @@ use std::process::Command;
use std::{env, mem};
use clap::{CommandFactory, Parser};
use clap_complete::Shell;
use clap_complete_nushell::Nushell;
use directories::ProjectDirs;
use niri::cli::{Cli, Sub};
use niri::cli::{Cli, CompletionShell, Sub};
#[cfg(feature = "dbus")]
use niri::dbus;
use niri::ipc::client::handle_msg;
@@ -108,7 +110,25 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}
Sub::Panic => cause_panic(),
Sub::Completions { shell } => {
clap_complete::generate(shell, &mut Cli::command(), "niri", &mut io::stdout());
match shell {
CompletionShell::Nushell => {
clap_complete::generate(
Nushell,
&mut Cli::command(),
"niri",
&mut io::stdout(),
);
}
other => {
let generator = Shell::try_from(other).unwrap();
clap_complete::generate(
generator,
&mut Cli::command(),
"niri",
&mut io::stdout(),
);
}
}
return Ok(());
}
}