X-Git-Url: https://ruderich.org/simon/gitweb/?p=fcscs%2Ffcscs.git;a=blobdiff_plain;f=bin%2Ffcscs;h=c06db37987e69e80cccb9d8c706eb4993a81a783;hp=69f6f8595f176dd934ad6befeb4e7ee76a6f9413;hb=3735c1d9c84fdb28c9db36601402125487ba10db;hpb=36909ff6fcb2e8b5397d510030ab9cdba12622da diff --git a/bin/fcscs b/bin/fcscs index 69f6f85..c06db37 100755 --- a/bin/fcscs +++ b/bin/fcscs @@ -500,8 +500,8 @@ sub run_in_background { # closes the window (because the parent process has exited). local $SIG{HUP} = 'IGNORE'; - # Necessary for GNU screen or it'll keep the window open until the - # paste command has run. + # Necessary for GNU screen or it'll keep the window open until an + # external command has run. close STDIN or die $!; close STDOUT or die $!; close STDERR or die $!; @@ -716,6 +716,8 @@ The following normal modes are available: =item B select URLs +=item B select IPv4 and IPv6 addresses + =back =cut @@ -743,6 +745,19 @@ sub mapping_mode_url { 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) @@ -830,6 +845,11 @@ sub mapping_mode_search { $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, @@ -1002,6 +1022,8 @@ them in parentheses): =item B select URLs (C<\&mapping_mode_url>) +=item B select IPv4 and IPv6 addresses (C<\&mapping_mode_ip>) + =item B search for regex to get selection (C<\&mapping_mode_search>) =item B quit fcscs (C<\&mapping_quit>) @@ -1047,6 +1069,7 @@ Example: my %mapping_mode = ( f => \&mapping_mode_path, u => \&mapping_mode_url, + i => \&mapping_mode_ip, '/' => \&mapping_mode_search, q => \&mapping_quit, ); @@ -1098,23 +1121,23 @@ Defaults in parentheses. =over -=item B enable debug mode, writes to I<~/.config/fcscs/log> (C<0>) +=item B enable debug mode, writes to I<~/.config/fcscs/log> (C<0>) -=item B start in this mode, must be a valid mode mapping (C<\&mapping_mode_url>) +=item B start in this mode, must be a valid mode mapping (C<\&mapping_mode_url>) -=item B set multiplexer ("screen" or "tmux") if not autodetected (C) +=item B set multiplexer ("screen" or "tmux") if not autodetected (C) -=item B ignore case when searching (C<0>) +=item B ignore case when searching (C<0>) -=item B ignore case unless one uppercase character is searched (C<1>) +=item B ignore case unless one uppercase character is searched (C<1>) -=item B sleep x us before running paste command (C<100_000>) +=item B sleep x us before running paste command (C<100_000>) -=item B GNU Screen's msgwait variable, used when yanking (C<5>) +=item B GNU Screen's msgwait variable, used when yanking (C<5>) =item B additional accept key like return, set to C<\n> to disable (C) -=item B browser command as array reference (C<['x-www-browser']>) +=item B browser command as array reference (C<['x-www-browser']>) =back @@ -1126,26 +1149,30 @@ Example: =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 used by C<\&mapping_mode_url()> +=item B used by C<\&mapping_mode_url> -=item B used by C<\&mapping_mode_path()> +=item B used by C<\&mapping_mode_path> + +=item B used by C<\&mapping_mode_ip> + +=item B used by C<\&mapping_mode_ip> =back @@ -1159,6 +1186,10 @@ my %regex = ( # 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 @@ -1175,6 +1206,8 @@ The following handlers are available, defaults in parentheses. =item B used to open URLs (e.g. in a browser) (C<\&handler_url>) +=item B used to handle IPs (C<\&handler_yank>) + =back Example: @@ -1198,6 +1231,7 @@ my %handler = ( yank => \&handler_yank, paste => \&handler_paste, url => \&handler_url, + ip => \&handler_yank, ); my %state = ( @@ -1219,6 +1253,7 @@ Create a new Curses attribute with the given fore- and background color. mapping_mode_path() mapping_mode_url() + mapping_mode_ip() mapping_mode_search() mapping_paste() @@ -1256,6 +1291,7 @@ package Fcscs { 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(@_); }