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