terminal_rb 0.9.4 → 0.9.5
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/examples/key-codes.rb +1 -1
- data/lib/terminal/input/{csiu_mode.rb → csiu_keys.rb} +3 -6
- data/lib/terminal/input/dumb_keys.rb +18 -0
- data/lib/terminal/input/{legacy_mode.rb → legacy_keys.rb} +3 -6
- data/lib/terminal/input.rb +68 -40
- data/lib/terminal/version.rb +1 -1
- metadata +5 -5
- data/lib/terminal/preload.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d20a3a35e0ac4ef63e9275befee56d97d7fd611db9dcc3438de5a49bb0938eef
|
4
|
+
data.tar.gz: 86475f7f6d2f89e86353e25fe9bae8803d4a75a3df0a8aab2ae58b4fdd4a5a92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b10bd0a2329433e8452b63b2291d4e888937ef8329d5557da7943605131b1a1ec8a42cbb77e6b8f2757f70525b8723d1c1a8242bd1f18593b1a47be6b7c7a655
|
7
|
+
data.tar.gz: d08a89d748cf95019615005bfa5370884e2f235f1721df29963a2acaf733ce2e6c06c912d9833cfa4660ca99972126b19477af380641673d63019ae6a9af5827
|
data/examples/key-codes.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Terminal
|
4
|
-
module
|
4
|
+
module CSIuKeys
|
5
5
|
class << self
|
6
|
-
def
|
7
|
-
|
8
|
-
def key_name(key)
|
9
|
-
return unless key
|
6
|
+
def [](key)
|
10
7
|
return ORD[key.ord] if key.size == 1
|
11
8
|
return if key[0] != "\e"
|
12
9
|
return C0_LEGACY[key[1].ord] if key.size == 2 # ESC ?
|
@@ -113,5 +110,5 @@ module Terminal
|
|
113
110
|
128 => 'Num'
|
114
111
|
}.freeze
|
115
112
|
end
|
116
|
-
private_constant :
|
113
|
+
private_constant :CSIuKeys
|
117
114
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Terminal
|
4
|
+
module DumbKeys
|
5
|
+
def self.[](key)
|
6
|
+
ORD[key.ord] if key.size == 1
|
7
|
+
end
|
8
|
+
|
9
|
+
ORD = {
|
10
|
+
0x05 => 'Ctrl+c',
|
11
|
+
0x08 => 'Back',
|
12
|
+
0x09 => 'Tab',
|
13
|
+
0x0a => 'Enter',
|
14
|
+
0x0d => 'Return',
|
15
|
+
0x1b => 'Esc'
|
16
|
+
}.compare_by_identity.freeze
|
17
|
+
end
|
18
|
+
end
|
@@ -1,12 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Terminal
|
4
|
-
module
|
4
|
+
module LegacyKeys
|
5
5
|
class << self
|
6
|
-
def
|
7
|
-
|
8
|
-
def key_name(key)
|
9
|
-
return unless key
|
6
|
+
def [](key)
|
10
7
|
return ORD[key.ord] if key.size == 1
|
11
8
|
return if key[0] != "\e"
|
12
9
|
return csi(key) if key[1] == '['
|
@@ -118,5 +115,5 @@ module Terminal
|
|
118
115
|
128 => 'Num'
|
119
116
|
}.freeze
|
120
117
|
end
|
121
|
-
private_constant :
|
118
|
+
private_constant :LegacyKeys
|
122
119
|
end
|
data/lib/terminal/input.rb
CHANGED
@@ -7,14 +7,17 @@ module Terminal
|
|
7
7
|
# Supported input mode.
|
8
8
|
#
|
9
9
|
# @attribute [r] input_mode
|
10
|
-
#
|
11
|
-
# @return [:
|
12
|
-
#
|
13
|
-
# @return [:
|
10
|
+
#
|
11
|
+
# @return [:csi_u]
|
12
|
+
# when CSIu protocol support
|
13
|
+
# @return [:legacy]
|
14
|
+
# for standard terminal
|
15
|
+
# @return [:dumb]
|
16
|
+
# for non-interactive input (pipes etc.)
|
17
|
+
# @return [:error]
|
18
|
+
# when input device is closed
|
14
19
|
def input_mode
|
15
|
-
|
16
|
-
return :dumb if @inp == READ_DUMB_INP
|
17
|
-
:error
|
20
|
+
@input_mode ||= find_input_mode
|
18
21
|
end
|
19
22
|
|
20
23
|
# Read next keyboard input.
|
@@ -27,44 +30,48 @@ module Terminal
|
|
27
30
|
# @return [String] key name in `:named` mode
|
28
31
|
# @return [[String, String]] key code and key name in `:both` mode
|
29
32
|
def read_key(mode: :named)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
33
|
+
case input_mode
|
34
|
+
when :dumb
|
35
|
+
read_dumb(mode)
|
36
|
+
when :legacy
|
37
|
+
read_legacy(mode)
|
38
|
+
when :csi_u
|
39
|
+
read_csi_u(mode)
|
40
|
+
end
|
34
41
|
end
|
35
42
|
|
36
43
|
private
|
37
44
|
|
38
|
-
def
|
39
|
-
|
40
|
-
return READ_TTY_INP if !ansi? || _write("\e[>1u\e[?u\e[c").nil?
|
41
|
-
while true
|
42
|
-
result = READ_TTY_INP.call
|
43
|
-
if result.include?("\e[?1u")
|
44
|
-
@inp_mode = CSIUMode
|
45
|
-
at_exit { _write("\e[<u") } if ENV['ENV'] != 'test'
|
46
|
-
end
|
47
|
-
return READ_TTY_INP if result[-1] == 'c'
|
48
|
-
end
|
49
|
-
rescue IOError, SystemCallError
|
50
|
-
-> {}
|
51
|
-
ensure
|
52
|
-
@inp_mode ||= LegacyMode
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
READ_DUMB_INP =
|
57
|
-
lambda do
|
58
|
-
STDIN.getc
|
45
|
+
def read_dumb(mode)
|
46
|
+
translate_key(STDIN.getc, mode, DumbKeys)
|
59
47
|
rescue Interrupt
|
60
|
-
|
48
|
+
translate_key("\x05", mode, DumbKeys)
|
61
49
|
rescue IOError, SystemCallError
|
62
|
-
@
|
50
|
+
@input_mode = :error
|
63
51
|
nil
|
64
52
|
end
|
65
53
|
|
66
|
-
|
67
|
-
|
54
|
+
def read_legacy(mode) = translate_key(read_tty, mode, LegacyKeys)
|
55
|
+
|
56
|
+
def read_csi_u(mode)
|
57
|
+
if _write("\e[>1u")
|
58
|
+
key = read_tty
|
59
|
+
_write("\e[<u")
|
60
|
+
translate_key(key, mode, CSIuKeys)
|
61
|
+
else
|
62
|
+
@input_mode = :legacy
|
63
|
+
read_legacy(mode)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def translate_key(key, mode, translator)
|
68
|
+
return unless key
|
69
|
+
return key if mode == :raw
|
70
|
+
name = translator[key]
|
71
|
+
mode == :both ? [key, name] : name || key
|
72
|
+
end
|
73
|
+
|
74
|
+
def read_tty
|
68
75
|
key = STDIN.getch
|
69
76
|
while (nc = STDIN.read_nonblock(1, exception: false))
|
70
77
|
String === nc ? key += nc : break
|
@@ -73,12 +80,33 @@ module Terminal
|
|
73
80
|
rescue Interrupt
|
74
81
|
key
|
75
82
|
rescue IOError, SystemCallError
|
76
|
-
@
|
83
|
+
@input_mode = :error
|
77
84
|
nil
|
78
85
|
end
|
79
86
|
|
87
|
+
def find_input_mode
|
88
|
+
return :dumb unless STDIN.tty?
|
89
|
+
return :legacy if !ansi? || _write("\e[>1u\e[?u\e[c").nil? || !csi_u?
|
90
|
+
_write("\e[<u")
|
91
|
+
:csi_u
|
92
|
+
rescue IOError, SystemCallError
|
93
|
+
:error
|
94
|
+
end
|
95
|
+
|
96
|
+
def csi_u?
|
97
|
+
ret = false
|
98
|
+
while true
|
99
|
+
result = read_tty or return false
|
100
|
+
ret = true if result.include?("\e[?1u")
|
101
|
+
break if result[-1] == 'c'
|
102
|
+
end
|
103
|
+
ret
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
80
107
|
dir = __dir__
|
81
|
-
autoload :
|
82
|
-
autoload :
|
83
|
-
|
108
|
+
autoload :CSIuKeys, "#{dir}/input/csiu_keys.rb"
|
109
|
+
autoload :DumbKeys, "#{dir}/input/dumb_keys.rb"
|
110
|
+
autoload :LegacyKeys, "#{dir}/input/legacy_keys.rb"
|
111
|
+
private_constant :CSIuKeys, :LegacyKeys
|
84
112
|
end
|
data/lib/terminal/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terminal_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Blumtritt
|
@@ -34,9 +34,9 @@ files:
|
|
34
34
|
- lib/terminal/ansi/named_colors.rb
|
35
35
|
- lib/terminal/detect.rb
|
36
36
|
- lib/terminal/input.rb
|
37
|
-
- lib/terminal/input/
|
38
|
-
- lib/terminal/input/
|
39
|
-
- lib/terminal/
|
37
|
+
- lib/terminal/input/csiu_keys.rb
|
38
|
+
- lib/terminal/input/dumb_keys.rb
|
39
|
+
- lib/terminal/input/legacy_keys.rb
|
40
40
|
- lib/terminal/rspec/helper.rb
|
41
41
|
- lib/terminal/text.rb
|
42
42
|
- lib/terminal/text/char_width.rb
|
@@ -49,7 +49,7 @@ metadata:
|
|
49
49
|
rubygems_mfa_required: 'true'
|
50
50
|
source_code_uri: https://codeberg.org/mblumtritt/Terminal.rb
|
51
51
|
bug_tracker_uri: https://codeberg.org/mblumtritt/Terminal.rb/issues
|
52
|
-
documentation_uri: https://rubydoc.info/gems/terminal_rb/0.9.
|
52
|
+
documentation_uri: https://rubydoc.info/gems/terminal_rb/0.9.5/Terminal
|
53
53
|
rdoc_options: []
|
54
54
|
require_paths:
|
55
55
|
- lib
|