mini_readline 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +9 -37
- data/lib/mini_readline.rb +14 -10
- data/lib/mini_readline/exceptions.rb +0 -3
- data/lib/mini_readline/maps.rb +126 -0
- data/lib/mini_readline/options.rb +3 -7
- data/lib/mini_readline/read_line.rb +17 -25
- data/lib/mini_readline/read_line/edit.rb +10 -11
- data/lib/mini_readline/read_line/edit/auto_complete.rb +7 -7
- data/lib/mini_readline/read_line/edit/auto_complete/array_source.rb +7 -7
- data/lib/mini_readline/read_line/edit/auto_complete/auto_file_source.rb +19 -19
- data/lib/mini_readline/read_line/edit/auto_complete/auto_manager.rb +5 -5
- data/lib/mini_readline/read_line/edit/auto_complete/file_folder_source.rb +6 -6
- data/lib/mini_readline/read_line/edit/auto_complete/quoted_file_folder_source.rb +7 -7
- data/lib/mini_readline/read_line/edit/cancel.rb +3 -3
- data/lib/mini_readline/read_line/edit/delete_all_left.rb +4 -4
- data/lib/mini_readline/read_line/edit/delete_all_right.rb +4 -4
- data/lib/mini_readline/read_line/edit/delete_left.rb +4 -4
- data/lib/mini_readline/read_line/edit/delete_right.rb +4 -4
- data/lib/mini_readline/read_line/edit/edit_window.rb +17 -19
- data/lib/mini_readline/read_line/edit/edit_window/sync_cursor.rb +4 -4
- data/lib/mini_readline/read_line/edit/edit_window/sync_window.rb +9 -9
- data/lib/mini_readline/read_line/edit/end_of_input.rb +4 -4
- data/lib/mini_readline/read_line/edit/enter.rb +3 -3
- data/lib/mini_readline/read_line/edit/go_end.rb +3 -3
- data/lib/mini_readline/read_line/edit/go_home.rb +3 -3
- data/lib/mini_readline/read_line/edit/go_left.rb +4 -4
- data/lib/mini_readline/read_line/edit/go_right.rb +4 -4
- data/lib/mini_readline/read_line/edit/insert_text.rb +3 -3
- data/lib/mini_readline/read_line/edit/next_history.rb +4 -4
- data/lib/mini_readline/read_line/edit/previous_history.rb +4 -4
- data/lib/mini_readline/read_line/edit/unmapped.rb +4 -4
- data/lib/mini_readline/read_line/edit/word_left.rb +4 -4
- data/lib/mini_readline/read_line/edit/word_right.rb +4 -4
- data/lib/mini_readline/read_line/history.rb +9 -9
- data/lib/mini_readline/read_line/no_history.rb +8 -8
- data/lib/mini_readline/read_line/prompt.rb +7 -7
- data/lib/mini_readline/version.rb +7 -1
- data/mini_readline.gemspec +5 -4
- data/rakefile.rb +8 -23
- data/sire.rb +1 -1
- data/tests/mini_readline_tests.rb +13 -14
- metadata +23 -34
- data/lib/mini_readline/raw_term.rb +0 -47
- data/lib/mini_readline/raw_term/ansi.rb +0 -70
- data/lib/mini_readline/raw_term/ansi/map.rb +0 -68
- data/lib/mini_readline/raw_term/ansi/set_posn.rb +0 -22
- data/lib/mini_readline/raw_term/ansi/window_width.rb +0 -17
- data/lib/mini_readline/raw_term/mapped_term.rb +0 -23
- data/lib/mini_readline/raw_term/mapped_term/mapper.rb +0 -53
- data/lib/mini_readline/raw_term/windows.rb +0 -100
- data/lib/mini_readline/raw_term/windows/map.rb +0 -63
- data/lib/mini_readline/raw_term/windows/set_posn.rb +0 -19
- data/lib/mini_readline/raw_term/windows/win_32_api.rb +0 -31
- data/lib/mini_readline/raw_term/windows/window_width.rb +0 -17
@@ -1,17 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* ansi/window_width.rb - Determine the available screen width.
|
4
|
-
module MiniReadline
|
5
|
-
|
6
|
-
#* ansi/window_width.rb - Determine the available screen width.
|
7
|
-
class RawTerm
|
8
|
-
|
9
|
-
#Determine the available screen width.
|
10
|
-
#<br>Endemic Code Smells
|
11
|
-
#* :reek:UtilityFunction
|
12
|
-
def window_width
|
13
|
-
IO.console.winsize[1]
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
require_relative 'mapped_term/mapper'
|
4
|
-
|
5
|
-
#* raw_term/mapped_term.rb - Base class for a terminal with key mapping.
|
6
|
-
module MiniReadline
|
7
|
-
|
8
|
-
#The class used for terminal i/o that is mapped to command sequences.
|
9
|
-
class RawTerm
|
10
|
-
|
11
|
-
#Create a mapper.
|
12
|
-
MAP = Mapper.new
|
13
|
-
|
14
|
-
#Set up the printable characters.
|
15
|
-
MAP.map_ascii(:insert_text)
|
16
|
-
|
17
|
-
#Get a mapped sequence.
|
18
|
-
def get_mapped_keystroke
|
19
|
-
MAP.get_mapped_keystroke {get_raw_char}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
@@ -1,53 +0,0 @@
|
|
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
|
-
fail MiniReadlineKME, "Duplicate entry #{index.inspect}" if @map.has_key?(index)
|
18
|
-
@map[index] = value
|
19
|
-
end
|
20
|
-
|
21
|
-
#Map the printable ascii key codes to a command.
|
22
|
-
def map_ascii(command)
|
23
|
-
#Map the printable characters.
|
24
|
-
(32..126).each do |code|
|
25
|
-
value = [command, char = code.chr]
|
26
|
-
self[char] = value
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
#Handle the preamble characters in the command sequence.
|
31
|
-
def process_non_terminals(index)
|
32
|
-
seq = ""
|
33
|
-
|
34
|
-
index.chop.chars.each do |char|
|
35
|
-
seq << char
|
36
|
-
fail MiniReadlineKME, "Ambiguous entry #{index.inspect}" if @map.has_key?(seq) && @map[seq]
|
37
|
-
@map[seq] = false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
#Get a mapped input sequence.
|
42
|
-
def get_mapped_keystroke
|
43
|
-
key_seq, key_cmd = "", nil
|
44
|
-
|
45
|
-
begin
|
46
|
-
key_seq << yield
|
47
|
-
key_cmd = @map[key_seq]
|
48
|
-
end until key_cmd
|
49
|
-
|
50
|
-
key_cmd
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
if MiniReadline::TERM_JAVA
|
4
|
-
require 'win32api'
|
5
|
-
else
|
6
|
-
require_relative 'windows/win_32_api'
|
7
|
-
end
|
8
|
-
|
9
|
-
require_relative 'mapped_term'
|
10
|
-
require_relative 'windows/map'
|
11
|
-
require_relative 'windows/set_posn'
|
12
|
-
require_relative 'windows/window_width'
|
13
|
-
|
14
|
-
#* raw_term/windows.rb - Support for raw terminal access in windows systems.
|
15
|
-
module MiniReadline
|
16
|
-
|
17
|
-
#The detected platform is windows.
|
18
|
-
PLATFORM = :windows
|
19
|
-
|
20
|
-
#The class used to manipulate console i/o on a low level.
|
21
|
-
class RawTerm
|
22
|
-
|
23
|
-
#The sleep interval waiting for a key to be pressed.
|
24
|
-
WAIT_SLEEP = 0.02
|
25
|
-
|
26
|
-
CARRIAGE_RETURN = "\x0D"
|
27
|
-
|
28
|
-
#The magic number for standard out.
|
29
|
-
STD_OUTPUT_HANDLE = -11
|
30
|
-
|
31
|
-
#Set up the Windows Raw Terminal.
|
32
|
-
#<br>Singleton Methods Added:
|
33
|
-
#* getch - Low-level get char.
|
34
|
-
#* kbhit - Low-level keyboard hit test.
|
35
|
-
#* beep - Low-level beep.
|
36
|
-
#* set_cursor_posn - Set the cursor position given coordinates (y*65536+x).
|
37
|
-
#* get_screen_info - Get info about the console.
|
38
|
-
#* get_handle - Get the internal handle associated with a file index.
|
39
|
-
def initialize
|
40
|
-
getch_proc = Win32API.new("msvcrt", "_getch", [], 'I')
|
41
|
-
define_singleton_method(:getch) { getch_proc.call.chr }
|
42
|
-
|
43
|
-
kbhit_proc = Win32API.new("msvcrt", "_kbhit", [], 'I')
|
44
|
-
define_singleton_method(:kbhit) { kbhit_proc.call }
|
45
|
-
|
46
|
-
beep_proc = Win32API.new("user32", "MessageBeep", ['L'], '0')
|
47
|
-
define_singleton_method(:beep) { beep_proc.call(0) }
|
48
|
-
|
49
|
-
set_cursor_posn_proc = Win32API.new("kernel32",
|
50
|
-
"SetConsoleCursorPosition",
|
51
|
-
['L','L'], 'L')
|
52
|
-
|
53
|
-
define_singleton_method(:set_cursor_posn) do |position|
|
54
|
-
set_cursor_posn_proc.call(@_out_handle, position)
|
55
|
-
end
|
56
|
-
|
57
|
-
get_screen_info_proc = Win32API.new("kernel32",
|
58
|
-
"GetConsoleScreenBufferInfo",
|
59
|
-
['L','P'], 'L')
|
60
|
-
|
61
|
-
define_singleton_method(:get_screen_info) do |buffer|
|
62
|
-
get_screen_info_proc.call(@_out_handle, buffer)
|
63
|
-
end
|
64
|
-
|
65
|
-
get_handle_proc = Win32API.new("kernel32", "GetStdHandle", ['L'], 'L')
|
66
|
-
|
67
|
-
define_singleton_method(:get_handle) do |handle_index|
|
68
|
-
get_handle_proc.call(handle_index)
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
#Output a string
|
74
|
-
#<br>Endemic Code Smells
|
75
|
-
#* :reek:UtilityFunction
|
76
|
-
def put_string(str)
|
77
|
-
STDOUT.print(str)
|
78
|
-
end
|
79
|
-
|
80
|
-
#Home the cursor and start at a known state.
|
81
|
-
def initialize_parms
|
82
|
-
@_out_handle = get_handle(STD_OUTPUT_HANDLE)
|
83
|
-
put_string(CARRIAGE_RETURN)
|
84
|
-
end
|
85
|
-
|
86
|
-
#Conclude the terminal state.
|
87
|
-
def conclude
|
88
|
-
put_string("\n")
|
89
|
-
end
|
90
|
-
|
91
|
-
#Get a uncooked character keystroke.
|
92
|
-
def get_raw_char
|
93
|
-
while (kbhit == 0)
|
94
|
-
sleep(WAIT_SLEEP)
|
95
|
-
end
|
96
|
-
|
97
|
-
getch
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* windows/map.rb - Character mapping for windows systems.
|
4
|
-
module MiniReadline
|
5
|
-
|
6
|
-
#* windows/map.rb - Character mapping for windows systems.
|
7
|
-
class RawTerm
|
8
|
-
|
9
|
-
pfx = 0xE0.chr
|
10
|
-
|
11
|
-
#Map the non-printing characters.
|
12
|
-
|
13
|
-
#Left Arrows
|
14
|
-
MAP["\x00K"] = [:go_left]
|
15
|
-
MAP[pfx+"K"] = [:go_left]
|
16
|
-
|
17
|
-
MAP["\x00s"] = [:word_left]
|
18
|
-
MAP[pfx+"s"] = [:word_left]
|
19
|
-
|
20
|
-
#Right Arrows
|
21
|
-
MAP["\x00M"] = [:go_right]
|
22
|
-
MAP[pfx+"M"] = [:go_right]
|
23
|
-
|
24
|
-
MAP["\x00t"] = [:word_right]
|
25
|
-
MAP[pfx+"t"] = [:word_right]
|
26
|
-
|
27
|
-
#Up Arrows
|
28
|
-
MAP["\x00H"] = [:previous_history]
|
29
|
-
MAP[pfx+"H"] = [:previous_history]
|
30
|
-
|
31
|
-
#Down Arrows
|
32
|
-
MAP["\x00P"] = [:next_history]
|
33
|
-
MAP[pfx+"P"] = [:next_history]
|
34
|
-
|
35
|
-
#The Home keys
|
36
|
-
MAP["\x00G"] = [:go_home]
|
37
|
-
MAP[pfx+"G"] = [:go_home]
|
38
|
-
|
39
|
-
#The End keys
|
40
|
-
MAP["\x00O"] = [:go_end]
|
41
|
-
MAP[pfx+"O"] = [:go_end]
|
42
|
-
|
43
|
-
#The Backspace key
|
44
|
-
MAP["\x08"] = [:delete_left]
|
45
|
-
|
46
|
-
#The Delete keys
|
47
|
-
MAP["\x7F"] = [:delete_right]
|
48
|
-
MAP["\x00S"] = [:delete_right]
|
49
|
-
MAP[pfx+"S"] = [:delete_right]
|
50
|
-
|
51
|
-
#Auto-completion.
|
52
|
-
MAP["\t"] = [:auto_complete]
|
53
|
-
|
54
|
-
#The Enter key
|
55
|
-
MAP["\x0D"] = [:enter]
|
56
|
-
|
57
|
-
#The Escape key
|
58
|
-
MAP["\x1B"] = [:cancel]
|
59
|
-
|
60
|
-
#End of Input
|
61
|
-
MAP["\x1A"] = [:end_of_input]
|
62
|
-
end
|
63
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* windows/set_posn.rb - Set the column of the cursor.
|
4
|
-
module MiniReadline
|
5
|
-
|
6
|
-
#* windows/set_posn.rb - Set the column of the cursor.
|
7
|
-
class RawTerm
|
8
|
-
|
9
|
-
#Move the cursor using windows voodoo API.
|
10
|
-
def set_posn(new_posn)
|
11
|
-
raw_buffer = 0.chr * 24
|
12
|
-
get_screen_info(raw_buffer)
|
13
|
-
y_posn = (raw_buffer[6,2].unpack('S'))[0]
|
14
|
-
|
15
|
-
set_cursor_posn(y_posn * 65536 + new_posn)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* windows/win_32_api.rb - Support for selected low level Win32 API entry points.
|
4
|
-
module MiniReadline
|
5
|
-
|
6
|
-
require 'fiddle'
|
7
|
-
|
8
|
-
#The classic \Win32API gem is deprecated, so we emulate it with fiddle.
|
9
|
-
class Win32API
|
10
|
-
|
11
|
-
DLL = {}
|
12
|
-
TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG}
|
13
|
-
CALL_TYPE_TO_ABI = {:stdcall => 1, :cdecl => 1, nil => 1} #Taken from Fiddle::Importer
|
14
|
-
|
15
|
-
def initialize(dllname, func, import, export = "0", calltype = :stdcall)
|
16
|
-
@proto = import.join.tr("VPpNnLlIi", "0SSI").chomp('0').split('')
|
17
|
-
handle = DLL[dllname] ||= Fiddle.dlopen(dllname)
|
18
|
-
@func = Fiddle::Function.new(handle[func], TYPEMAP.values_at(*@proto), CALL_TYPE_TO_ABI[calltype])
|
19
|
-
end
|
20
|
-
|
21
|
-
def call(*args)
|
22
|
-
args.each_with_index do |x, i|
|
23
|
-
args[i], = [x == 0 ? nil : x].pack("p").unpack("l!*") if @proto[i] == "S" && !x.is_a?(Fiddle::Pointer)
|
24
|
-
args[i], = [x].pack("I").unpack("i") if @proto[i] == "I"
|
25
|
-
end
|
26
|
-
|
27
|
-
@func.call(*args).to_i || 0
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* windows/window_width.rb - Determine the available screen width.
|
4
|
-
module MiniReadline
|
5
|
-
|
6
|
-
#* windows/window_width.rb - Determine the available screen width.
|
7
|
-
class RawTerm
|
8
|
-
|
9
|
-
#Determine the available screen width.
|
10
|
-
def window_width
|
11
|
-
raw_buffer = 0.chr * 24
|
12
|
-
get_screen_info(raw_buffer)
|
13
|
-
(raw_buffer[0,2].unpack('S'))[0]
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|