diff --git a/Makefile.am b/Makefile.am index b5ff612c..1c6faca6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -126,15 +126,18 @@ noarch_pkgconfig_DATA = tools/kmod.pc bashcompletiondir=@bashcompletiondir@ dist_bashcompletion_DATA = \ shell-completion/bash/kmod \ - shell-completion/bash/lsmod + shell-completion/bash/lsmod \ + shell-completion/bash/rmmod fishcompletiondir=@fishcompletiondir@ dist_fishcompletion_DATA = \ - shell-completion/fish/lsmod.fish + shell-completion/fish/lsmod.fish \ + shell-completion/fish/rmmod.fish zshcompletiondir=@zshcompletiondir@ dist_zshcompletion_DATA = \ - shell-completion/zsh/_lsmod + shell-completion/zsh/_lsmod \ + shell-completion/zsh/_rmmod install-exec-hook: if BUILD_TOOLS diff --git a/meson.build b/meson.build index f45fb9bc..c85d9846 100644 --- a/meson.build +++ b/meson.build @@ -216,6 +216,7 @@ foreach tuple : _completiondirs _completions = [ 'lsmod', + 'rmmod', ] if completiondir != 'no' diff --git a/shell-completion/bash/rmmod b/shell-completion/bash/rmmod new file mode 100644 index 00000000..dc63955d --- /dev/null +++ b/shell-completion/bash/rmmod @@ -0,0 +1,34 @@ +# rmmod(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 + +_rmmod() +{ + # 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 + local -a modules=($(lsmod | cut -f1 -d' ')) + COMPREPLY=($(compgen -W "${modules[*]}" -- "${cur}")) + fi +} && + complete -F _rmmod rmmod diff --git a/shell-completion/fish/rmmod.fish b/shell-completion/fish/rmmod.fish new file mode 100644 index 00000000..94fb6d0c --- /dev/null +++ b/shell-completion/fish/rmmod.fish @@ -0,0 +1,16 @@ +# rmmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +# globally disable file completions +complete -c rmmod -f + +complete -c rmmod -s f -l force -d "DANGEROUS: forces a module unload and may crash your machine" +complete -c rmmod -s s -l syslog -d 'print to syslog, not stderr' +complete -c rmmod -s v -l verbose -d 'enables more messages' +complete -c rmmod -s V -l version -d 'show version' +complete -c rmmod -s h -l help -d 'show this help' + +# provide an exclusive (x) list of required (r) answers (a) +complete -c rmmod -x -ra "(lsmod | cut -f1 -d' ')" diff --git a/shell-completion/zsh/_rmmod b/shell-completion/zsh/_rmmod new file mode 100644 index 00000000..8582e767 --- /dev/null +++ b/shell-completion/zsh/_rmmod @@ -0,0 +1,21 @@ +#compdef rmmod + +# rmmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +(( $+functions[_rmmod_modules] )) || _rmmod_modules() +{ + local -a _modules + _modules=(${${(f)"$(_call_program modules lsmod)"}[2,-1]%% *}) + _values 'modules' "$_modules[@]" +} + +_arguments \ + {-f,--force}'[DANGEROUS: forces a module unload and may crash your machine]' \ + {-s,--syslog}'[print to syslog, not stderr]' \ + {-v,--verbose}'[enables more messages]' \ + {-V,--version}'[show version]' \ + {-h,--help}'[show this help]' \ + '*::modules:_rmmod_modules'