sub debug {
my ($config, $module, @args) = @_;
- say STDERR "$module: @args" if $config->{setting}{debug};
+ return if not $config->{setting}{debug};
+
+ state $fh; # only open the file once per run
+ if (not defined $fh) {
+ # Ignore errors if the directory doesn't exist.
+ if (not open $fh, '>', "$ENV{HOME}/.config/fcscs/log") {
+ $fh = undef; # a failed open still writes a value to $fh
+ return;
+ }
+ }
+
+ say $fh "$module: @args";
return;
}
my $pid = fork;
defined $pid or die $!;
if ($pid == 0) { # child
- # Disable debug mode as writing will fail with closed STDERR.
- $config->{setting}{debug} = 0;
-
$sub->();
}
exit;
# Use a temporary file to prevent leaking the yanked data to other users
# with the command line, e.g. ps aux or top.
my ($fh, $tmp) = File::Temp::tempfile(); # dies on its own
- print $fh $screen->encode($match->{string});
+ print $fh $screen->encode($match->{value});
close $fh or die $!;
if ($config->{setting}{multiplexer} eq 'screen') {
sub handler_url {
my ($screen, $config, $match) = @_;
- debug $config, 'handler_url', 'started';
+ debug $config, 'handler_url', "opening $match->{value}";
run_in_background($config, sub {
- my $url = defined $match->{url}
- ? $match->{url}
- : $match->{string};
-
my @cmd = map { $screen->encode($_) } (
@{$config->{setting}{browser}},
- $url,
+ $match->{value},
);
run_command($config, \@cmd);
});
=over
-=item B<debug> enable debug mode (redirect stderr when enabling) (C<0>)
+=item B<debug> enable debug mode, writes to I<~/.config/fcscs/log> (C<0>)
=item B<initial_mode> start in this mode, must be a valid mode mapping (C<\&mapping_mode_url>)
$config{handler}{url} = sub {
my ($screen, $config, $match) = @_;
- my $url = defined $match->{url} ? $match->{url} : $match->{string};
- if ($url =~ m{^https://www.youtube.com/}) {
+ if ($match->{value} =~ m{^https://www.youtube.com/}) {
return run_in_background($config, sub {
- run_command($config, ['youtube-dl-wrapper', $url]);
+ run_command($config, ['youtube-dl-wrapper', $match->{value}]);
});
}
handler_url(@_);
Used as handler to yank, paste selection or open URL in browser.
+ debug()
get_regex_matches()
select_match()
run_command()
sub handler_paste { return main::handler_paste(@_); }
sub handler_url { return main::handler_url(@_); }
+ sub debug { return main::debug(@_); }
+
sub get_regex_matches { return main::get_regex_matches(@_); }
sub select_match { return main::select_match(@_); }
goto RESULT; # reprocess special entries in result
}
if (defined $result->{match}) {
+ if (not defined $result->{match}->{value}) {
+ $result->{match}->{value} = $result->{match}->{string};
+ }
+
debug \%config, 'input', 'running handler';
- my $handler = $config{state}{handler}; # set by user
- $handler = $result->{handler} unless defined $handler; # set by mapping
- $handler = $config{handler}{yank} unless defined $handler; # fallback
- $handler->($screen, \%config, $result->{match});
+
+ # Choose handler with falling priority.
+ my @handlers = (
+ $config{state}{handler}, # set by user
+ $result->{match}->{handler}, # set by match
+ $result->{handler}, # set by mapping
+ $config{handler}{yank}, # fallback
+ );
+ foreach my $handler (@handlers) {
+ next unless defined $handler;
+
+ $handler->($screen, \%config, $result->{match});
+ last;
+ }
last;
}