home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 December (Special) / PCWorld_2005-12_Special_cd.bin / Bezpecnost / lsti / lsti.exe / framework-2.5.exe / Emacs.pm < prev    next >
Text File  |  2005-04-27  |  3KB  |  144 lines

  1. package Term::ReadLine::Zoid::Emacs;
  2.  
  3. use strict;
  4. use base 'Term::ReadLine::Zoid';
  5.  
  6. our $VERSION = 0.01;
  7.  
  8. =head1 NAME
  9.  
  10. Term::ReadLine::Zoid::Emacs - a readline emacs mode
  11.  
  12. =head1 SYNOPSIS
  13.  
  14. This class is used as a mode under L<Term::ReadLine::Zoid>,
  15. see there for usage details.
  16.  
  17. =head1 DESCRIPTION
  18.  
  19. This mode provides some emacs key-bindings, taking the L<bash>(1)
  20. implementation as a reference.
  21.  
  22. This module also provides a 'emac_multiline' key map.
  23.  
  24. =head1 KEY MAPPING
  25.  
  26. These bindings are additional to those in L<Term::ReadLine::Zoid> which
  27. already contains some emacs key bindings.
  28.  
  29. =over 4
  30.  
  31. =cut
  32.  
  33. our %_keymap = (
  34.     ctrl_Q    => 'quoted_insert',
  35.     escape    => 'prefix_meta',
  36.     meta_f    => 'forward_word',
  37.     meta_b    => 'backward_word',
  38.     ctrl_X  => 'prefix_key',
  39.     ctrl_X_ctrl_V => 'switch_mode_command',
  40.     _isa    => 'insert',
  41. );
  42.  
  43. our %_m_keymap;
  44.  
  45. sub keymap {
  46.     return \%_keymap unless $_[1] =~ /multiline/;
  47.     unless (%_m_keymap) {
  48.         %_m_keymap = %_keymap;
  49.         $_m_keymap{_isa} = 'multiline';
  50.     }
  51.     return \%_m_keymap;
  52. }
  53.  
  54. =item escape, ^[  (I<prefix_meta>)
  55.  
  56. =cut
  57.  
  58. sub prefix_meta { $_[0]->prefix_key('meta') }
  59.  
  60. sub prefix_key {
  61.     my ($self, $pre) = @_;
  62.     my ($key, $cnt);
  63.     until ($key) {
  64.         my $k = $self->read_key();
  65.         if ($k =~ /^[\-\d]+$/) { $cnt .= $k }
  66.         else { $key = $self->key_name( $k ) }
  67.     }
  68.     $self->do_key($pre.'_'.$key, $cnt);
  69. }
  70.  
  71. =item meta-f  (I<forward_word>)
  72.  
  73. =item meta-b  (I<backward_word>)
  74.  
  75. =cut
  76.  
  77. sub forward_word { # simple version of vi_E
  78.     my ($self, undef, $cnt) = @_;
  79.     $cnt ||= 1;
  80.     my $l = $$self{lines}[ $$self{pos}[1] ];
  81.     for (1 .. $cnt) {
  82.         if ($l =~ /^.{$$self{pos}[0]}(\w?.*?\w+)/) { $$self{pos}[0] += length($1) }
  83.         else {
  84.             $self->end_of_line();
  85.             last;
  86.         }
  87.     }
  88.     return 1;
  89. }
  90.  
  91. sub backward_word { # simple version of vi_B
  92.     my ($self, undef, $cnt) = @_;
  93.     $cnt ||= 1;
  94.     my $l = $$self{lines}[ $$self{pos}[1] ];
  95.     for (1 .. $cnt) {
  96.         $l = substr($l, 0, $$self{pos}[0]);
  97.         if ($l =~ /(\w+[^\w]*)$/) { $$self{pos}[0] -= length $1 }
  98.         else {
  99.             $self->beginning_of_line;
  100.             last;
  101.         }
  102.     }
  103.     return 1;
  104. }
  105.  
  106. 1;
  107.  
  108. __END__
  109.  
  110. =item ^X^V  (I<switch_mode_command>)
  111.  
  112. Enter (vi) command mode. Taken from L<zsh>(1).
  113.  
  114. =item ^V, ^Q  (I<quoted_insert>)
  115.  
  116. Insert next key literally, ignoring any key-bindings.
  117.  
  118. WARNING: control or escape chars in the editline can cause unexpected results
  119.  
  120. =back
  121.  
  122. =head1 TODO
  123.  
  124. Get count args right (see bash reference)
  125.  
  126. A lot more bindings
  127.  
  128. A emacs multiline mode
  129.  
  130. =head1 AUTHOR
  131.  
  132. Jaap Karssenberg (Pardus) E<lt>pardus@cpan.orgE<gt>
  133.  
  134. Copyright (c) 2004 Jaap G Karssenberg. All rights reserved.
  135. This program is free software; you can redistribute it and/or
  136. modify it under the same terms as Perl itself.
  137.  
  138. =head1 SEE ALSO
  139.  
  140. L<Term::ReadLine::Zoid>
  141.  
  142. =cut
  143.  
  144.