| Module | OptionParser::Completion |
| In: |
lib/optparse.rb
|
Keyword completion module. This allows partial arguments to be specified and resolved against a list of acceptable values.
# File lib/optparse.rb, line 221
221: def complete(key, icase = false, pat = nil)
222: pat ||= Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'),
223: icase)
224: canon, sw, k, v, cn = nil
225: candidates = []
226: each do |k, *v|
227: (if Regexp === k
228: kn = nil
229: k === key
230: else
231: kn = defined?(k.id2name) ? k.id2name : k
232: pat === kn
233: end) or next
234: v << k if v.empty?
235: candidates << [k, v, kn]
236: end
237: candidates = candidates.sort_by {|k, v, kn| kn.size}
238: if candidates.size == 1
239: canon, sw, * = candidates[0]
240: elsif candidates.size > 1
241: canon, sw, cn = candidates.shift
242: candidates.each do |k, v, kn|
243: next if sw == v
244: if String === cn and String === kn
245: if cn.rindex(kn, 0)
246: canon, sw, cn = k, v, kn
247: next
248: elsif kn.rindex(cn, 0)
249: next
250: end
251: end
252: throw :ambiguous, key
253: end
254: end
255: if canon
256: block_given? or return key, *sw
257: yield(key, *sw)
258: end
259: end