package Complete::Fish; our $DATE = '2020-01-29'; # DATE our $VERSION = '0.060'; # VERSION use 5.010001; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw( format_completion ); require Complete::Bash; 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 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 Completion answer structure. Either an array or hash, as described in C. =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. =head1 SOURCE Source repository is at L. =head1 BUGS Please report any bugs or feature requests on the bugtracker website L 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 L Fish manual. =head1 AUTHOR perlancar =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