From 069869f1cf98e385485065f1f035c2f8dc0f90d6 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Wed, 18 Sep 2024 16:49:08 +0100 Subject: [PATCH] shell-completion/*/insmod: add bash/fish/zsh completion A few inline todos and some odd fish behaviour as mentioned inline. Otherwise things just work :-) v2: - use e(x)clusive answers for fish, tweak force string v3: - wire the completions to the autotools build v4: - use SPDX style copyright statements Signed-off-by: Emil Velikov Link: https://github.com/kmod-project/kmod/pull/138 Signed-off-by: Lucas De Marchi --- Makefile.am | 3 +++ meson.build | 1 + shell-completion/bash/insmod | 35 +++++++++++++++++++++++++++++++ shell-completion/fish/insmod.fish | 21 +++++++++++++++++++ shell-completion/zsh/_insmod | 14 +++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 shell-completion/bash/insmod create mode 100644 shell-completion/fish/insmod.fish create mode 100644 shell-completion/zsh/_insmod diff --git a/Makefile.am b/Makefile.am index 1c6faca6..213a1fe6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -125,17 +125,20 @@ noarch_pkgconfig_DATA = tools/kmod.pc bashcompletiondir=@bashcompletiondir@ dist_bashcompletion_DATA = \ + shell-completion/bash/insmod \ shell-completion/bash/kmod \ shell-completion/bash/lsmod \ shell-completion/bash/rmmod fishcompletiondir=@fishcompletiondir@ dist_fishcompletion_DATA = \ + shell-completion/fish/insmod.fish \ shell-completion/fish/lsmod.fish \ shell-completion/fish/rmmod.fish zshcompletiondir=@zshcompletiondir@ dist_zshcompletion_DATA = \ + shell-completion/zsh/_insmod \ shell-completion/zsh/_lsmod \ shell-completion/zsh/_rmmod diff --git a/meson.build b/meson.build index c85d9846..1c87fe0e 100644 --- a/meson.build +++ b/meson.build @@ -215,6 +215,7 @@ foreach tuple : _completiondirs endif _completions = [ + 'insmod', 'lsmod', 'rmmod', ] diff --git a/shell-completion/bash/insmod b/shell-completion/bash/insmod new file mode 100644 index 00000000..5741f336 --- /dev/null +++ b/shell-completion/bash/insmod @@ -0,0 +1,35 @@ +# insmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov +# +# Formatted using: +# shfmt --language-dialect bash --indent 4 --func-next-line + +_insmod() +{ + # long/short opt pairs + local -A opts=( + ['force']='f' + ['syslog']='s' + ['verbose']='v' + ['version']='V' + ['help']='h' + ) + + local cur="${COMP_WORDS[COMP_CWORD]}" + + if [[ $cur == --* ]]; then + COMPREPLY=($(compgen -P '--' -W "${!opts[*]}" -- "${cur:2}")) + elif [[ $cur == -* ]]; then + if (( ${#cur} != 2 )); then + COMPREPLY=($(compgen -P '--' -W "${!opts[*]}" -- "${cur:2}")) + fi + COMPREPLY+=($(compgen -P '-' -W "${opts[*]}" -- "${cur:1}")) + else + # TODO: match only one file + _filedir '@(ko?(.gz|.xz|.zst))' + # TODO: add module parameter completion, based of modinfo + fi +} && + complete -F _insmod insmod diff --git a/shell-completion/fish/insmod.fish b/shell-completion/fish/insmod.fish new file mode 100644 index 00000000..606ab5cb --- /dev/null +++ b/shell-completion/fish/insmod.fish @@ -0,0 +1,21 @@ +# insmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +# globally disable file completions +complete -c insmod -f + +complete -c insmod -s f -l force -d "DANGEROUS: forces a module load, may cause data corruption and crash your machine" +complete -c insmod -s s -l syslog -d 'print to syslog, not stderr' +complete -c insmod -s v -l verbose -d 'enables more messages' +complete -c insmod -s V -l version -d 'show version' +complete -c insmod -s h -l help -d 'show this help' + +# provide an exclusive (x) list of required (r) answers (a), keeping (k) the +# matches at the top. +# TODO: match only one file +# BUG: fish lists everything, even when only the given suffix is requested. Plus +# we need to explicitly keep them sorted. +complete -c insmod -x -ra "(__fish_complete_suffix .ko .ko.gz .ko.xz .ko.zst)" -k +# TODO: add module parameter completion, based of modinfo diff --git a/shell-completion/zsh/_insmod b/shell-completion/zsh/_insmod new file mode 100644 index 00000000..de2c7fff --- /dev/null +++ b/shell-completion/zsh/_insmod @@ -0,0 +1,14 @@ +#compdef insmod + +# insmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +_arguments \ + {-f,--force}'[DANGEROUS: forces a module load, may cause data corruption and crash your machine]' \ + {-s,--syslog}'[print to syslog, not stderr]' \ + {-v,--verbose}'[enables more messages]' \ + {-V,--version}'[show version]' \ + {-h,--help}'[show this help]' \ + '1::module:_files -g "*.ko(|.gz|.xz|.zst)"'