ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
(Generate patch)

Comparing rxvt-unicode/src/urxvt.pm (file contents):
Revision 1.247 by root, Fri Dec 26 19:19:30 2014 UTC vs.
Revision 1.251 by root, Fri Dec 26 22:52:23 2014 UTC

45 45
46 URxvt.perl-ext-common: default,selection-autotransform 46 URxvt.perl-ext-common: default,selection-autotransform
47 47
48Extensions may add additional resources and C<actions>, i.e., methods 48Extensions may add additional resources and C<actions>, i.e., methods
49which can be bound to a key and invoked by the user. An extension can 49which can be bound to a key and invoked by the user. An extension can
50define the resources it support and also default bindings for one or 50define the resources it support using so called META comments,
51more actions it provides using so called META comments, described
52below. Similarly to builtin resources, extension resources can also be 51described below. Similarly to builtin resources, extension resources
53specified on the command line as long options (with C<.> replaced by 52can also be specified on the command line as long options (with C<.>
54C<->), in which case the corresponding extension is loaded 53replaced by C<->), in which case the corresponding extension is loaded
55automatically. For this to work the extension B<must> define META 54automatically. For this to work the extension B<must> define META
56comments for its resources. 55comments for its resources.
57 56
58=head1 API DOCUMENTATION 57=head1 API DOCUMENTATION
59 58
118=head2 META comments 117=head2 META comments
119 118
120Rxvt-unicode recognizes special meta comments in extensions that define 119Rxvt-unicode recognizes special meta comments in extensions that define
121different types of metadata. 120different types of metadata.
122 121
123Currently, it recxognises only one such comment: 122Currently, it recognises only one such comment:
124 123
125=over 4 124=over 4
126 125
127=item #:META:RESOURCE:name:type:desc 126=item #:META:RESOURCE:name:type:desc
128 127
715 @{ delete $TERM->{perl_ext_3} } 714 @{ delete $TERM->{perl_ext_3} }
716 ) { 715 ) {
717 if ($_ eq "default") { 716 if ($_ eq "default") {
718 717
719 $ext_arg{$_} = [] 718 $ext_arg{$_} = []
720 for
721 qw(selection option-popup selection-popup readline searchable-scrollback), 719 for qw(selection option-popup selection-popup readline searchable-scrollback);
722 map $_->[0], values %{ $TERM->{meta}{binding} };
723 720
724 for ($TERM->_keysym_resources) { 721 for ($TERM->_keysym_resources) {
725 next if /^(?:string|command|builtin|builtin-string|perl)/; 722 next if /^(?:string|command|builtin|builtin-string|perl)/;
726 next unless /^([A-Za-z0-9_\-]+):/; 723 next unless /^([A-Za-z0-9_\-]+):/;
727 724
736 } elsif (/^([^<]+)<(.*)>$/) { 733 } elsif (/^([^<]+)<(.*)>$/) {
737 push @{ $ext_arg{$1} }, $2; 734 push @{ $ext_arg{$1} }, $2;
738 735
739 } else { 736 } else {
740 $ext_arg{$_} ||= []; 737 $ext_arg{$_} ||= [];
741 }
742 }
743
744 # now register default key bindings
745 for my $ext (sort keys %ext_arg) {
746 while (my ($k, $v) = each %{ $TERM->{meta}{ext}{$ext}{binding} }) {
747 $TERM->bind_action ($k, "$v->[0]:$v->[1]");
748 } 738 }
749 } 739 }
750 740
751 for my $ext (sort keys %ext_arg) { 741 for my $ext (sort keys %ext_arg) {
752 my @files = grep -f $_, map "$_/$ext", @dirs; 742 my @files = grep -f $_, map "$_/$ext", @dirs;
1143sub scan_extensions { 1133sub scan_extensions {
1144 my ($self) = @_; 1134 my ($self) = @_;
1145 1135
1146 return if exists $self->{meta}; 1136 return if exists $self->{meta};
1147 1137
1148 my @libdirs = perl_libdirs $self; 1138 my @urxvtdirs = perl_libdirs $self;
1139 my @cpandirs = grep -d, map "$_/URxvt/Ext", @INC;
1149 1140
1150# return if $self->{meta_libdirs} eq join "\x00", @libdirs;#d#
1151
1152# $self->{meta_libdirs} = join "\x00", @libdirs;#d#
1153 $self->{meta} = \my %meta; 1141 $self->{meta} = \my %meta;
1154 1142
1155 # first gather extensions 1143 # first gather extensions
1156 for my $dir (reverse @libdirs) { 1144
1145 my $gather = sub {
1146 my ($dir, $core) = @_;
1147
1157 opendir my $fh, $dir 1148 opendir my $fh, $dir
1158 or next; 1149 or return;
1150
1159 for my $ext (readdir $fh) { 1151 for my $ext (readdir $fh) {
1160 $ext !~ /^\./ 1152 $ext !~ /^\./
1153 or next;
1154
1161 and open my $fh, "<", "$dir/$ext" 1155 open my $fh, "<", "$dir/$ext"
1156 or next;
1157
1158 -f $fh
1159 or next;
1160
1161 $ext =~ s/\.uext$// or $core
1162 or next; 1162 or next;
1163 1163
1164 my %ext = (dir => $dir); 1164 my %ext = (dir => $dir);
1165 1165
1166 while (<$fh>) { 1166 while (<$fh>) {
1170 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) { 1170 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) {
1171 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n"; 1171 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n";
1172 } else { 1172 } else {
1173 $ext{resource}{$pattern} = [$ext, $type, $desc]; 1173 $ext{resource}{$pattern} = [$ext, $type, $desc];
1174 } 1174 }
1175 } elsif (/^#:META:BINDING:(.*)/) {
1176 my ($keysym, $action) = split /:/, $1;
1177 $ext{binding}{$keysym} = [$ext, $action];
1178 } elsif (/^\s*(?:#|$)/) { 1175 } elsif (/^\s*(?:#|$)/) {
1179 # skip other comments and empty lines 1176 # skip other comments and empty lines
1180 } else { 1177 } else {
1181 last; # stop parsing on first non-empty non-comment line 1178 last; # stop parsing on first non-empty non-comment line
1182 } 1179 }
1183 } 1180 }
1184 1181
1185 $meta{ext}{$ext} = \%ext; 1182 $meta{ext}{$ext} = \%ext;
1186 } 1183 }
1187 } 1184 };
1188 1185
1186 $gather->($_, 0) for @cpandirs;
1187 $gather->($_, 1) for @urxvtdirs;
1188
1189 # and now merge resources and bindings 1189 # and now merge resources
1190
1191 $meta{resource} = \my %resource;
1192
1190 while (my ($k, $v) = each %{ $meta{ext} }) { 1193 while (my ($k, $v) = each %{ $meta{ext} }) {
1191 #TODO: should check for extensions overriding each other 1194 #TODO: should check for extensions overriding each other
1192 %{ $meta{resource} } = (%{ $meta{resource} }, %{ $v->{resource} }); 1195 %resource = (%resource, %{ $v->{resource} });
1193 %{ $meta{binding} } = (%{ $meta{binding} }, %{ $v->{binding} });
1194 } 1196 }
1195} 1197}
1196 1198
1197=item $term = new urxvt::term $envhashref, $rxvtname, [arg...] 1199=item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
1198 1200
1349=item $success = $term->bind_action ($key, $action) 1351=item $success = $term->bind_action ($key, $action)
1350 1352
1351Adds a key binding exactly as specified via a C<keysym> resource. See the 1353Adds a key binding exactly as specified via a C<keysym> resource. See the
1352C<keysym> resource in the urxvt(1) manpage. 1354C<keysym> resource in the urxvt(1) manpage.
1353 1355
1354To add default bindings for an extension, the extension should call C<< 1356To add default bindings for actions, an extension should call C<<
1355->bind_action >> on it's C<init> hook for every such binding. Doing it 1357->bind_action >> in its C<init> hook for every such binding. Doing it
1356in the C<init> hook allows users the override or remove the the binding 1358in the C<init> hook allows users to override or remove the binding
1357again. 1359again.
1358 1360
1359Example: the C<searchable-scrollback> by default binds itself 1361Example: the C<searchable-scrollback> by default binds itself
1360on C<Meta-s>, using C<< $self->bind_action >>, which calls C<< 1362on C<Meta-s>, using C<< $self->bind_action >>, which calls C<<
1361$term->bind_action >>. 1363$term->bind_action >>.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines