Skip to content

Commit

Permalink
shell-completion/*/lsmod: add bash/fish/zsh completion
Browse files Browse the repository at this point in the history
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 <[email protected]>
Link: #138
Signed-off-by: Lucas De Marchi <[email protected]>
  • Loading branch information
evelikov authored and lucasdemarchi committed Sep 22, 2024
1 parent df6ef60 commit 257034a
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 11 deletions.
15 changes: 13 additions & 2 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down
16 changes: 16 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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-
#####################################################################
Expand Down
47 changes: 38 additions & 9 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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/@[email protected]'],
['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(
Expand Down
12 changes: 12 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
30 changes: 30 additions & 0 deletions shell-completion/bash/lsmod
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# lsmod(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# SPDX-FileCopyrightText: 2024 Emil Velikov <[email protected]>
#
# 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
12 changes: 12 additions & 0 deletions shell-completion/fish/lsmod.fish
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# lsmod(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# SPDX-FileCopyrightText: 2024 Emil Velikov <[email protected]>

# 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'
12 changes: 12 additions & 0 deletions shell-completion/zsh/_lsmod
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#compdef lsmod

# lsmod(8) completion -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# SPDX-FileCopyrightText: 2024 Emil Velikov <[email protected]>

_arguments \
{-s,--syslog}'[print to syslog, not stderr]' \
{-v,--verbose}'[enables more messages]' \
{-V,--version}'[show version]' \
{-h,--help}'[show this help]'

0 comments on commit 257034a

Please sign in to comment.