在Ruby中禁用OptionParser标志的自动补全

时间:2019-04-03 18:30:21

标签: ruby

#!/usr/bin/env ruby

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.on("--language LANGUAGE", ["Ruby", "JavaScript"]) do |language|
    options[:language] = language
  end 
end.parse!

puts "Language: #{options[:language]}"

如果我使用./bin/example --language Ru运行此命令,则会输出:

  

语言:Ruby

我想禁用此autocomplete/closest match行为,并在未提供确切名称的情况下提高OptionParser的权限,但是从他们的文档中我看不到这样做的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

搜索设置在self.regexp

中定义

方法complete似乎返回了所有不同的标志。

方法self.regexp定义了使用的搜索查询

class OptionParser
  module Completion
    def self.regexp(key, icase)
      Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
    end
  end
end

正则表达式使用以下标志构建

\A从字符串的开头进行搜索

\w*搜索任何匹配的字符

candidate使用&method(:each)作为proc传递的method object &进行迭代。 method objectCompletion类上被调用。

candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}

self.candidate内的块iterates

def self.candidate(key, icase = false, pat = nil, &block)
  pat ||= Completion.regexp(key, icase)
  candidates = []
  block.call do |k, *v|
    // Search and add candidates
  end
  candidates
end

iteratoreach条目执行以下检查。 我仍然对此检查没有100%的了解,负责查找标记。

block.call do |k, *v|
  (if Regexp === k
     kn = ""
     k === key
   else
     kn = defined?(k.id2name) ? k.id2name : k
     pat === kn
   end) or next
  v << k if v.empty?
  candidates << [k, v, kn]
end
candidates