From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

our $DATE = '2020-01-29'; # DATE
our $VERSION = '0.060'; # VERSION
use 5.010001;
use strict;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
format_completion
);
our %SPEC;
$SPEC{':package'} = {
v => 1.1,
summary => 'Completion module for fish shell',
};
$SPEC{format_completion} = {
v => 1.1,
summary => 'Format completion for output (for shell)',
description => <<'_',
fish accepts completion reply in the form of one entry per line to STDOUT.
Description can be added to each entry, prefixed by tab character.
_
args_as => 'array',
args => {
completion => {
summary => 'Completion answer structure',
description => <<'_',
Either an array or hash, as described in `Complete`.
_
schema=>['any*' => of => ['hash*', 'array*']],
req=>1,
pos=>0,
},
},
result => {
summary => 'Formatted string (or array, if `as` key is set to `array`)',
schema => ['any*' => of => ['str*', 'array*']],
},
result_naked => 1,
};
sub format_completion {
my $comp = shift;
my $as;
my $entries;
# we currently use Complete::Bash's rule because i haven't done a read up on
# how exactly fish escaping rules are.
if (ref $comp eq 'HASH') {
$as = $comp->{as} // 'string';
$entries = Complete::Bash::format_completion({%$comp}, {as=>'array'});
} else {
$as = 'string';
$entries = Complete::Bash::format_completion({words=>$comp}, {as=>'array'});
}
# insert description
{
my $compary = ref($comp) eq 'HASH' ? $comp->{words} : $comp;
for (my $i=0; $i<@$compary; $i++) {
my $desc = (ref($compary->[$i]) eq 'HASH' ?
$compary->[$i]{description} : '' ) // '';
$desc =~ s/\R/ /g;
$entries->[$i] .= "\t$desc";
}
}
# turn back to string if that's what the user wants
if ($as eq 'string') {
$entries = join("", map{"$_\n"} @$entries);
}
$entries;
}
1;
# ABSTRACT: Completion module for fish shell
__END__
=pod
=encoding UTF-8
=head1 NAME
Complete::Fish - Completion module for fish shell
=head1 VERSION
This document describes version 0.060 of Complete::Fish (from Perl distribution Complete-Fish), released on 2020-01-29.
=head1 DESCRIPTION
fish allows completion of option arguments to come from an external command,
e.g.:
% complete -c deluser -l user -d Username -a "(cat /etc/passwd|cut -d : -f 1)"
The command is supposed to return completion entries one in a separate line.
Description for each entry can be added, prefixed with a tab character. The
provided function C<format_completion()> accept a completion answer structure
and format it for fish. Example:
format_completion(["a", "b", {word=>"c", description=>"Another letter"}])
will result in:
a
b
c Another letter
=head1 FUNCTIONS
=head2 format_completion
Usage:
format_completion($completion) -> str|array
Format completion for output (for shell).
fish accepts completion reply in the form of one entry per line to STDOUT.
Description can be added to each entry, prefixed by tab character.
This function is not exported by default, but exportable.
Arguments ('*' denotes required arguments):
=over 4
=item * B<$completion>* => I<hash|array>
Completion answer structure.
Either an array or hash, as described in C<Complete>.
=back
Return value: Formatted string (or array, if `as` key is set to `array`) (str|array)
=head1 HOMEPAGE
Please visit the project's homepage at L<https://metacpan.org/release/Complete-Fish>.
=head1 SOURCE
=head1 BUGS
Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Complete-Fish>
When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.
=head1 SEE ALSO
L<Complete>
L<Complete::Bash>
Fish manual.
=head1 AUTHOR
perlancar <perlancar@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2020, 2016, 2015, 2014 by perlancar@cpan.org.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut