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..35dbdb5f --- /dev/null +++ b/shell-completion/bash/insmod @@ -0,0 +1,35 @@ +# insmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Copyright 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..726ed311 --- /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 +# +# Copyright 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..0f8d452f --- /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 +# +# Copyright 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)"'