pry-keybind 0.0.4
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 +7 -0
- data/lib/hooks.rb +19 -0
- data/lib/pry-keybind.rb +216 -0
- data/lib/pry_ext.rb +9 -0
- data/lib/version.rb +3 -0
- metadata +74 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 50082f4e6e8a9f2d8e9d8a7970447ac780e60522071f4f1b55ccfbe423dec875
|
4
|
+
data.tar.gz: dfdf82a7dfb7d7603094b956d4fa339b285fa6b8085383381b172385a99c62d3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dec05e9ececa36b6c469d36f2eaeab37c96e33fac1f5dedc26e1c6cda71a30e0594ce400664ac4043c83d7007cc0300e66b976812aa2e21b8d31222b5579da85
|
7
|
+
data.tar.gz: ba780b9fd85b5b073630604f242f62830d1f808a8fe08157725488e8a16a2624ef27c2a11894f06dd20685f3984e9aa4d3d5895d16f77c6c48d4159c903f1503
|
data/lib/hooks.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Pry.hooks.add_hook(:when_started, "initialize input states for keybindings") do |_output, binding, pry_instance|
|
2
|
+
Pry.config.input_states ||= []
|
3
|
+
end
|
4
|
+
|
5
|
+
Pry.hooks.add_hook(:before_session, "restore input state & bind keybindings") do |output, binding, pry_instance|
|
6
|
+
if (input_state = Pry.config.input_states.pop)
|
7
|
+
input_state.restore!(readline_buffer: false)
|
8
|
+
end
|
9
|
+
PryKeybind.bind_all!(pry_instance, source: :before_session)
|
10
|
+
end
|
11
|
+
|
12
|
+
Pry.hooks.add_hook(:after_session, "unbind keybindings") do |output, _binding, pry_instance|
|
13
|
+
PryKeybind.unbind_all!(pry_instance, source: :after_session)
|
14
|
+
end
|
15
|
+
|
16
|
+
Pry.hooks.add_hook(:after_eval, "reset keybindings") do |output, pry_instance|
|
17
|
+
PryKeybind.unbind_all!(pry_instance, source: :after_eval)
|
18
|
+
PryKeybind.bind_all!(pry_instance, source: :after_eval)
|
19
|
+
end
|
data/lib/pry-keybind.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
require "pryline"
|
2
|
+
require "pry_ext"
|
3
|
+
require "hooks"
|
4
|
+
class PryKeybind
|
5
|
+
class << self
|
6
|
+
attr_accessor :registry
|
7
|
+
attr_accessor :layers
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :pry_instance
|
11
|
+
|
12
|
+
self.registry ||= {}
|
13
|
+
self.layers ||= []
|
14
|
+
|
15
|
+
def self.register(constant, key, options = {}, &block)
|
16
|
+
self.registry ||= {}
|
17
|
+
self.layers ||= []
|
18
|
+
self.registry[constant] = new(key, options, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.register_anonymous(key, options = {}, &block)
|
22
|
+
constant = format("BINDING_%09d", Random.random_number(1_000_000_000)).to_sym
|
23
|
+
register(constant, key, options, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.bind_all!(pry, source: nil)
|
27
|
+
# puts "binding / layer size?: #{layers.size} / source: #{source}"
|
28
|
+
layers << [*registry.values].map do |key_binding|
|
29
|
+
key_binding.pry_instance = pry
|
30
|
+
key_binding.bind!
|
31
|
+
end.compact
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.unbind_all!(pry_instance, source: nil)
|
35
|
+
# puts "unbinding / layer size?: #{layers.size} / source: #{source}"
|
36
|
+
return unless layer = layers.pop
|
37
|
+
|
38
|
+
layer.each do |key_binding|
|
39
|
+
key_binding.pry_instance = pry_instance
|
40
|
+
key_binding.unbind!
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def initialize(key, options = {}, &block)
|
46
|
+
raise ArgumentError, "block required" unless block_given?
|
47
|
+
|
48
|
+
@options = options
|
49
|
+
@key = KeySequence.new(key)
|
50
|
+
@block = block
|
51
|
+
@bound = false
|
52
|
+
end
|
53
|
+
|
54
|
+
def bind!
|
55
|
+
return nil if bound?
|
56
|
+
|
57
|
+
Pryline.public_send(bind_method, key.for_readline, &block_caller)
|
58
|
+
|
59
|
+
@bound = true
|
60
|
+
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
def unbind!
|
65
|
+
return self unless bound?
|
66
|
+
|
67
|
+
Pryline.public_send(unbind_method, key.for_readline)
|
68
|
+
|
69
|
+
@bound = false
|
70
|
+
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
attr_reader :key
|
75
|
+
private :key
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def bound?
|
80
|
+
@bound
|
81
|
+
end
|
82
|
+
|
83
|
+
def bind_method
|
84
|
+
key.sequence? ? :bind_keyseq : :bind_key
|
85
|
+
end
|
86
|
+
|
87
|
+
def unbind_method
|
88
|
+
key.sequence? ? :unbind_keyseq : :unbind_key
|
89
|
+
end
|
90
|
+
|
91
|
+
def save_input?
|
92
|
+
@options[:save_input]
|
93
|
+
end
|
94
|
+
|
95
|
+
def no_refresh?
|
96
|
+
@options[:no_refresh]
|
97
|
+
end
|
98
|
+
|
99
|
+
def refresh_line?
|
100
|
+
!no_refresh? || save_input?
|
101
|
+
end
|
102
|
+
|
103
|
+
def block_caller
|
104
|
+
@block_caller ||= Proc.new do
|
105
|
+
# puts "\npry keybind 99 keybindings accepting line\n"
|
106
|
+
if save_input?
|
107
|
+
Pry.config.input_states << InputState.save!(pry_instance)
|
108
|
+
end
|
109
|
+
|
110
|
+
pry_instance.define_singleton_method(:whole_buffer) do
|
111
|
+
"#{eval_string}#{Pryline.line_buffer}"
|
112
|
+
end
|
113
|
+
|
114
|
+
pry_instance.define_singleton_method(:whole_buffer=) do |input|
|
115
|
+
self.eval_string = ""
|
116
|
+
Pryline.delete_text
|
117
|
+
Pryline.point = 0
|
118
|
+
Pryline.insert_text input.chomp
|
119
|
+
end
|
120
|
+
|
121
|
+
@block.call(pry_instance)
|
122
|
+
|
123
|
+
Pryline.refresh_line if refresh_line?
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class KeySequence
|
128
|
+
attr_reader :key
|
129
|
+
|
130
|
+
def initialize(key)
|
131
|
+
@key = key
|
132
|
+
end
|
133
|
+
|
134
|
+
def for_readline
|
135
|
+
unless String === key
|
136
|
+
raise ArgumentError, "can't recognize: key.class == #{key.class} / key.inspect == #{key.inspect}"
|
137
|
+
end
|
138
|
+
|
139
|
+
[key.chars.map(&:ord)].flatten.pack("C*")
|
140
|
+
end
|
141
|
+
|
142
|
+
def sequence?
|
143
|
+
String === key && key.size > 1
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def single?
|
149
|
+
String === key && key.size == 1
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class InputState
|
154
|
+
attr_reader :pry_instance
|
155
|
+
|
156
|
+
def self.save!(pry_instance)
|
157
|
+
new(pry_instance).save!
|
158
|
+
end
|
159
|
+
|
160
|
+
def initialize(pry_instance)
|
161
|
+
@pry_instance = pry_instance
|
162
|
+
end
|
163
|
+
|
164
|
+
def save!(pry_eval: true, readline_buffer: true)
|
165
|
+
save_pry_eval_string if pry_eval
|
166
|
+
save_readline_line_buffer if readline_buffer
|
167
|
+
|
168
|
+
self
|
169
|
+
end
|
170
|
+
|
171
|
+
def restore!(pry_eval: true, readline_buffer: true)
|
172
|
+
restore_pry_eval_string if pry_eval
|
173
|
+
restore_readline_line_buffer if readline_buffer
|
174
|
+
|
175
|
+
self
|
176
|
+
end
|
177
|
+
|
178
|
+
private
|
179
|
+
|
180
|
+
def save_pry_eval_string
|
181
|
+
@eval_string = pry_instance.eval_string
|
182
|
+
@pry_state_saved = true
|
183
|
+
end
|
184
|
+
|
185
|
+
def save_readline_line_buffer
|
186
|
+
@line_buffer, @point = Pryline.line_buffer, Pryline.point
|
187
|
+
old_hook = Pryline.pre_input_hook
|
188
|
+
Pryline.pre_input_hook = Proc.new do
|
189
|
+
restore_readline_line_buffer
|
190
|
+
Pryline.pre_input_hook = old_hook
|
191
|
+
end
|
192
|
+
@readline_state_saved = true
|
193
|
+
end
|
194
|
+
|
195
|
+
def restore_pry_eval_string
|
196
|
+
return false unless @pry_state_saved
|
197
|
+
pry_instance.eval_string = @eval_string
|
198
|
+
@pry_state_saved = false
|
199
|
+
|
200
|
+
true
|
201
|
+
end
|
202
|
+
|
203
|
+
def restore_readline_line_buffer
|
204
|
+
return false unless @readline_state_saved
|
205
|
+
|
206
|
+
Pryline.insert_text(@line_buffer)
|
207
|
+
Pryline.point = @point
|
208
|
+
|
209
|
+
Pryline.refresh_line
|
210
|
+
@readline_state_saved = false
|
211
|
+
|
212
|
+
true
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
require "pry_ext"
|
data/lib/pry_ext.rb
ADDED
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pry-keybind
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brian Graham
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pryline
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.10'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.10'
|
41
|
+
description: Bind keys to execute commands in pry
|
42
|
+
email: bcgraham+github@gmail.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/hooks.rb
|
48
|
+
- lib/pry-keybind.rb
|
49
|
+
- lib/pry_ext.rb
|
50
|
+
- lib/version.rb
|
51
|
+
homepage: https://github.com/bcgraham/pry-keybind
|
52
|
+
licenses:
|
53
|
+
- MIT
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 2.3.0
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubygems_version: 3.0.3
|
71
|
+
signing_key:
|
72
|
+
specification_version: 4
|
73
|
+
summary: Use readline keybindings in pry
|
74
|
+
test_files: []
|