禁用 Ruby 中 OptionParser 标志的自动完成

6
#!/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

我想禁用此自动完成/最接近匹配的行为,并在未提供完全名称时使 OptionParser 报错,但我在他们的文档中没有找到这样做的方法。
有任何想法吗?

值得在这里检查源代码以获取解决方案。 - tadman
1
正如 @tadman 所指出的那样,快速扫描 GitHub 上的源代码 看起来只需要简单地为 complete 方法创建一个别名就可以解决这个问题。 - ForeverZer0
1个回答

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 迭代使用作为 proc 传递的 方法对象 &method(:each)方法对象Completion 类上调用。

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

该块迭代self.candidate内部进行。

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

迭代器对每个条目运行以下检查。我仍然没有完全理解这个检查,它负责查找标志。
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

@Kyle Decot &method(:each) 是一个 method 对象。但我仍然没有完全理解 block.call() 内部的正则表达式检查。 - Fabrizio Bertoglio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接