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
@@ -6,31 +6,31 @@ require_relative 'auto_complete/auto_file_source'
|
|
6
6
|
require_relative 'auto_complete/quoted_file_folder_source'
|
7
7
|
require_relative 'auto_complete/array_source'
|
8
8
|
|
9
|
-
|
9
|
+
# Process :auto_complete
|
10
10
|
module MiniReadline
|
11
11
|
|
12
|
-
#Set up the default auto-complete data source.
|
12
|
+
# Set up the default auto-complete data source.
|
13
13
|
BASE_OPTIONS[:auto_source] = QuotedFileFolderSource
|
14
14
|
|
15
|
-
|
15
|
+
# Process :auto_complete
|
16
16
|
class Edit
|
17
17
|
|
18
|
-
#The auto-complete command.
|
18
|
+
# The auto-complete command.
|
19
19
|
def auto_complete(_keyboard_args)
|
20
20
|
if @options[:auto_complete] && (new_buffer = auto_manager.next(auto_trim))
|
21
21
|
@edit_buffer = new_buffer
|
22
22
|
@edit_posn = length
|
23
23
|
else
|
24
|
-
|
24
|
+
MiniTerm.beep
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
#Get the base part of the edit buffer.
|
28
|
+
# Get the base part of the edit buffer.
|
29
29
|
def auto_trim
|
30
30
|
@edit_buffer[0...(@edit_posn)]
|
31
31
|
end
|
32
32
|
|
33
|
-
#Get the auto-complete manager
|
33
|
+
# Get the auto-complete manager
|
34
34
|
def auto_manager
|
35
35
|
@_auto_manager ||= AutoManager.new{@options[:auto_source].new(@options)}
|
36
36
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# An array as the source for auto-complete.
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# An array as the source for auto-complete.
|
7
7
|
class ArraySource
|
8
8
|
|
9
|
-
#Create a new file/folder auto-data source. NOP
|
9
|
+
# Create a new file/folder auto-data source. NOP
|
10
10
|
def initialize(options)
|
11
11
|
@options = options
|
12
12
|
end
|
13
13
|
|
14
|
-
#Construct a new data list for auto-complete
|
14
|
+
# Construct a new data list for auto-complete
|
15
15
|
def rebuild(str)
|
16
16
|
extract_root_pivot(str)
|
17
17
|
|
@@ -20,12 +20,12 @@ module MiniReadline
|
|
20
20
|
@cycler = list.empty? ? nil : list.cycle
|
21
21
|
end
|
22
22
|
|
23
|
-
#Parse the string into the two basic components.
|
23
|
+
# Parse the string into the two basic components.
|
24
24
|
def extract_root_pivot(str)
|
25
25
|
@root, @pivot = /\S+$/ =~ str ? [$PREMATCH, $MATCH] : [str, ""]
|
26
26
|
end
|
27
27
|
|
28
|
-
#Get the array of data from either an array or a block.
|
28
|
+
# Get the array of data from either an array or a block.
|
29
29
|
def get_array
|
30
30
|
if (src = @options[:array_src]).is_a?(Proc)
|
31
31
|
src.call
|
@@ -34,7 +34,7 @@ module MiniReadline
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
#Get the next string for auto-complete
|
37
|
+
# Get the next string for auto-complete
|
38
38
|
def next
|
39
39
|
@root + @cycler.next
|
40
40
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# The data source for mysh file name auto-complete.
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# A flexible file source for shell emulation.
|
7
7
|
class AutoFileSource
|
8
8
|
|
9
|
-
#Create a new file/folder auto-data source. NOP
|
9
|
+
# Create a new file/folder auto-data source. NOP
|
10
10
|
def initialize(_options)
|
11
11
|
#Do nothing here!
|
12
12
|
end
|
13
13
|
|
14
|
-
#Construct a new data list for auto-complete
|
14
|
+
# Construct a new data list for auto-complete
|
15
15
|
def rebuild(str)
|
16
16
|
extract_root_pivot(str)
|
17
17
|
|
@@ -20,46 +20,46 @@ module MiniReadline
|
|
20
20
|
@cycler = list.empty? ? nil : list.cycle
|
21
21
|
end
|
22
22
|
|
23
|
-
#The regex for extraction of the root and pivot.
|
23
|
+
# The regex for extraction of the root and pivot.
|
24
24
|
EXTRACT = /("[^"\s][^"]*"?$)|(\S+$)/
|
25
25
|
|
26
|
-
#Parse the string into the two basic components.
|
26
|
+
# Parse the string into the two basic components.
|
27
27
|
def extract_root_pivot(str)
|
28
28
|
@root, @pivot = EXTRACT =~ str ? [$PREMATCH, $MATCH] : [str, ""]
|
29
29
|
end
|
30
30
|
|
31
|
-
#Get the next string for auto-complete
|
31
|
+
# Get the next string for auto-complete
|
32
32
|
def next
|
33
33
|
@root + dress_up(@cycler.next)
|
34
34
|
end
|
35
35
|
|
36
|
-
#Prepare the file name for internal use.
|
37
|
-
|
38
|
-
|
36
|
+
# Prepare the file name for internal use.
|
37
|
+
# Endemic Code Smells
|
38
|
+
# :reek:UtilityFunction
|
39
39
|
def dress_down(name)
|
40
40
|
name.gsub("\\", "/").gsub('"', '')
|
41
41
|
end
|
42
42
|
|
43
|
-
#Prepare the file name for external use.
|
44
|
-
|
45
|
-
|
43
|
+
# Prepare the file name for external use.
|
44
|
+
# Endemic Code Smells
|
45
|
+
# :reek:UtilityFunction
|
46
46
|
def dress_up(name)
|
47
47
|
dress_up_quotes(dress_up_slashes(name))
|
48
48
|
end
|
49
49
|
|
50
|
-
#Dress up slashes and backslashes.
|
50
|
+
# Dress up slashes and backslashes.
|
51
51
|
def dress_up_slashes(name)
|
52
52
|
backslash? ? name.gsub("/", "\\") : name
|
53
53
|
end
|
54
54
|
|
55
|
-
#Dress up in quotes if needed.
|
56
|
-
|
57
|
-
|
55
|
+
# Dress up in quotes if needed.
|
56
|
+
# Endemic Code Smells
|
57
|
+
# :reek:UtilityFunction
|
58
58
|
def dress_up_quotes(name)
|
59
59
|
name[' '] ? "\"#{name}\"" : name
|
60
60
|
end
|
61
61
|
|
62
|
-
#Does this file name use backslashes?
|
62
|
+
# Does this file name use backslashes?
|
63
63
|
def backslash?
|
64
64
|
if @pivot.end_with?("\\")
|
65
65
|
true
|
@@ -70,7 +70,7 @@ module MiniReadline
|
|
70
70
|
elsif @pivot["/"]
|
71
71
|
false
|
72
72
|
else
|
73
|
-
|
73
|
+
MiniTerm.windows?
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# The controller for auto-complete.
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# The controller for auto-complete.
|
7
7
|
class AutoManager
|
8
8
|
|
9
|
-
#Create a new auto-complete manager.
|
9
|
+
# Create a new auto-complete manager.
|
10
10
|
def initialize(&block)
|
11
11
|
@_block = block
|
12
12
|
@active = nil
|
13
13
|
end
|
14
14
|
|
15
|
-
#Get the next buffer string
|
15
|
+
# Get the next buffer string
|
16
16
|
def next(buffer)
|
17
17
|
unless @active && @old_buffer == buffer
|
18
18
|
@active = source.rebuild(buffer)
|
@@ -25,7 +25,7 @@ module MiniReadline
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
#Get the data source
|
28
|
+
# Get the data source
|
29
29
|
def source
|
30
30
|
@_source ||= @_block.call
|
31
31
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# The data source for auto-complete.
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# The data source for auto-complete.
|
7
7
|
class FileFolderSource
|
8
8
|
|
9
|
-
#Create a new file/folder auto-data source. NOP
|
9
|
+
# Create a new file/folder auto-data source. NOP
|
10
10
|
def initialize(_options); end
|
11
11
|
|
12
|
-
#Construct a new data list for auto-complete
|
12
|
+
# Construct a new data list for auto-complete
|
13
13
|
def rebuild(str)
|
14
14
|
extract_root_pivot(str)
|
15
15
|
|
@@ -18,12 +18,12 @@ module MiniReadline
|
|
18
18
|
@cycler = list.empty? ? nil : list.cycle
|
19
19
|
end
|
20
20
|
|
21
|
-
#Parse the string into the two basic components.
|
21
|
+
# Parse the string into the two basic components.
|
22
22
|
def extract_root_pivot(str)
|
23
23
|
@root, @pivot = /\S+$/ =~ str ? [$PREMATCH, $MATCH] : [str, ""]
|
24
24
|
end
|
25
25
|
|
26
|
-
#Get the next string for auto-complete
|
26
|
+
# Get the next string for auto-complete
|
27
27
|
def next
|
28
28
|
@root + @cycler.next
|
29
29
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# The data source for auto-complete.
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# The data source for auto-complete.
|
7
7
|
class QuotedFileFolderSource
|
8
8
|
|
9
|
-
#Create a new file/folder auto-data source. NOP
|
9
|
+
# Create a new file/folder auto-data source. NOP
|
10
10
|
def initialize(_options); end
|
11
11
|
|
12
|
-
#Construct a new data list for auto-complete
|
12
|
+
# Construct a new data list for auto-complete
|
13
13
|
def rebuild(str)
|
14
14
|
extract_root_pivot(str)
|
15
15
|
|
@@ -18,15 +18,15 @@ module MiniReadline
|
|
18
18
|
@cycler = list.empty? ? nil : list.cycle
|
19
19
|
end
|
20
20
|
|
21
|
-
#The parsing regular expression.
|
21
|
+
# The parsing regular expression.
|
22
22
|
REGEX = /(?<=\")([^\"\s][^\"]*)?(?=\"?$)/
|
23
23
|
|
24
|
-
#Parse the string into the two basic components.
|
24
|
+
# Parse the string into the two basic components.
|
25
25
|
def extract_root_pivot(str)
|
26
26
|
@root, @pivot = REGEX =~ str ? [$PREMATCH, $MATCH] : [str + '"', ""]
|
27
27
|
end
|
28
28
|
|
29
|
-
#Get the next string for auto-complete
|
29
|
+
# Get the next string for auto-complete
|
30
30
|
def next
|
31
31
|
"#{@root}#{@cycler.next}\""
|
32
32
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# Process :cancel
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# Process :cancel - delete all text.
|
7
7
|
class Edit
|
8
8
|
|
9
|
-
#All right! Scrap all of this and start over!
|
9
|
+
# All right! Scrap all of this and start over!
|
10
10
|
def cancel(_keyboard_args)
|
11
11
|
@edit_buffer = ""
|
12
12
|
@edit_posn = 0
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# Process :delete_left
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# Process :delete_all_left
|
7
7
|
class Edit
|
8
8
|
|
9
|
-
#The delete to the left command
|
9
|
+
# The delete to the left command
|
10
10
|
def delete_all_left(_keyboard_args)
|
11
11
|
if @edit_posn > 0
|
12
12
|
@edit_buffer = @edit_buffer[@edit_posn..-1]
|
13
13
|
@edit_posn = 0
|
14
14
|
else
|
15
|
-
|
15
|
+
MiniTerm.beep
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# Process :delete_all_right
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# Process :delete_right
|
7
7
|
class Edit
|
8
8
|
|
9
|
-
#The delete to the right
|
9
|
+
# The delete to the right
|
10
10
|
def delete_all_right(_keyboard_args)
|
11
11
|
if @edit_posn < self.length
|
12
12
|
@edit_buffer = @edit_buffer[0...@edit_posn]
|
13
13
|
else
|
14
|
-
|
14
|
+
MiniTerm.beep
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# Process :delete_left
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# Process :delete_left
|
7
7
|
class Edit
|
8
8
|
|
9
|
-
#The delete to the left command
|
9
|
+
# The delete to the left command
|
10
10
|
def delete_left(_keyboard_args)
|
11
11
|
if @edit_posn > 0
|
12
12
|
@edit_buffer = @edit_buffer[0...(@edit_posn-1)] +
|
@@ -14,7 +14,7 @@ module MiniReadline
|
|
14
14
|
|
15
15
|
@edit_posn -= 1
|
16
16
|
else
|
17
|
-
|
17
|
+
MiniTerm.beep
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
# Process :delete_right
|
4
4
|
module MiniReadline
|
5
5
|
|
6
|
-
|
6
|
+
# Process :delete_right
|
7
7
|
class Edit
|
8
8
|
|
9
|
-
#The delete to the right
|
9
|
+
# The delete to the right
|
10
10
|
def delete_right(_keyboard_args)
|
11
11
|
if @edit_posn < self.length
|
12
12
|
@edit_buffer = @edit_buffer[0...(@edit_posn)] +
|
13
13
|
@edit_buffer[@edit_posn+1..-1]
|
14
14
|
else
|
15
|
-
|
15
|
+
MiniTerm.beep
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -3,75 +3,73 @@
|
|
3
3
|
require_relative 'edit_window/sync_window'
|
4
4
|
require_relative 'edit_window/sync_cursor'
|
5
5
|
|
6
|
-
|
6
|
+
# Edit window support.
|
7
7
|
module MiniReadline
|
8
8
|
|
9
|
-
|
9
|
+
# Support for the edit window.
|
10
10
|
class EditWindow
|
11
11
|
|
12
|
-
#Determine the edit window limits.
|
12
|
+
# Determine the edit window limits.
|
13
13
|
def initialize(options)
|
14
14
|
@options = options
|
15
15
|
@base_width = window_width - @options[:base_prompt].length
|
16
16
|
@scroll_width = window_width - @options[:scroll_prompt].length
|
17
|
-
@term = @options[:term]
|
18
17
|
|
19
18
|
@left_margin, @window_buffer, @show_prompt = 0, "", true
|
20
19
|
end
|
21
20
|
|
22
|
-
#What is the offset of the window's left margin?
|
21
|
+
# What is the offset of the window's left margin?
|
23
22
|
attr_reader :left_margin
|
24
23
|
|
25
|
-
#What is the offset of the window's right margin?
|
24
|
+
# What is the offset of the window's right margin?
|
26
25
|
def right_margin
|
27
26
|
left_margin + active_width - 1
|
28
27
|
end
|
29
28
|
|
30
|
-
#Is the window currently in the scrolled state?
|
29
|
+
# Is the window currently in the scrolled state?
|
31
30
|
def window_scrolled?
|
32
31
|
left_margin > 0
|
33
32
|
end
|
34
33
|
|
35
|
-
#The shadow copy of what is actually on the screen?
|
34
|
+
# The shadow copy of what is actually on the screen?
|
36
35
|
attr_reader :window_buffer
|
37
36
|
|
38
|
-
#The width of the window with the base prompt
|
37
|
+
# The width of the window with the base prompt
|
39
38
|
attr_reader :base_width
|
40
39
|
|
41
|
-
#The width of the window with the alternate prompt
|
40
|
+
# The width of the window with the alternate prompt
|
42
41
|
attr_reader :scroll_width
|
43
42
|
|
44
|
-
#What is the full window width?
|
43
|
+
# What is the full window width?
|
45
44
|
def window_width
|
46
45
|
@options[:window_width]
|
47
46
|
end
|
48
47
|
|
49
|
-
#How wide is the active region of the window now?
|
48
|
+
# How wide is the active region of the window now?
|
50
49
|
def active_width
|
51
50
|
window_scrolled? ? scroll_width : base_width
|
52
51
|
end
|
53
52
|
|
54
|
-
#What is the current prompt?
|
53
|
+
# What is the current prompt?
|
55
54
|
def prompt
|
56
55
|
window_scrolled? ? @options[:scroll_prompt] : @options[:base_prompt]
|
57
56
|
end
|
58
57
|
|
59
|
-
#What is the scroll step?
|
58
|
+
# What is the scroll step?
|
60
59
|
def scroll_step
|
61
60
|
@options[:scroll_step]
|
62
61
|
end
|
63
62
|
|
64
63
|
private
|
65
64
|
|
66
|
-
#Set the left margin
|
65
|
+
# Set the left margin
|
67
66
|
def set_left_margin(value)
|
68
67
|
@left_margin = value
|
69
68
|
end
|
70
69
|
|
71
|
-
#Set the right margin
|
72
|
-
|
73
|
-
|
74
|
-
# why the scroll_width is used instead of active_width here.
|
70
|
+
# Set the right margin
|
71
|
+
# If the right_margin is being set, then we must be scrolling. That is
|
72
|
+
# why the scroll_width is used instead of active_width here.
|
75
73
|
def set_right_margin(value)
|
76
74
|
@left_margin = value - scroll_width + 1
|
77
75
|
end
|