App-VTide
view release on metacpan or search on metacpan
lib/App/VTide/Command/Run.pm view on Meta::CPAN
}
sub command {
my ( $self, $params, $recurse ) = @_;
if ( !$params->{edit} ) {
return
ref $params->{command}
? map { $self->command_param($_) } @{ $params->{command} }
: ( $params->{command} );
}
my $editor =
ref $params->{editor}{command}
? $params->{editor}{command}
: $self->config->get->{editor}{command};
my @globs =
ref $params->{edit} ? @{ $params->{edit} } : ( $params->{edit} );
my $title = $params->{title} || $globs[0];
my $max = 15;
if ( length $title > $max ) {
$title = substr $title, ( length $title ) - $max, $max + 1;
}
eval { require Term::Title; }
and Term::Title::set_titlebar($title);
system 'tmux', 'rename-window', $title;
my $helper_text = $self->config->get->{editor}{helper};
my $helper;
eval {
if ($helper_text) {
$helper = eval $helper_text; ## no critic
die "No helper generated!" if !$helper;
}
elsif ( $self->defaults->{verbose} ) {
warn "No helper text";
}
1;
} or do {
warn $@;
warn $helper_text;
};
my $groups = $self->config->get->{editor}{files};
my @files = $self->_globs2files( $groups, $helper, $recurse, @globs );
return ( @$editor, @files );
}
sub _globs2files {
my ( $self, $groups, $helper, $recurse, @globs ) = @_;
my @files;
my $count = 0;
GLOB:
while ( my $glob = shift @globs ) {
last if $count++ > 30;
my ($not_glob) = $glob =~ /^[!](.*)$/;
if ($not_glob) {
my %not_files = map { $_ => 1 }
$self->_globs2files( $groups, $helper, $recurse, $not_glob );
@files = grep { !$not_files{$_} } @files;
next GLOB;
}
elsif ( $groups->{$glob} ) {
unshift @globs, @{ $groups->{$glob} };
next GLOB;
}
elsif ($helper) {
my @g;
eval {
@g = $helper->( $self, $glob );
1;
} or do { warn $@ };
if (@g) {
push @files, grep { -f $_ } @g;
unshift @globs, grep { !-f $_ } @g;
next GLOB;
}
}
if ( $recurse && -d $glob ) {
push @files, map {
-d $_
? $self->_globs2files( $groups, $helper, $recurse, $_ )
: $_
} $self->_globs2files( $groups, $helper, $recurse, "$glob/*" );
next GLOB;
}
push @files, $self->_dglob($glob);
}
return uniq @files;
}
sub _shell_quote {
my ($file) = @_;
$file =~ s/([\s&;*'"])/\\$1/gxms;
return $file;
}
sub load_env {
my ( $self, $env_extra ) = @_;
if ( $env_extra && ref $env_extra eq 'HASH' ) {
for my $env ( keys %{$env_extra} ) {
my $orig = $ENV{$env} // '';
$ENV{$env} = $env_extra->{$env};
$ENV{$env} =~ s/[\$]$env/$orig/xms;
}
}
return;
}
sub runit {
my ( $self, @cmd ) = @_;
print +( join " \\\n ", @cmd ), "\n"
if $self->defaults->{test} || $self->defaults->{verbose};
return if $self->defaults->{test};
( run in 1.038 second using v1.01-cache-2.11-cpan-39bf76dae61 )