mini_readline 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f2544e80871d4cdeb122d167832d6e09c74fbb3
4
- data.tar.gz: e072a14bf924b8f046355c499655230b220f9a3f
3
+ metadata.gz: 18650c39506de94d12cb3f292413549722ec55fb
4
+ data.tar.gz: 7cba8a96b929d75870ee5eeb5b7f20d0b0eb04c8
5
5
  SHA512:
6
- metadata.gz: c8d40fe8058e368fa90d7aeb1216706fbac6de549f888fe0e91acfd59801a6d6de831c66f895f7ec6894af2fd9559174dcf457f2a0c06c8b565047c0df148aa6
7
- data.tar.gz: 1b28d4f253743d843f3697c1116008d76dc9c9c9ba7081a36ccf893012399ce83fae0cea41b0ae8c93996a93afb75559da6d2b0ba330c5a30a39f3d295ce56d1
6
+ metadata.gz: b859c1130980260216186916fb5f23a3375ac1973fb3748cebe665890684a2a63dee2edabf771974ddb67049722902709583d93164f25d3bff328b10216b2ce1
7
+ data.tar.gz: de055b2fb3843cea35b0358d8f6f735d1c90591f714b69b26f1a2511985676b002e4bf6beddf028691059e35e7f4bce9e5ae409b5e24a4dfd84884db07cf0b16
data/README.md CHANGED
@@ -18,6 +18,8 @@ that I will see the same bugs and fix them. Then perhaps it can be seen how
18
18
  the original code can also be fixed. In the long run, this is perhaps the
19
19
  most important goal.
20
20
 
21
+ <br>The mini_readline gem is designed for use with MRI version 1.9.3 or later.
22
+
21
23
  ## Installation
22
24
 
23
25
  Add this line to your application's Gemfile:
@@ -34,6 +36,29 @@ Or install it yourself as:
34
36
 
35
37
  $ gem install mini_readline
36
38
 
39
+ ## Key Mappings
40
+ The mini_readline gem supports a simple set of editing commands. These vary
41
+ somewhat based on the system platform. The keyboard mappings (and alias
42
+ mappings) are listed below:
43
+
44
+ Editor Action | Windows Key | Other Key
45
+ -----------------|---------------------------|------------
46
+ Enter | Enter | Enter
47
+ Left | Left Arrow, Keypad Left | Left Arrow
48
+ Right | Right Arrow, Keypad Right | Right Arrow
49
+ Go to start | Home, Keypad Home | Home, Ctrl-A
50
+ Go to end | End, Keypad End | End, Ctrl-E
51
+ Previous History | Up Arrow, Keypad Up | Up Arrow, Ctrl-R
52
+ Next History | Down Arrow, Keypad Down | Down Arrow
53
+ Erase Left | Backspace | Backspace, Ctrl-H
54
+ Erase Right | Delete, Ctrl-Backspace | Delete, Ctrl-Backspace
55
+ Erase All | Escape | Ctrl-B
56
+
57
+ ### Notes
58
+ * The label "Other" is an umbrella that bundles together the Linux, Mac,
59
+ and Cygwin platforms.
60
+ * References to Keypad keys under Windows assume that Num Lock is not engaged.
61
+
37
62
  ## Usage
38
63
 
39
64
  The typical way of utilizing this gem is to place the following:
@@ -1,14 +1,40 @@
1
1
  # coding: utf-8
2
2
 
3
- #Select the type of platform in use.
4
- if (RUBY_PLATFORM =~ /\bcygwin\b/i) || (RUBY_PLATFORM !~ /mswin|mingw/)
5
- require_relative 'raw_term/other'
6
- else
7
- require_relative 'raw_term/windows'
8
- end
3
+ require_relative 'raw_term/mapper'
9
4
 
10
5
  #* raw_term.rb - Platform determination for raw terminal access.
11
6
  module MiniReadline
7
+
8
+ #The class used to manipulate console i/o on a low level.
9
+ class RawTerm
10
+
11
+ #Create a mapper.
12
+ MAP = Mapper.new
13
+
14
+ #Map the printable characters.
15
+ (32..126).each do |code|
16
+ char = code.chr
17
+ MAP[char] = [:insert_text, char]
18
+ end
19
+
20
+ #Get a mapped sequence.
21
+ def get_mapped_keystroke
22
+ MAP.get_mapped_keystroke {get_raw_char}
23
+ end
24
+
25
+ #Start on a new line.
26
+ def put_new_line
27
+ print("\n")
28
+ end
29
+ end
30
+
31
+ #Select the type of platform in use.
32
+ if (RUBY_PLATFORM =~ /\bcygwin\b/i) || (RUBY_PLATFORM !~ /mswin|mingw/)
33
+ require_relative 'raw_term/other'
34
+ else
35
+ require_relative 'raw_term/windows'
36
+ end
37
+
12
38
  #Get an instance of a raw terminal controller object.
13
39
  BASE_OPTIONS[:term] = RawTerm.new
14
40
  end
@@ -0,0 +1,43 @@
1
+ # coding: utf-8
2
+
3
+ #* raw_term/mapper.rb - Support for keystroke mapping.
4
+ module MiniReadline
5
+
6
+ #* raw_term/mapper.rb - Support for keystroke mapping.
7
+ class Mapper
8
+
9
+ #Set up the keystroke mapper.
10
+ def initialize
11
+ @map = Hash.new {|_hash, key| [:unmapped, key]}
12
+ end
13
+
14
+ #Add a map entry
15
+ def []=(index, value)
16
+ process_non_terminals(index)
17
+ @map[index] = value
18
+ end
19
+
20
+ #Handle the preamble characters in the command sequence.
21
+ def process_non_terminals(index)
22
+ seq = ""
23
+
24
+ index.chop.chars.each do |char|
25
+ seq << char
26
+ fail "Ambiguous entry #{index.inspect}" if @map.has_key?(seq) && @map[seq]
27
+ @map[seq] = false
28
+ end
29
+ end
30
+
31
+ #Get a mapped input sequence.
32
+ def get_mapped_keystroke
33
+ key_seq, key_cmd = "", nil
34
+
35
+ begin
36
+ key_seq << yield
37
+ key_cmd = @map[key_seq]
38
+ end until key_cmd
39
+
40
+ key_cmd
41
+ end
42
+ end
43
+ end
@@ -19,10 +19,6 @@ module MiniReadline
19
19
  #Bell
20
20
  BELL = "\x07"
21
21
 
22
- #Set up the Other Raw Terminal.
23
- def initialize
24
- end
25
-
26
22
  #Output a string
27
23
  def put_string(str)
28
24
  scan_string(str)
@@ -34,11 +30,6 @@ module MiniReadline
34
30
  put_string CARRIAGE_RETURN
35
31
  end
36
32
 
37
- #Start on a new line.
38
- def put_new_line
39
- print("\n")
40
- end
41
-
42
33
  #Sound a beep
43
34
  def beep
44
35
  print BELL
@@ -6,20 +6,6 @@ module MiniReadline
6
6
  #* other/map.rb - Character mapping for other systems.
7
7
  class RawTerm
8
8
 
9
- #Create a hash with a default value.
10
- MAP = Hash.new {|_hash, key| [:unmapped, key]}
11
-
12
- #Map the printable characters.
13
- (32..126).each do |code|
14
- char = code.chr
15
- MAP[char] = [:insert_text, char]
16
- end
17
-
18
- #Map the non-terminal entries.
19
- MAP["\e"] = false
20
- MAP["\e["] = false
21
- MAP["\eO"] = false
22
-
23
9
  #Map the non-printing characters.
24
10
 
25
11
  #Left Arrows
@@ -33,6 +19,7 @@ module MiniReadline
33
19
  #Up Arrows
34
20
  MAP["\e[A"] = [:previous_history]
35
21
  MAP["\eOA"] = [:previous_history]
22
+ MAP["\x12"] = [:previous_history]
36
23
 
37
24
  #Down Arrows
38
25
  MAP["\e[B"] = [:next_history]
@@ -41,17 +28,19 @@ module MiniReadline
41
28
  #The Home keys
42
29
  MAP["\e[H"] = [:go_home]
43
30
  MAP["\eOH"] = [:go_home]
31
+ MAP["\x01"] = [:go_home]
44
32
 
45
33
  #The End keys
46
34
  MAP["\e[F"] = [:go_end]
47
35
  MAP["\eOF"] = [:go_end]
36
+ MAP["\x05"] = [:go_end]
48
37
 
49
38
  #The Backspace key
50
39
  MAP["\x7F"] = [:delete_left]
40
+ MAP["\x08"] = [:delete_left]
51
41
 
52
42
  #The Delete keys
53
43
  MAP["\x1F"] = [:delete_right]
54
- MAP["\e[3"] = false
55
44
  MAP["\e[3~"] = [:delete_right]
56
45
 
57
46
  #The Enter key
@@ -59,17 +48,5 @@ module MiniReadline
59
48
 
60
49
  #The Cancel key
61
50
  MAP["\x02"] = [:cancel]
62
-
63
- #Get a mapped sequence.
64
- def get_mapped_keystroke
65
- key_seq, key_cmd = "", nil
66
-
67
- begin
68
- key_seq << get_raw_char
69
- key_cmd = MAP[key_seq]
70
- end until key_cmd
71
-
72
- key_cmd
73
- end
74
51
  end
75
52
  end
@@ -27,21 +27,15 @@ module MiniReadline
27
27
  @_getch = Win32API.new("msvcrt", "_getch", [])
28
28
  @_kbhit = Win32API.new("msvcrt", "_kbhit", [])
29
29
  @_beep = Win32API.new("user32", "MessageBeep", ['L'])
30
-
31
- @_set_cursor_posn = Win32API.new("kernel32",
32
- "SetConsoleCursorPosition",
30
+ @_set_cursor_posn = Win32API.new("kernel32", "SetConsoleCursorPosition",
33
31
  ['L','L'])
34
-
35
- @_get_screen_info = Win32API.new("kernel32",
36
- "GetConsoleScreenBufferInfo",
32
+ @_get_screen_info = Win32API.new("kernel32", "GetConsoleScreenBufferInfo",
37
33
  ['L','P'])
38
-
39
34
  @_get_handle = Win32API.new("kernel32", "GetStdHandle", ['L'])
40
35
  end
41
36
 
42
37
  #Output a string
43
38
  def put_string(str)
44
- scan_string(str) unless @_out_handle
45
39
  print(str)
46
40
  end
47
41
 
@@ -51,38 +45,18 @@ module MiniReadline
51
45
  put_string CARRIAGE_RETURN
52
46
  end
53
47
 
54
- #Start on a new line.
55
- def put_new_line
56
- print("\n")
57
- end
58
-
59
48
  #Sound a beep
60
49
  def beep
61
50
  @_beep.call(0)
62
51
  end
63
52
 
64
- #Wait for a key to be pressed.
65
- def wait_for_key
53
+ #Get a uncooked character keystroke.
54
+ def get_raw_char
66
55
  while (@_kbhit.call == 0)
67
56
  sleep(WAIT_SLEEP)
68
57
  end
69
- end
70
58
 
71
- #Get a uncooked character keystroke.
72
- def get_raw_char
73
- wait_for_key
74
59
  @_getch.call.chr
75
60
  end
76
-
77
- #Determine the affect of a string on the cursor.
78
- def scan_string(str)
79
- str.chars.each do |char|
80
- if char == CARRIAGE_RETURN
81
- @cursor_posn = 0
82
- else
83
- @cursor_posn += 1
84
- end
85
- end
86
- end
87
61
  end
88
62
  end
@@ -6,21 +6,8 @@ module MiniReadline
6
6
  #* windows/map.rb - Character mapping for windows systems.
7
7
  class RawTerm
8
8
 
9
- #Create a hash with a default value.
10
- MAP = Hash.new {|_hash, key| [:unmapped, key]}
11
-
12
- #Map the printable characters.
13
- (32..126).each do |code|
14
- char = code.chr
15
- MAP[char] = [:insert_text, char]
16
- end
17
-
18
9
  pfx = 0xE0.chr
19
10
 
20
- #Map the non-terminal entries.
21
- MAP["\x00"] = false
22
- MAP[ pfx ] = false
23
-
24
11
  #Map the non-printing characters.
25
12
 
26
13
  #Left Arrows
@@ -60,12 +47,5 @@ module MiniReadline
60
47
 
61
48
  #The Escape key
62
49
  MAP["\x1B"] = [:cancel]
63
-
64
- #Get a mapped sequence.
65
- def get_mapped_keystroke
66
- first_char = get_raw_char
67
-
68
- MAP[first_char] || MAP[first_char + get_raw_char]
69
- end
70
50
  end
71
51
  end
@@ -6,17 +6,8 @@ module MiniReadline
6
6
  #* windows/set_posn.rb - Set the column of the cursor.
7
7
  class RawTerm
8
8
 
9
- #Set the position of the screen cursor within the line.
10
- def set_posn(new_posn)
11
- if @_out_handle
12
- api_set_posn(new_posn)
13
- else
14
- term_set_posn(new_posn)
15
- end
16
- end
17
-
18
9
  #Move the cursor using windows voodoo API.
19
- def api_set_posn(new_posn)
10
+ def set_posn(new_posn)
20
11
  raw_buffer = 0.chr * 24
21
12
  @_get_screen_info.call(@_out_handle, raw_buffer)
22
13
  y_posn = (raw_buffer[6,2].unpack('S'))[0]
@@ -24,17 +15,5 @@ module MiniReadline
24
15
  @_set_cursor_posn.call(@_out_handle, y_posn * 65536 + new_posn)
25
16
  end
26
17
 
27
- #Move the cursor using terminal primitives.
28
- def term_set_posn(new_posn)
29
-
30
- if new_posn > @cursor_posn
31
- print("\e#{new_posn - @cursor_posn}C")
32
- elsif new_posn < @cursor_posn
33
- print("\e#{@cursor_posn - new_posn}D")
34
- end
35
-
36
- @cursor_posn = new_posn
37
- end
38
-
39
18
  end
40
19
  end
@@ -45,10 +45,8 @@ module MiniReadline
45
45
 
46
46
  #Append a string to the history buffer if enabled.
47
47
  def append_history(str)
48
- str_strip = str.strip
49
-
50
- return if (str_strip == '') && @options[:no_blanks]
51
- return if (history.include?(str_strip)) && @options[:no_dups]
48
+ return if @options[:no_blanks] && str.strip.empty?
49
+ history.delete(str) if @options[:no_dups]
52
50
 
53
51
  history << str
54
52
  end
@@ -1,4 +1,4 @@
1
1
  module MiniReadline
2
2
  #The current version of the mini_readline gem.
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
@@ -10,7 +10,11 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["peter.c.camilleri@gmail.com"]
11
11
 
12
12
  spec.summary = "A simplified replacement for readline."
13
- spec.description = "A gem for console command entry with line edit and history."
13
+ spec.description = "A gem for console command entry with line edit and " +
14
+ "history. This gem is like the standard readline " +
15
+ "gem except that it has been redesigned, simplified, " +
16
+ "and extensively cleaned up."
17
+
14
18
  spec.homepage = "http://teuthida-technologies.com/"
15
19
  spec.license = "MIT"
16
20
 
data/sire.rb CHANGED
@@ -10,7 +10,7 @@ elsif ARGV[0] == 'local'
10
10
  require './lib/mini_readline'
11
11
  puts "\nOption(local). Loaded mini_readline from the local code folder."
12
12
  elsif defined?(MiniReadline)
13
- puts "The mini_readline gem is already loaded."
13
+ puts "\nThe mini_readline gem is already loaded."
14
14
  else
15
15
  begin
16
16
  require 'mini_readline'
@@ -57,6 +57,12 @@ class SIRE
57
57
  "Bye bye for now!"
58
58
  end
59
59
 
60
+ #Get a mapped keystroke.
61
+ def g
62
+ print 'Press a key:'
63
+ MiniReadline::BASE_OPTIONS[:term].get_mapped_keystroke
64
+ end
65
+
60
66
  #Test spawning a process. This breaks the regular readline gem.
61
67
  def run(command)
62
68
  IO.popen(command, "r+") do |io|
@@ -17,6 +17,7 @@ class MiniReadlineTester < Minitest::Test
17
17
  assert_equal(Class, MiniReadline::Readline.class)
18
18
  assert_equal(Class, MiniReadline::Edit.class)
19
19
  assert_equal(Class, MiniReadline::EditWindow.class)
20
+ assert_equal(Class, MiniReadline::Mapper.class)
20
21
  end
21
22
 
22
23
  def test_platform_detection
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_readline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-09 00:00:00.000000000 Z
11
+ date: 2016-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,7 +38,9 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
- description: A gem for console command entry with line edit and history.
41
+ description: A gem for console command entry with line edit and history. This gem
42
+ is like the standard readline gem except that it has been redesigned, simplified,
43
+ and extensively cleaned up.
42
44
  email:
43
45
  - peter.c.camilleri@gmail.com
44
46
  executables: []
@@ -53,6 +55,7 @@ files:
53
55
  - lib/mini_readline.rb
54
56
  - lib/mini_readline/options.rb
55
57
  - lib/mini_readline/raw_term.rb
58
+ - lib/mini_readline/raw_term/mapper.rb
56
59
  - lib/mini_readline/raw_term/other.rb
57
60
  - lib/mini_readline/raw_term/other/map.rb
58
61
  - lib/mini_readline/raw_term/other/set_posn.rb