]> ruderich.org/simon Gitweb - fcscs/fcscs.git/blobdiff - bin/fcscs
add IP mode (mapped to i)
[fcscs/fcscs.git] / bin / fcscs
index 69f6f8595f176dd934ad6befeb4e7ee76a6f9413..c06db37987e69e80cccb9d8c706eb4993a81a783 100755 (executable)
--- 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<url mode>  select URLs
 
+=item B<ip mode>   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<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>)
@@ -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<debug>          enable debug mode, writes to I<~/.config/fcscs/log> (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>)
+=item B<initial_mode>       start in this mode, must be a valid mode mapping (C<\&mapping_mode_url>)
 
-=item B<multiplexer>    set multiplexer ("screen" or "tmux") if not autodetected (C<undef>)
+=item B<multiplexer>        set multiplexer ("screen" or "tmux") if not autodetected (C<undef>)
 
-=item B<ignorecase>     ignore case when searching (C<0>)
+=item B<ignorecase>         ignore case when searching (C<0>)
 
-=item B<smartcase>      ignore case unless one uppercase character is searched (C<1>)
+=item B<smartcase>          ignore case unless one uppercase character is searched (C<1>)
 
-=item B<paste_sleep>    sleep x us before running paste command (C<100_000>)
+=item B<paste_sleep>        sleep x us before running paste command (C<100_000>)
 
-=item B<screen_msgwait> GNU Screen's msgwait variable, used when yanking (C<5>)
+=item B<screen_msgwait>     GNU Screen's msgwait variable, used when yanking (C<5>)
 
 =item B<alternative_return> additional accept key like return, set to C<\n> to disable (C<s>)
 
-=item B<browser>        browser command as array reference (C<['x-www-browser']>)
+=item B<browser>            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<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
 
@@ -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<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:
@@ -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(@_); }