This file is indexed.

/usr/lib/urxvt/perl/selection-popup is in rxvt-unicode 9.20-1+b1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#! perl

#:META:X_RESOURCE:url-launcher:string:shell command to use

=head1 NAME

selection-popup - (enabled by default)

=head1 DESCRIPTION

Binds a popup menu to Ctrl-Button3 that lets you convert the selection
text into various other formats/action (such as uri unescaping, perl
evaluation, web-browser starting etc.), depending on content.

Other extensions can extend this popup menu by pushing a code reference
onto C<< @{ $term->{selection_popup_hook} } >>, which gets called whenever
the popup is being displayed.

Its sole argument is the popup menu, which can be modified. The selection
is in C<$_>, which can be used to decide whether to add something or not.
It should either return nothing or a string and a code reference. The
string will be used as button text and the code reference will be called
when the button gets activated and should transform C<$_>.

The following will add an entry C<a to b> that transforms all C<a>s in
the selection to C<b>s, but only if the selection currently contains any
C<a>s:

   push @{ $self->{term}{selection_popup_hook} }, sub {
      /a/ ? ("a to b" => sub { s/a/b/g }
          : ()
   };

=cut

sub msg {
   my ($self, $msg) = @_;

   my $overlay = $self->overlay (0, 0, $self->strwidth ($msg), 1);
   $overlay->set (0, 0, $msg);
   my $iow; $iow = urxvt::timer->new->after (1)->cb (sub {
      undef $overlay;
      undef $iow;
   });
}

sub on_start {
   my ($self) = @_;

   $self->{browser} = $self->x_resource ("url-launcher") || "sensible-browser";

   $self->grab_button (3, urxvt::ControlMask);

   ()
}

sub on_button_press {
   my ($self, $event) = @_;

   if ($event->{button} == 3 && $event->{state} & urxvt::ControlMask) {
      my $popup = $self->popup ($event)
         or return 1;

      $popup->add_title ("Convert Selection");

      my $text = $self->selection;

      my $title = $text;
      $title =~ s/[\x00-\x1f\x80-\x9f]/·/g;
      substr $title, 40, -1, "..." if 40 < length $title;
      $popup->add_title ($title);
      $popup->add_separator;

      my $add_button = sub {
         my ($title, $cb) = @_;

         $popup->add_button ($title => sub {
            for ($text) {
               my $orig = $_;
               $cb->();

               if ($orig ne $_) {
                  $self->selection ($_);
                  s/[\x00-\x1f\x80-\x9f]/·/g;
                  $self->msg ($self->special_encode ($_));
               }
            }
         });
      };

      for ($text) {
         /\n/
            and $add_button->("newlines to spaces" => sub { y/\n/ / });

         /./
            and $add_button->("rot13" => sub { y/A-Za-z/N-ZA-Mn-za-m/ });

         /./
            and $add_button->("eval perl expression" => sub { my $self = $self; no warnings; $_ = eval $_; $_ = "$@" if $@ });

         /./
            and $add_button->((sprintf "to unicode hex index (%x)", ord) => sub { $_ = sprintf "%x", ord });

         /(\S+):(\d+):?/
            and $add_button->("vi-commands to load '$1'" => sub { s/^(\S+):(\d+):?$/\x1b:e $1\x0d:$2\x0d/ });

         /%[0-9a-fA-F]{2}/ && !/%[^0-9a-fA-F]/ && !/%.[^0-9a-fA-F]/
            and $add_button->("uri unescape" => sub { s/%([0-9a-fA-F]{2})/chr hex $1/ge });

         /[\\"'\ \t|&;<>()]/
            and $add_button->("shell quote" => sub { $_ = "\Q$_" });

         /^(https?|ftp|telnet|irc|news):\//
            and $add_button->("run $self->{browser}" => sub { $self->exec_async ($self->{browser}, $_) });

         for my $hook (@{ $self->{term}{selection_popup_hook} || [] }) {
            if (my ($title, $cb) = $hook->($popup)) {
               $add_button->($title, $cb);
            }
         }

         if (/^\s*((?:0x)?\d+)\s*$/) {
            $popup->add_title (sprintf "%20s", eval $1);
            $popup->add_title (sprintf "%20s", sprintf "0x%x", eval $1);
            $popup->add_title (sprintf "%20s", sprintf "0%o", eval $1);
         }
      }

      $popup->show;

      return 1;
   }

   ()
}