X-Git-Url: https://ruderich.org/simon/gitweb/?p=fcscs%2Ffcscs.git;a=blobdiff_plain;f=bin%2Ffcscs;h=e3d39cb7ae5251b590451df7e853deb202dccbd6;hp=5b68c2b022a76f445db3f9c652a7f65e343d9bbb;hb=524d2c01df24bffec726dc03ebc8a37129ae7f14;hpb=f124504b5d88971f1740b01faed809a63825fe17 diff --git a/bin/fcscs b/bin/fcscs index 5b68c2b..e3d39cb 100755 --- a/bin/fcscs +++ b/bin/fcscs @@ -102,12 +102,16 @@ or another number to select the longer match. Use backspace to remove the last entered number. Press return before entering a number to select the last (lowest numbered) -match. To abort without selecting any match either use "q". +match (underlined by default). To abort without selecting any match either use +"q". To change the selection mode (e.g. paths, files, etc.) use one of the mappings explained below. Per default URLs are selected, see options for a way to change this. +I: Opening URLs in the browser passes the URL via the command line which +leaks URLs to other users on the current system via C or C. + I: When yanking (copying) a temporary file is used to pass the data to GNU screen/Tmux without exposing it to C or C. However this may leak data if those temporary files are written to disk. To prevent this change @@ -264,6 +268,8 @@ package Screen { sub draw_prompt { my ($self, $config) = @_; + $self->debug('draw_prompt', 'started'); + my $x = 0; my $y = $self->height - 1; @@ -273,17 +279,20 @@ package Screen { # Draw prompt flags. if (defined (my $s = $self->{prompt}{flags})) { $s = "[$s]"; + $self->debug('draw_prompt', $s); $self->draw_clipped($y, $x, $config->{attribute}{prompt_flags}, $s); $x += length($s) + 1; # space between next element } # Draw prompt name. if (defined (my $s = $self->{prompt}{name})) { $s = "[$s]"; + $self->debug('draw_prompt', $s); $self->draw_clipped($y, $x, $config->{attribute}{prompt_name}, $s); $x += length($s) + 1; } # Draw prompt value, e.g. a search field. if (defined (my $s = $self->{prompt}{value})) { + $self->debug('draw_prompt', $s); $self->draw_clipped($y, $x, undef, $s); $x += length($s) + 1; } @@ -299,9 +308,13 @@ package Screen { my $attr_id = $config->{attribute}{match_id}; my $attr_string = $config->{attribute}{match_string}; + my $attr_last = $config->{attribute}{match_last}; foreach (@{$matches_add}) { - $self->draw($_->{y}, $_->{x}, $attr_string, $_->{string}); + my $attr = (defined $_->{id} and $_->{id} == 1) + ? $attr_last + : $attr_string; + $self->draw($_->{y}, $_->{x}, $attr, $_->{string}); if (defined $_->{id}) { $self->draw($_->{y}, $_->{x}, $attr_id, $_->{id}); } @@ -355,6 +368,9 @@ package Screen { } } + foreach (@args) { + $_ = $self->encode($_); + } say $fh "$module: @args"; return; } @@ -456,7 +472,8 @@ sub run_command { # a working $$. no warnings; - system { $cmd->[0] } @{$cmd}; + my @cmd = map { $screen->encode($_) } @{$cmd}; + system { $cmd[0] } @cmd; }; if ($exit != 0) { my $msg; @@ -599,6 +616,8 @@ sub extend_match { $screen->debug('extend_match', 'started'); + return if not defined $match; + $screen->prompt(name => 'extend', value => undef); $screen->draw_prompt($config); @@ -631,7 +650,7 @@ sub extend_match { } elsif ($char eq 'E') { # select current WORD (only right) extend_match_regex_right($line, $match, qr/\S+/); - } elsif ($char eq '^') { # select to beginning of line + } elsif ($char eq '0') { # select to beginning of line extend_match_regex_left($line, $match, qr/.+/); } elsif ($char eq '$') { # select to end of line extend_match_regex_right($line, $match, qr/.+/); @@ -748,7 +767,7 @@ configurable at the moment): =item B extend WORD to the right -=item B<^> extend to beginning of line +=item B<0> extend to beginning of line =item B<$> extend to end of line @@ -895,10 +914,7 @@ sub handler_url { $screen->debug('handler_url', "opening $match->{value}"); run_in_background($screen, sub { - my @cmd = map { $screen->encode($_) } ( - @{$config->{setting}{browser}}, - $match->{value}, - ); + my @cmd = ( @{$config->{setting}{browser}}, $match->{value} ); run_command($screen, $config, \@cmd); }); return; @@ -1039,6 +1055,8 @@ Defaults in parentheses (foreground, background, attribute). =item B attribute for matches (yellow, default, normal) +=item B attribute for the match selected by return (yellow, default, underline) + =item B attribute for prompt name (standout) =item B attribute for prompt flags (standout) @@ -1057,6 +1075,8 @@ my %attribute = ( match_id => $screen->color_pair(Curses::COLOR_RED, -1) | Curses::A_BOLD, match_string => $screen->color_pair(Curses::COLOR_YELLOW, -1), + match_last => $screen->color_pair(Curses::COLOR_YELLOW, -1) + | Curses::A_UNDERLINE, prompt_name => Curses::A_STANDOUT, prompt_flags => Curses::A_STANDOUT, ); @@ -1367,8 +1387,8 @@ RESULT: $screen->debug('input', 'selecting match'); my $tmp = $result; $result = select_match($result->{select}, - $screen, \%config, $input, - $result->{matches}); + $screen, \%config, $input, + $result->{matches}); $result->{handler} = $tmp->{handler}; $result->{extend} = $tmp->{extend}; goto RESULT; # reprocess special entries in result