--- rxvt-unicode/src/urxvt.pm 2006/01/12 05:22:47 1.86 +++ rxvt-unicode/src/urxvt.pm 2006/01/18 19:44:22 1.106 @@ -42,11 +42,33 @@ =item selection (enabled by default) (More) intelligent selection. This extension tries to be more intelligent -when the user extends selections (double-click). Right now, it tries to -select urls and complete shell-quoted arguments, which is very convenient, -too, if your F supports C<--quoting-style=shell>. +when the user extends selections (double-click and further clicks). Right +now, it tries to select words, urls and complete shell-quoted +arguments, which is very convenient, too, if your F supports +C<--quoting-style=shell>. -It also offers the following bindable keyboard command: +A double-click usually selects the word under the cursor, further clicks +will enlarge the selection. + +The selection works by trying to match a number of regexes and displaying +them in increasing order of length. You can add your own regexes by +specifying resources of the form: + + URxvt.selection.pattern-0: perl-regex + URxvt.selection.pattern-1: perl-regex + ... + +The index number (0, 1...) must not have any holes, and each regex must +contain at least one pair of capturing parentheses, which will be used for +the match. For example, the followign adds a regex that matches everything +between two vertical bars: + + URxvt.selection.pattern-0: \\|([^|]+)\\| + +You can look at the source of the selection extension to see more +interesting uses, such as parsing a line from beginning to end. + +This extension also offers following bindable keyboard commands: =over 4 @@ -69,26 +91,88 @@ text into various other formats/action (such as uri unescaping, perl evalution, web-browser starting etc.), depending on content. +Other extensions can extend this popup menu by pushing a code reference onto +C<@urxvt::ext::selection_popup::hook>, that is called whenever the popup is displayed. + +It's sole argument is the popup menu, which can be modified. The selection +is in C<$_>, which can be used to decide wether 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 that transforms all Cs in +the selection to Cs, but only if the selection currently contains any +Cs: + + push urxvt::ext::selection_popup::hook, sub { + /a/ ? ("a to be" => sub { s/a/b/g } + : () + }; + =item searchable-scrollback (enabled by default) Adds regex search functionality to the scrollback buffer, triggered -by a hotkey (default: C). When in search mode, normal terminal -input/output is suspended. +by a hotkey (default: C). While in search mode, normal terminal +input/output is suspended and a regex is displayed at the bottom of the +screen. -C starts an incremental regex search, C searches further, C

or -C jump to the previous match, C jumps to the bottom and clears the -history, C leaves search mode at the current position and C -returns to the original position. +Inputting characters appends them to the regex and continues incremental +search. C removes a character from the regex, C and C +search upwards/downwards in the scrollback buffer, C jumps to the +bottom. C leaves search mode and returns to the point where search +was started, while C or C stay at the current position and +additionally stores the first match in the current line into the primary +selection. -=item digital-clock +=item selection-autotransform -Displays a digital clock using the built-in overlay. +This selection allows you to do automatic transforms on a selection +whenever a selection is made. + +It works by specifying perl snippets (most useful is a single C +operator) that modify C<$_> as resources: + + URxvt.selection-autotransform.0: transform + URxvt.selection-autotransform.1: transform + ... + +For example, the following will transform selections of the form +C, often seen in compiler messages, into C: + + URxvt.selection-autotransform.0: s/^([^:[:space:]]+):(\\d+):?$/vi +$2 \\Q$1\\E\\x0d/ + +And this example matches the same,but replaces it with vi-commands you can +paste directly into your (vi :) editor: + + URxvt.selection-autotransform.0: s/^([^:[:space:]]+(\\d+):?$/\\x1b:e \\Q$1\\E\\x0d:$2\\x0d/ + +Of course, this can be modified to suit your needs and your editor :) + +To expand the example above to typical perl error messages ("XXX at +FILENAME line YYY."), you need a slightly more elaborate solution: + + URxvt.selection.pattern-0: ( at .*? line \\d+\\.) + URxvt.selection-autotransform.0: s/^ at (.*?) line (\\d+)\\.$/\x1b:e \\Q$1\E\\x0d:$2\\x0d/ + +The first line tells the selection code to treat the unchanging part of +every error message as a selection pattern, and the second line transforms +the message into vi commands to load the file. =item mark-urls Uses per-line display filtering (C) to underline urls and make them clickable. When middle-clicked, the program specified in the -resource C (default C) will be started. +resource C (default C) will be started with +the URL as first argument. + +=item automove-background + +This is basically a one-line extension that dynamically changes the background pixmap offset +to the window position, in effect creating the same effect as pseudo transparency with +a custom pixmap. No scaling is supported in this mode. Exmaple: + + @@RXVT_NAME@@ -pixmap background.xpm -pe automove-background =item block-graphics-to-ascii @@ -96,12 +180,45 @@ by replacing all line-drawing characters (U+2500 .. U+259F) by a similar-looking ascii character. +=item digital-clock + +Displays a digital clock using the built-in overlay. + =item example-refresh-hooks Displays a very simple digital clock in the upper right corner of the window. Illustrates overwriting the refresh callbacks to create your own overlays or changes. +=item selection-pastebin + +This is a little rarely useful extension that Uploads the selection as +textfile to a remote site (or does other things). (The implementation is +not currently secure for use in a multiuser environment as it writes to +F directly.). + +It listens to the C keyboard command, +i.e. + + URxvt.keysym.C-M-e: perl:selection-pastebin:remote-pastebin + +Pressing this combination runs a command with C<%> replaced by the name of +the textfile. This command can be set via a resource: + + URxvt.selection-pastebin.cmd: rsync -apP % ruth:/var/www/www.ta-sa.org/files/txt/. + +And the default is likely not useful to anybody but the few people around +here :) + +The name of the textfile is the hex encoded md5 sum of the selection, so +the same content should lead to the same filename. + +After a successful upload the selection will be replaced by the text given +in the C resource (again, the % is the placeholder +for the filename): + + URxvt.selection-pastebin.url: http://www.ta-sa.org/files/txt/% + =back =head1 API DOCUMENTATION @@ -311,6 +428,12 @@ C action bound to it (see description of the B resource in the @@RXVT_NAME@@(1) manpage). +=item on_x_event $term, $event + +Called on every X event received on the vt window (and possibly other +windows). Should only be used as a last resort. Most event structure +members are not passed. + =item on_focus_in $term Called whenever the window gets the keyboard focus, before rxvt-unicode @@ -321,6 +444,8 @@ Called wheneever the window loses keyboard focus, before rxvt-unicode does focus out processing. +=item on_configure_notify $term, $event + =item on_key_press $term, $event, $keysym, $octets =item on_key_release $term, $event, $keysym @@ -415,12 +540,6 @@ Messages have a size limit of 1023 bytes currently. -=item $is_safe = urxvt::safe - -Returns true when it is safe to do potentially unsafe things, such as -evaluating perl code specified by the user. This is true when urxvt was -started setuid or setgid. - =item $time = urxvt::NOW Returns the "current time" (as per the event loop). @@ -431,6 +550,22 @@ Mod3Mask, Mod4Mask, Mod5Mask, Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask, AnyModifier +=item urxvt::NoEventMask, KeyPressMask, KeyReleaseMask, +ButtonPressMask, ButtonReleaseMask, EnterWindowMask, LeaveWindowMask, +PointerMotionMask, PointerMotionHintMask, Button1MotionMask, Button2MotionMask, +Button3MotionMask, Button4MotionMask, Button5MotionMask, ButtonMotionMask, +KeymapStateMask, ExposureMask, VisibilityChangeMask, StructureNotifyMask, +ResizeRedirectMask, SubstructureNotifyMask, SubstructureRedirectMask, +FocusChangeMask, PropertyChangeMask, ColormapChangeMask, OwnerGrabButtonMask + +=item urxvt::KeyPress, KeyRelease, ButtonPress, ButtonRelease, MotionNotify, +EnterNotify, LeaveNotify, FocusIn, FocusOut, KeymapNotify, Expose, +GraphicsExpose, NoExpose, VisibilityNotify, CreateNotify, DestroyNotify, +UnmapNotify, MapNotify, MapRequest, ReparentNotify, ConfigureNotify, +ConfigureRequest, GravityNotify, ResizeRequest, CirculateNotify, +CirculateRequest, PropertyNotify, SelectionClear, SelectionRequest, +SelectionNotify, ColormapNotify, ClientMessage, MappingNotify + Various constants for use in X calls and event processing. =back @@ -490,8 +625,6 @@ =cut BEGIN { - urxvt->bootstrap; - # overwrite perl's warn *CORE::GLOBAL::warn = sub { my $msg = join "", @_; @@ -507,7 +640,6 @@ $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin"; } -my @hook_count; my $verbosity = $ENV{URXVT_PERL_VERBOSITY}; sub verbose { @@ -515,24 +647,29 @@ warn "$msg\n" if $level <= $verbosity; } -my $extension_pkg = "extension0000"; my %extension_pkg; # load a single script into its own package, once only sub extension_package($) { my ($path) = @_; + no strict 'refs'; + $extension_pkg{$path} ||= do { - my $pkg = "urxvt::" . ($extension_pkg++); + $path =~ /([^\/\\]+)$/; + my $pkg = $1; + $pkg =~ s/[^[:word:]]/_/g; + $pkg = "urxvt::ext::$pkg"; verbose 3, "loading extension '$path' into package '$pkg'"; open my $fh, "<:raw", $path or die "$path: $!"; - my $source = untaint + @{"$pkg\::ISA"} = urxvt::term::extension::; + + my $source = "package $pkg; use strict; use utf8;\n" - . "use base urxvt::term::extension::;\n" . "#line 1 \"$path\"\n{\n" . (do { local $/; <$fh> }) . "\n};\n1"; @@ -605,13 +742,6 @@ } if ($htype == 1) { # DESTROY - if (my $hook = delete $TERM->{_hook}) { - for my $htype (0..$#$hook) { - $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} } - or set_should_invoke $htype, 0; - } - } - # clear package objects %$_ = () for values %{ $TERM->{_pkg} }; @@ -647,10 +777,8 @@ defined $htype or Carp::croak "unsupported hook type '$name'"; - unless (exists $self->{term}{_hook}[$htype]{$pkg}) { - $hook_count[$htype]++ - or urxvt::set_should_invoke $htype, 1; - } + $self->set_should_invoke ($htype, +1) + unless exists $self->{term}{_hook}[$htype]{$pkg}; $self->{term}{_hook}[$htype]{$pkg} = $cb; } @@ -665,10 +793,8 @@ defined $htype or Carp::croak "unsupported hook type '$name'"; - if (delete $self->{term}{_hook}[$htype]{$pkg}) { - --$hook_count[$htype] - or urxvt::set_should_invoke $htype, 0; - } + $self->set_should_invoke ($htype, -1) + if delete $self->{term}{_hook}[$htype]{$pkg}; } } @@ -835,10 +961,10 @@ borderLess console cursorBlink cursorUnderline hold iconic insecure intensityStyles jumpScroll loginShell mapAlert meta8 mouseWheelScrollPage - pastableTabs pointerBlank reverseVideo scrollBar scrollBar_floating - scrollBar_right scrollTtyKeypress scrollTtyOutput scrollWithBuffer - secondaryScreen secondaryScroll skipBuiltinGlyphs transparent - tripleclickwords utmpInhibit visualBell + override-redirect pastableTabs pointerBlank reverseVideo scrollBar + scrollBar_floating scrollBar_right scrollTtyKeypress scrollTtyOutput + scrollWithBuffer secondaryScreen secondaryScroll skipBuiltinGlyphs + transparent tripleclickwords utmpInhibit visualBell =item $value = $term->resource ($name[, $newval]) @@ -865,14 +991,15 @@ borderLess color cursorBlink cursorUnderline cutchars delete_key display_name embed ext_bwidth fade font geometry hold iconName imFont imLocale inputMethod insecure int_bwidth intensityStyles - italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier - mouseWheelScrollPage name pastableTabs path perl_eval perl_ext_1 perl_ext_2 - perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd - reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating - scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput - scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle - shade term_name title transparent transparent_all tripleclickwords - utmpInhibit visualBell + italicFont jumpScroll lineSpace loginShell mapAlert meta8 modifier + mouseWheelScrollPage name override_redirect pastableTabs path perl_eval + perl_ext_1 perl_ext_2 perl_lib pointerBlank pointerBlankDelay + preeditType print_pipe pty_fd reverseVideo saveLines scrollBar + scrollBar_align scrollBar_floating scrollBar_right scrollBar_thickness + scrollTtyKeypress scrollTtyOutput scrollWithBuffer scrollstyle + secondaryScreen secondaryScroll selectstyle shade term_name title + transient_for transparent transparent_all tripleclickwords utmpInhibit + visualBell =cut @@ -1083,6 +1210,13 @@ Return the window id of the terminal window. +=item $term->vt_emask_add ($x_event_mask) + +Adds the specified events to the vt event mask. Useful e.g. when you want +to receive pointer events all the times: + + $term->vt_emask_add (urxvt::PointerMotionMask); + =item $window_width = $term->width =item $window_height = $term->height @@ -1105,7 +1239,7 @@ =item $nrow_plus_saveLines = $term->total_rows -=item $lines_in_scrollback = $term->nsaved +=item $topmost_scrollback_row = $term->top_row Return various integers describing terminal characteristics. @@ -1143,8 +1277,8 @@ =item $view_start = $term->view_start ([$newvalue]) -Returns the negative row number of the topmost line. Minimum value is -C<0>, which displays the normal terminal contents. Larger values scroll +Returns the row number of the topmost displayed line. Maximum value is +C<0>, which displays the normal terminal contents. Lower values scroll this many lines into the scrollback buffer. =item $term->want_refresh @@ -1467,8 +1601,10 @@ delete $env->{LC_ALL}; $env->{LC_CTYPE} = $self->{term}->locale; - urxvt::term->new ($env, $self->{term}->resource ("name"), - "--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0, + urxvt::term->new ($env, "popup", + "--perl-lib" => "", "--perl-ext-common" => "", + "-pty-fd" => -1, "-sl" => 0, + "-b" => 1, "-bd" => "grey80", "-bl", "-override-redirect", "--transient-for" => $self->{term}->parent, "-display" => $self->{term}->display_id, "-pe" => "urxvt-popup") @@ -1531,6 +1667,10 @@ Set the event trigger time to C<$tstamp> and start the timer. +=item $timer = $timer->after ($delay) + +Like C, but sets the expiry timer to c. + =item $timer = $timer->stop Stop the timer.