sub run_command {
- my ($screen, $config, $cmd) = @_;
+ my ($screen, $cmd) = @_;
$screen->debug('run_command', "running @{$cmd}");
=item B<url mode> select URLs
+=item B<ip mode> select IPv4 and IPv6 addresses
+
=back
=cut
handler => $config->{handler}{url},
};
}
+sub mapping_mode_ip {
+ my ($key, $screen, $config, $input) = @_;
+
+ $screen->debug('mapping_mode_ip', 'started');
+
+ my @ipv4 = get_regex_matches($input, $config->{regex}{ipv4});
+ my @ipv6 = get_regex_matches($input, $config->{regex}{ipv6});
+ return {
+ select => 'ip select',
+ matches => [@ipv4, @ipv6],
+ handler => $config->{handler}{ip},
+ };
+}
=head2 SEARCH MODE (AND EXTEND MODE)
$screen->cursor(0);
+ $screen->prompt(name => undef, value => undef); # clear prompt
+ $screen->draw_prompt($config);
+
+ $screen->debug('mapping_mode_search', 'done');
+
return {
select => 'search',
matches => \@last_matches,
# 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($screen, $config, ['screen', '-X', 'msgwait', 0]);
- run_command($screen, $config, ['screen', '-X', 'readbuf', $tmp]);
- run_command($screen, $config, ['screen', '-X', 'msgwait', $msgwait]);
+ run_command($screen, ['screen', '-X', 'msgwait', 0]);
+ run_command($screen, ['screen', '-X', 'readbuf', $tmp]);
+ run_command($screen, ['screen', '-X', 'msgwait', $msgwait]);
} elsif ($config->{setting}{multiplexer} eq 'tmux') {
$screen->debug('handler_yank', 'using tmux');
- run_command($screen, $config, ['tmux', 'load-buffer', $tmp]);
+ run_command($screen, ['tmux', 'load-buffer', $tmp]);
} else {
die 'unsupported multiplexer';
}
# Sleep until we switch back to the current window.
Time::HiRes::usleep($config->{setting}{paste_sleep});
- run_command($screen, $config, \@cmd);
+ run_command($screen, \@cmd);
});
return;
}
run_in_background($screen, sub {
my @cmd = ( @{$config->{setting}{browser}}, $match->{value} );
- run_command($screen, $config, \@cmd);
+ run_command($screen, \@cmd);
});
return;
}
=item B<u> select URLs (C<\&mapping_mode_url>)
+=item B<i> select IPv4 and IPv6 addresses (C<\&mapping_mode_ip>)
+
=item B</> search for regex to get selection (C<\&mapping_mode_search>)
=item B<q> quit fcscs (C<\&mapping_quit>)
my %mapping_mode = (
f => \&mapping_mode_path,
u => \&mapping_mode_url,
+ i => \&mapping_mode_ip,
'/' => \&mapping_mode_search,
q => \&mapping_quit,
);
=cut
my %setting = (
# options
- debug => 0,
- initial_mode => \&mapping_mode_url,
- multiplexer => undef,
- ignorecase => 0,
- smartcase => 1,
- paste_sleep => 100_000,
- screen_msgwait => 5,
+ debug => 0,
+ initial_mode => \&mapping_mode_url,
+ multiplexer => undef,
+ ignorecase => 0,
+ smartcase => 1,
+ paste_sleep => 100_000,
+ screen_msgwait => 5,
# global mappings
alternative_return => 's',
# commands
- browser => ['x-www-browser'],
+ browser => ['x-www-browser'],
);
=head2 REGEXPS
=over
-=item B<url> used by C<\&mapping_mode_url()>
+=item B<url> used by C<\&mapping_mode_url>
-=item B<path> used by C<\&mapping_mode_path()>
+=item B<path> used by C<\&mapping_mode_path>
+
+=item B<ipv4> used by C<\&mapping_mode_ip>
+
+=item B<ipv6> used by C<\&mapping_mode_ip>
=back
# Taken from urlview's default configuration file, thanks.
url => qr{((?:(?:(?:http|https|ftp|gopher)|mailto):(?://)?[^ <>"\t]*|(?:www|ftp)[0-9]?\.[-a-z0-9.]+)[^ .,;\t\n\r<">\):]?[^, <>"\t]*[^ .,;\t\n\r<">\):])},
path => qr{(~?[a-zA-Z0-9_./-]*/[a-zA-Z0-9_./-]+)},
+ # IP addresses with optional prefix. Not perfectly accurate but good
+ # enough.
+ ipv4 => qr!\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?)\b!,
+ ipv6 => qr!\b((?:[0-9a-fA-F]{1,4})?(?::+[0-9a-fA-F]{1,4})+(?:/\d{1,3})?)\b!,
);
=head2 HANDLERS
=item B<url> used to open URLs (e.g. in a browser) (C<\&handler_url>)
+=item B<ip> used to handle IPs (C<\&handler_yank>)
+
=back
Example:
if ($match->{value} =~ m{^https://www.youtube.com/}) {
return run_in_background($screen, sub {
- run_command($screen, $config,
- ['youtube-dl-wrapper', $match->{value}]);
+ run_command($screen, ['youtube-dl-wrapper', $match->{value}]);
});
}
handler_url(@_);
yank => \&handler_yank,
paste => \&handler_paste,
url => \&handler_url,
+ ip => \&handler_yank,
);
my %state = (
mapping_mode_path()
mapping_mode_url()
+ mapping_mode_ip()
mapping_mode_search()
mapping_paste()
sub mapping_mode_path { return main::mapping_mode_path(@_); }
sub mapping_mode_url { return main::mapping_mode_url(@_); }
+ sub mapping_mode_ip { return main::mapping_mode_ip(@_); }
sub mapping_mode_search { return main::mapping_mode_search(@_); }
sub mapping_paste { return main::mapping_paste(@_); }