X-Git-Url: https://ruderich.org/simon/gitweb/?p=fcscs%2Ffcscs.git;a=blobdiff_plain;f=bin%2Ffcscs;h=b19ae6b8cc1a7e4c235de6fffb6c547292ce8e95;hp=0675def809dd771be3f7e1aee0eebb8e05bc95c8;hb=046b51052cc391daa82a4b7b5e573c0dde085ef7;hpb=dd84992d32a47e07165fdb64e420ed00e37cd552 diff --git a/bin/fcscs b/bin/fcscs index 0675def..b19ae6b 100755 --- a/bin/fcscs +++ b/bin/fcscs @@ -323,6 +323,39 @@ package Screen { return; } + + sub prompt { + my ($self, %settings) = @_; + + foreach (keys %settings) { + die if not exists $self->{prompt}{$_}; + $self->{prompt}{$_} = $settings{$_}; + } + return; + } + + + 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; + } + $fh->autoflush(1); + } + + foreach (@args) { + $_ = $self->encode($_); + } + say $fh "$module: @args" or die $!; + return; + } sub die { my ($self, @args) = @_; @@ -355,38 +388,6 @@ package Screen { $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; - } - $fh->autoflush(1); - } - - foreach (@args) { - $_ = $self->encode($_); - } - say $fh "$module: @args" or CORE::die $!; - return; - } - - - sub prompt { - my ($self, %settings) = @_; - - foreach (keys %settings) { - CORE::die if not exists $self->{prompt}{$_}; - $self->{prompt}{$_} = $settings{$_}; - } - return; - } # Wrapper for Curses. sub width { return $Curses::COLS; } @@ -505,7 +506,7 @@ sub run_in_background { # Necessary for GNU screen or it'll keep the window open until an # external command has run. - require File::Spec; + require File::Spec; # load here to speedup startup my $devnull = File::Spec->devnull(); open STDIN, '<', $devnull or die $!; open STDOUT, '>', $devnull or die $!; @@ -589,7 +590,7 @@ sub select_match { $number = 1; } - $screen->draw_matches($config, $matches, []); # remove matches + $screen->draw_matches($config, $matches, []); # clear matches foreach (@{$matches}) { return { match => $_ } if $_->{id} == $number; @@ -663,7 +664,7 @@ sub extend_match { } elsif ($char eq '$') { # select to end of line extend_match_regex_right($line, $match, qr/.+/); - # Allow mode changes if not overwritten by local mappings. + # Allow mode changes if not overwritten by above mappings. } elsif (defined $config->{mapping}{mode}{$char}) { $screen->draw_matches($config, [$match_old], []); # clear match return { key => $char }; @@ -682,54 +683,43 @@ sub extend_match { } -sub mapping_paste { - my ($key, $screen, $config, $input) = @_; +sub mapping_state_helper { + my ($name, $flags, $key, $screen, $config, $input) = @_; - $screen->debug('mapping_paste', 'started'); + $screen->debug("mapping_$name", 'started'); - $config->{state}{handler} = $config->{handler}{paste}; + $config->{state}{handler} = $config->{handler}{$name}; - $screen->prompt(flags => 'P'); # paste + $screen->prompt(flags => $flags); $screen->draw_prompt($config); $screen->refresh; return {}; } -sub mapping_paste_now { - my ($key, $screen, $config, $input) = @_; +sub mapping_state_now_helper { + my ($name, $key, $screen, $config, $input) = @_; - $screen->debug('mapping_paste_now', 'started'); + $screen->debug("mapping_${name}_now", 'started'); - $config->{state}{handler} = $config->{handler}{paste}; + $config->{state}{handler} = $config->{handler}{$name}; return { select_match => 1, }; } -sub mapping_yank { - my ($key, $screen, $config, $input) = @_; - - $screen->debug('mapping_yank', 'started'); - - $config->{state}{handler} = $config->{handler}{yank}; - - $screen->prompt(flags => 'Y'); # yank - $screen->draw_prompt($config); - $screen->refresh; +sub mapping_paste { + return mapping_state_helper('paste', 'P', @_); +} +sub mapping_paste_now { + return mapping_state_now_helper('paste', @_); +} - return {}; +sub mapping_yank { + return mapping_state_helper('yank', 'Y', @_); } sub mapping_yank_now { - my ($key, $screen, $config, $input) = @_; - - $screen->debug('mapping_yank_now', 'started'); - - $config->{state}{handler} = $config->{handler}{yank}; - - return { - select_match => 1, - }; + return mapping_state_now_helper('yank', @_); } @@ -753,29 +743,23 @@ The following normal modes are available: =back =cut -sub mapping_mode_path { - my ($key, $screen, $config, $input) = @_; +sub mapping_mode_helper { + my ($name, $select, $key, $screen, $config, $input) = @_; - $screen->debug('mapping_mode_path', 'started'); + $screen->debug("mapping_mode_$name", 'started'); - my @matches = get_regex_matches($input, $config->{regex}{path}); + my @matches = get_regex_matches($input, $config->{regex}{$name}); return { - select => 'path select', + select => $select, matches => \@matches, - handler => $config->{handler}{path}, + handler => $config->{handler}{$name}, }; } +sub mapping_mode_path { + return mapping_mode_helper('path', 'path select', @_); +} sub mapping_mode_url { - my ($key, $screen, $config, $input) = @_; - - $screen->debug('mapping_mode_url', 'started'); - - my @matches = get_regex_matches($input, $config->{regex}{url}); - return { - select => 'url select', - matches => \@matches, - handler => $config->{handler}{url}, - }; + return mapping_mode_helper('url', 'url select', @_); } sub mapping_mode_ip { my ($key, $screen, $config, $input) = @_; @@ -791,16 +775,7 @@ sub mapping_mode_ip { }; } sub mapping_mode_checksum { - my ($key, $screen, $config, $input) = @_; - - $screen->debug('mapping_mode_checksum', 'started'); - - my @matches = get_regex_matches($input, $config->{regex}{checksum}); - return { - select => 'checksum select', - matches => \@matches, - handler => $config->{handler}{checksum}, - }; + return mapping_mode_helper('checksum', 'checksum select', @_); } =head2 SEARCH MODE (AND EXTEND MODE) @@ -915,7 +890,7 @@ sub handler_yank { $screen->debug('handler_yank', 'started'); - require File::Temp; + require File::Temp; # load here to speedup startup # Use a temporary file to prevent leaking the yanked data to other users # with the command line, e.g. ps aux or top. @@ -970,7 +945,7 @@ sub handler_paste { $screen->debug('handler_paste', 'started'); - require Time::HiRes; + require Time::HiRes; # load here to speedup startup my @cmd; if ($config->{setting}{multiplexer} eq 'screen') {