From: Emil Velikov Date: Wed, 18 Sep 2024 15:49:08 +0000 (+0100) Subject: shell-completion/*/lsmod: add bash/fish/zsh completion X-Git-Tag: v34~307 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=257034a4e106ce628682b66e1f3128f64fcd3867;p=thirdparty%2Fkmod.git shell-completion/*/lsmod: add bash/fish/zsh completion Note that completions are explicitly aimed to be simple, depending on as little as possible shell specific helpers. The goal is that people unfamiliar with these can extend them with zero ramp-up. Doing things efficiently or "properly" is somewhat secondary. v2: - wire the completions to the autotools build v3: - 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 --- diff --git a/Makefile.am b/Makefile.am index 6bbe23d0..b5ff612c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -125,7 +125,16 @@ noarch_pkgconfig_DATA = tools/kmod.pc bashcompletiondir=@bashcompletiondir@ dist_bashcompletion_DATA = \ - shell-completion/bash/kmod + shell-completion/bash/kmod \ + shell-completion/bash/lsmod + +fishcompletiondir=@fishcompletiondir@ +dist_fishcompletion_DATA = \ + shell-completion/fish/lsmod.fish + +zshcompletiondir=@zshcompletiondir@ +dist_zshcompletion_DATA = \ + shell-completion/zsh/_lsmod install-exec-hook: if BUILD_TOOLS @@ -338,7 +347,9 @@ EXTRA_DIST += testsuite/rootfs-pristine AM_DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc --sysconfdir=/etc \ --with-zlib --with-zstd --with-xz --with-openssl \ - --with-bashcompletiondir=$$dc_install_base/$(bashcompletiondir) + --with-bashcompletiondir=$$dc_install_base/$(bashcompletiondir) \ + --with-fishcompletiondir=$$dc_install_base/$(fishcompletiondir) \ + --with-zshcompletiondir=$$dc_install_base/$(zshcompletiondir) distclean-local: $(DISTCLEAN_LOCAL_HOOKS) diff --git a/configure.ac b/configure.ac index c422cbb1..c204570d 100644 --- a/configure.ac +++ b/configure.ac @@ -163,6 +163,22 @@ AC_ARG_WITH([bashcompletiondir], ])]) AC_SUBST([bashcompletiondir], [$with_bashcompletiondir]) +AC_ARG_WITH([fishcompletiondir], + AS_HELP_STRING([--with-fishcompletiondir=DIR], [Fish completions directory]), + [], + [AS_IF([$($PKG_CONFIG --exists fish)], [ + with_fishcompletiondir=$($PKG_CONFIG --variable=completionsdir fish) + ] , [ + with_fishcompletiondir=${datadir}/fish/vendor_functions.d + ])]) +AC_SUBST([fishcompletiondir], [$with_fishcompletiondir]) + +AC_ARG_WITH([zshcompletiondir], + AS_HELP_STRING([--with-zshcompletiondir=DIR], [Zsh completions directory]), + [], + [with_zshcompletiondir=${datadir}/zsh/site-functions]) +AC_SUBST([zshcompletiondir], [$with_zshcompletiondir]) + ##################################################################### # --enable- ##################################################################### diff --git a/meson.build b/meson.build index b4b6c5cd..f45fb9bc 100644 --- a/meson.build +++ b/meson.build @@ -191,16 +191,45 @@ if moduledir == '' endif cdata.set_quoted('MODULE_DIRECTORY', moduledir) -bashcompletiondir = get_option('bashcompletiondir') -if bashcompletiondir == '' - bashcompletion = dependency('bash-completion', required : false) - if bashcompletion.found() - bashcompletiondir = bashcompletion.get_variable(pkgconfig : 'completionsdir') - else - bashcompletiondir = join_paths(get_option('prefix'), get_option('datadir'), - 'bash-completion/completions') +_completiondirs = [ + ['bashcompletiondir', 'bash-completion', 'bash-completion/completions', 'shell-completion/bash/@0@'], + ['fishcompletiondir', 'fish', 'fish/vendor_functions.d', 'shell-completion/fish/@0@.fish'], + ['zshcompletiondir', '', 'zsh/site-functions', 'shell-completion/zsh/_@0@'], +] + +foreach tuple : _completiondirs + dir_option = tuple[0] + pkg_dep = tuple[1] + def_path = tuple[2] + ins_path = tuple[3] + + completiondir = get_option(dir_option) + if completiondir == '' + completion = dependency(pkg_dep, required : false) + if completion.found() + completiondir = completion.get_variable(pkgconfig : 'completionsdir') + else + completiondir = join_paths(get_option('prefix'), get_option('datadir'), + def_path) + endif endif -endif + + _completions = [ + 'lsmod', + ] + + if completiondir != 'no' + foreach comp : _completions + install_data( + files(ins_path.format(comp)), + install_dir : completiondir, + ) + endforeach + endif + + # NEEDED solely for bash/kmod below + set_variable(dir_option, completiondir) +endforeach if bashcompletiondir != 'no' install_data( diff --git a/meson_options.txt b/meson_options.txt index 62d97ceb..4a25fb0e 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -18,6 +18,18 @@ option( description : 'Bash completions directory. Use "no" to disable.', ) +option( + 'fishcompletiondir', + type : 'string', + description : 'Fish completions directory. Use "no" to disable.', +) + +option( + 'zshcompletiondir', + type : 'string', + description : 'Zsh completions directory. Use "no" to disable.', +) + # Compression options option( 'zstd', diff --git a/shell-completion/bash/lsmod b/shell-completion/bash/lsmod new file mode 100644 index 00000000..09d516ef --- /dev/null +++ b/shell-completion/bash/lsmod @@ -0,0 +1,30 @@ +# lsmod(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 + +_lsmod() +{ + # long/short opt pairs + local -A opts=( + ['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}")) + fi +} && + complete -F _lsmod lsmod diff --git a/shell-completion/fish/lsmod.fish b/shell-completion/fish/lsmod.fish new file mode 100644 index 00000000..de0e0716 --- /dev/null +++ b/shell-completion/fish/lsmod.fish @@ -0,0 +1,12 @@ +# lsmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +# globally disable file completions +complete -c lsmod -f + +complete -c lsmod -s s -l syslog -d 'print to syslog, not stderr' +complete -c lsmod -s v -l verbose -d 'enables more messages' +complete -c lsmod -s V -l version -d 'show version' +complete -c lsmod -s h -l help -d 'show this help' diff --git a/shell-completion/zsh/_lsmod b/shell-completion/zsh/_lsmod new file mode 100644 index 00000000..5a050384 --- /dev/null +++ b/shell-completion/zsh/_lsmod @@ -0,0 +1,12 @@ +#compdef lsmod + +# lsmod(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# SPDX-FileCopyrightText: 2024 Emil Velikov + +_arguments \ + {-s,--syslog}'[print to syslog, not stderr]' \ + {-v,--verbose}'[enables more messages]' \ + {-V,--version}'[show version]' \ + {-h,--help}'[show this help]'