pry-keybind 0.0.3

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c2f271eeb8517f478c1bbd70afafccde8ca728f6a76066f61f2463e49162ecad
4
+ data.tar.gz: eed46428a75a61578a53e65bb4abdbca6c30c5bccf8f40e9e7526a14478210c9
5
+ SHA512:
6
+ metadata.gz: c0145cf7ee3f329a0916287ae4f74fe5fe5d68e74c3b91544b8004f8e5c83b7d32b11efd7565e5f45ec3821ebac79b98b1e281bab54a4bcc7ae510d01027b2a5
7
+ data.tar.gz: ea150c6a8a21bf7fd5570436af3fef0fcb81e41004566ef4b2532e7d81c38eeb3e7fbb057886977a36b3cab209f27f8d021c5f200f3e5f4f661a4ebc315470a8
@@ -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
@@ -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"
@@ -0,0 +1,9 @@
1
+ class Pry
2
+ def self.bind_key(key, options = {}, &block)
3
+ PryKeybind.unbind_all!(self)
4
+ PryKeybind.register_anonymous(key, options, &block)
5
+ PryKeybind.bind_all!(self)
6
+
7
+ true
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ class PryKeybind
2
+ VERSION = "0.0.3"
3
+ end
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.3
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.3
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.3
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: []