pry-keybind 0.0.1

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