$self->deinit;
exit 1;
}
+ sub debug {
+ my ($self, $module, @args) = @_;
+
+ return if not $self->{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;
+ }
sub prompt {
# FUNCTIONS
-sub debug {
- my ($config, $module, @args) = @_;
-
- 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;
-}
-
-
sub prepare_input {
my ($screen, $input_ref) = @_;
sub run_command {
- my ($config, $cmd) = @_;
+ my ($screen, $config, $cmd) = @_;
- debug $config, 'run_command', "running @{$cmd}";
+ $screen->debug('run_command', "running @{$cmd}");
my $exit = do {
# Perl's system() combined with a $SIG{__WARN__} which die()s has
return;
}
sub run_in_background {
- my ($config, $sub) = @_;
+ my ($screen, $sub) = @_;
- debug $config, 'run_in_background', "running $sub";
+ $screen->debug('run_in_background', "running $sub");
my $pid = fork;
defined $pid or die $!;
sub select_match {
my ($name, $screen, $config, $input, $matches) = @_;
- debug $config, 'select_match', 'started';
+ $screen->debug('select_match', 'started');
return if @{$matches} == 0;
# Don't return on initial run to give the user a chance to select another
foreach (@{$matches}) {
return { match => $_ } if $_->{id} == $number;
}
- debug $config, 'select_match', 'no match selected';
+ $screen->debug('select_match', 'no match selected');
return { match => undef };
}
sub extend_match {
my ($screen, $config, $input, $match) = @_;
- debug $config, 'extend_match', 'started';
+ $screen->debug('extend_match', 'started');
$screen->prompt(name => 'extend', value => undef);
$screen->draw_prompt($config);
$screen->refresh;
}
- debug $config, 'extend_match', 'done';
+ $screen->debug('extend_match', 'done');
return { match => $match };
}
sub mapping_paste {
my ($key, $screen, $config, $input) = @_;
- debug $config, 'mapping_paste', 'started';
+ $screen->debug('mapping_paste', 'started');
$config->{state}{handler} = $config->{handler}{paste};
sub mapping_yank {
my ($key, $screen, $config, $input) = @_;
- debug $config, 'mapping_yank', 'started';
+ $screen->debug('mapping_yank', 'started');
$config->{state}{handler} = $config->{handler}{yank};
sub mapping_mode_path {
my ($key, $screen, $config, $input) = @_;
- debug $config, 'mapping_mode_path', 'started';
+ $screen->debug('mapping_mode_path', 'started');
my @matches = get_regex_matches($input, $config->{regex}{path});
return {
sub mapping_mode_url {
my ($key, $screen, $config, $input) = @_;
- debug $config, 'mapping_mode_url', 'started';
+ $screen->debug('mapping_mode_url', 'started');
my @matches = get_regex_matches($input, $config->{regex}{url});
return {
sub mapping_mode_search {
my ($key, $screen, $config, $input) = @_;
- debug $config, 'mapping_mode_search', 'started';
+ $screen->debug('mapping_mode_search', 'started');
$screen->cursor(1);
sub handler_yank {
my ($screen, $config, $match) = @_;
- debug $config, 'handler_yank', 'started';
+ $screen->debug('handler_yank', 'started');
require File::Temp;
close $fh or die $!;
if ($config->{setting}{multiplexer} eq 'screen') {
- debug $config, 'handler_yank', 'using screen';
+ $screen->debug('handler_yank', 'using screen');
# GNU screen displays an annoying "Slurping X characters into buffer".
# Use 'msgwait 0' as a hack to disable it.
my $msgwait = $config->{setting}{screen_msgwait};
- run_command($config, ['screen', '-X', 'msgwait', 0]);
- run_command($config, ['screen', '-X', 'readbuf', $tmp]);
- run_command($config, ['screen', '-X', 'msgwait', $msgwait]);
+ run_command($screen, $config, ['screen', '-X', 'msgwait', 0]);
+ run_command($screen, $config, ['screen', '-X', 'readbuf', $tmp]);
+ run_command($screen, $config, ['screen', '-X', 'msgwait', $msgwait]);
} elsif ($config->{setting}{multiplexer} eq 'tmux') {
- debug $config, 'handler_yank', 'using tmux';
+ $screen->debug('handler_yank', 'using tmux');
- run_command($config, ['tmux', 'load-buffer', $tmp]);
+ run_command($screen, $config, ['tmux', 'load-buffer', $tmp]);
} else {
die 'unsupported multiplexer';
}
sub handler_paste {
my ($screen, $config, $match) = @_;
- debug $config, 'handler_paste', 'started';
+ $screen->debug('handler_paste', 'started');
require Time::HiRes;
my @cmd;
if ($config->{setting}{multiplexer} eq 'screen') {
- debug $config, 'handler_paste', 'using screen';
+ $screen->debug('handler_paste', 'using screen');
@cmd = qw( screen -X paste . );
} elsif ($config->{setting}{multiplexer} eq 'tmux') {
- debug $config, 'handler_paste', 'using tmux';
+ $screen->debug('handler_paste', 'using tmux');
@cmd = qw( tmux paste-buffer );
} else {
die 'unsupported multiplexer';
}
- run_in_background($config, sub {
+ run_in_background($screen, sub {
# We need to get the data in the paste buffer before we can paste
# it.
handler_yank($screen, $config, $match);
# Sleep until we switch back to the current window.
Time::HiRes::usleep($config->{setting}{paste_sleep});
- run_command($config, \@cmd);
+ run_command($screen, $config, \@cmd);
});
return;
}
sub handler_url {
my ($screen, $config, $match) = @_;
- debug $config, 'handler_url', "opening $match->{value}";
+ $screen->debug('handler_url', "opening $match->{value}");
- run_in_background($config, sub {
+ run_in_background($screen, sub {
my @cmd = map { $screen->encode($_) } (
@{$config->{setting}{browser}},
$match->{value},
);
- run_command($config, \@cmd);
+ run_command($screen, $config, \@cmd);
});
return;
}
my ($screen, $config, $match) = @_;
if ($match->{value} =~ m{^https://www.youtube.com/}) {
- return run_in_background($config, sub {
- run_command($config, ['youtube-dl-wrapper', $match->{value}]);
+ return run_in_background($screen, sub {
+ run_command($screen, $config,
+ ['youtube-dl-wrapper', $match->{value}]);
});
}
handler_url(@_);
while (1) {
if (not defined $mapping) {
$key = $screen->getch unless defined $key;
- debug \%config, 'input', "got key '$key'";
+ $screen->debug('input', "got key '$key'");
$mapping = $config{mapping}{mode}{$key};
$mapping = $config{mapping}{simple}{$key} unless defined $mapping;
}
}
- debug \%config, 'input', 'running mapping';
+ $screen->debug('input', 'running mapping');
my $result = $mapping->($key, $screen, \%config, $input);
$mapping = undef;
RESULT:
if (defined $result->{quit}) {
- debug \%config, 'input', 'quitting';
+ $screen->debug('input', 'quitting');
last;
}
if (defined $result->{key}) {
$key = $result->{key}; # lookup another mapping
- debug \%config, 'input', "processing new key: '$key'";
+ $screen->debug('input', "processing new key: '$key'");
next;
}
if (defined $result->{select}) {
- debug \%config, 'input', 'selecting match';
+ $screen->debug('input', 'selecting match');
my $tmp = $result;
$result = select_match($result->{select},
$screen, \%config, $input,
goto RESULT; # reprocess special entries in result
}
if (defined $result->{extend}) {
- debug \%config, 'input', 'extending match';
+ $screen->debug('input', 'extending match');
$result = extend_match($screen, \%config, $input,
$result->{match});
goto RESULT; # reprocess special entries in result
$result->{match}{value} = $result->{match}{string};
}
- debug \%config, 'input', 'running handler';
+ $screen->debug('input', 'running handler');
# Choose handler with falling priority.
my @handlers = (