Complete-Bash
view release on metacpan or search on metacpan
lib/Complete/Bash.pm view on Meta::CPAN
package Complete::Bash;
use 5.010001;
use strict;
use warnings;
use Log::ger;
use Exporter 'import';
our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
our $DATE = '2022-09-08'; # DATE
our $DIST = 'Complete-Bash'; # DIST
our $VERSION = '0.337'; # VERSION
our @EXPORT_OK = qw(
point
parse_cmdline
join_wordbreak_words
format_completion
);
our %SPEC;
$SPEC{':package'} = {
v => 1.1,
summary => 'Completion routines for bash shell',
};
sub _expand_tilde {
my ($user, $slash) = @_;
my @ent;
if (length $user) {
@ent = getpwnam($user);
} else {
@ent = getpwuid($>);
$user = $ent[0];
}
return $ent[7] . $slash if @ent;
"~$user$slash"; # return as-is when failed
}
sub _add_unquoted {
no warnings 'uninitialized';
my ($word, $is_cur_word, $after_ws) = @_;
#say "D:add_unquoted word=$word is_cur_word=$is_cur_word after_ws=$after_ws";
$word =~ s!^(~)(\w*)(/|\z) | # 1) tilde 2) username 3) optional slash
\\(.) | # 4) escaped char
\$(\w+) # 5) variable name
!
$1 ? (not($after_ws) || $is_cur_word ? "$1$2$3" : _expand_tilde($2, $3)) :
$4 ? $4 :
($is_cur_word ? "\$$5" : $ENV{$5})
!egx;
$word;
}
sub _add_double_quoted {
no warnings 'uninitialized';
my ($word, $is_cur_word) = @_;
$word =~ s!\\(.) | # 1) escaped char
\$(\w+) # 2) variable name
!
$1 ? $1 :
($is_cur_word ? "\$$2" : $ENV{$2})
!egx;
$word;
}
sub _add_single_quoted {
my $word = shift;
$word =~ s/\\(.)/$1/g;
$word;
}
$SPEC{point} = {
v => 1.1,
summary => 'Return line with point marked by a marker',
description => <<'_',
This is a utility function useful for testing/debugging. `parse_cmdline()`
expects a command-line and a cursor position (`$line`, `$point`). This routine
expects `$line` with a marker character (by default it's the caret, `^`) and
return (`$line`, `$point`) to feed to `parse_cmdline()`.
Example:
point("^foo") # => ("foo", 0)
point("fo^o") # => ("foo", 2)
_
( run in 2.166 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )