【问题标题】:Rubocop for tabs用于标签的 Rubocop
【发布时间】:2014-07-25 14:21:40
【问题描述】:

我们想使用 Rubocop 来验证我们的 ruby​​ 在语法上是否正确并遵循基本的代码指南。

除此之外,我们有这条规则:我们使用制表符缩进以允许任何人决定他们希望如何呈现它们(将它们显示为 2 或 4 个空格)

问题在于 rubocop 似乎完全拒绝缩进的制表符。

我们怎样才能超越所有这些规则成为空间兼容者?

编辑:我正在考虑覆盖此模块 https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/source_parser.rb 以将我文件中的所有选项卡替换 2 个空格,以创建 gem 的错觉...

【问题讨论】:

    标签: ruby syntax tabs space rubocop


    【解决方案1】:

    耐心等待,我亲爱的同事们,希望the PR into the Rubocop core 启用标签缩进很快就会被合并。现在,您可以在项目的某处创建以下 rb 文件,并在运行 rubocop 时需要它。

    rubocop [...] --require rubocop_tabs.rb
    

    rubocop_tabs.rb:

    # frozen_string_literal: true
    
    require 'rubocop'
    require 'set'
    
    RuboCop::ConfigLoader.default_configuration['Layout/Tab']['SupportedStyles'] = %w[tab space]
    RuboCop::ConfigLoader.default_configuration['Layout/Tab']['EnforcedStyle'] = :space
    
    module RuboCop
        module Cop
            module Layout
                class Tab < Cop
                    include Alignment
                    include RangeHelp
                    include ConfigurableEnforcedStyle
    
                    MSG = '%<type>s detected.'
    
                    def investigate(processed_source)
                        str_ranges = string_literal_ranges(processed_source.ast)
    
                        processed_source.lines.each.with_index(1) do |line, lineno|
                            match = style == :tab ? line.match(/\A\s* +/) : line.match(/\A\t+/)
                            next unless match
    
                            range = source_range(processed_source.buffer, lineno, match.begin(0)...match.end(0))
                            next if in_string_literal?(str_ranges, range)
    
                            add_offense(range, location: range)
                        end
                    end
    
                    def autocorrect(range)
                        if style == :tab
                            lambda do |corrector|
                                corrector.replace(range, range.source.gsub(/\A\s+/) do |i|
                                    "\t" * i.size
                                end)
                            end
                        else
                            lambda do |corrector|
                                spaces = ' ' * configured_indentation_width
                                corrector.replace(range, range.source.gsub(/\t/, spaces))
                            end
                        end
                    end
    
                    private
    
                    def message(_node)
                        format(MSG, type: style == :tab ? 'Space' : 'Tab')
                    end
                end
            end
        end
    end
    

    还将以下内容添加到您的.rubocop.yml

    Layout/Tab:
      EnforcedStyle: tab
    

    【讨论】:

      【解决方案2】:

      对于最新版本,请将其添加到您的 .rubocop.yml 文件中:

      Layout/Tab:
        Enabled: false
      

      您可以在此处找到所有默认选项:

      https://github.com/rubocop-hq/rubocop/blob/master/config/default.yml

      而且,这里定义了规则:

      https://github.com/rubocop-hq/rubocop/blob/master/lib/rubocop/cop/layout/tab.rb

      【讨论】:

        【解决方案3】:

        作为一个邪恶的不悔改的标签用户,我最终像这样破解了它。 0.32.1 的差异:

        --- processed_source.rb.orig    2015-07-28 05:53:52.199418557 +0100
        +++ processed_source.rb 2015-07-28 05:54:04.750420458 +0100
        @@ -13,7 +13,7 @@
                         :parser_error, :raw_source
        
             def self.from_file(path)
        -      file = File.read(path)
        +      file = File.read(path).gsub(/^(\t+)/) {|m| '  ' * m.size }
               new(file, path)
             rescue
               abort("#{Rainbow('rubocop: No such file or directory').red} -- #{path}")
        

        您现在应该完美地融入其中。哇哈哈哈。

        【讨论】:

          【解决方案4】:

          我覆盖了这个模块https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/source_parser.rb 将我文件中的所有选项卡替换为 2 个空格,以创建 gem 的错觉...

          【讨论】:

            【解决方案5】:

            添加到您的.rubocop.yml

            Style/Tab:
              Enabled: false
            

            禁用标签规则。

            您可以编写自己的custom cop 来检查缩进是否正确。

            【讨论】:

            • 但是例如,如果我在“private”前面使用一个标签,我会收到一个错误,它前面没有缩进!
            • 这是否意味着我必须重写所有使用缩进的警察?如果是的话,那就是很多
            • 是的......你是对的。 Ruby 的缩进规则实际上是完全被接受的——两个空格缩进——没有制表符。也许 rubocop 毕竟不是适合你的工具......
            猜你喜欢
            • 2018-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 2016-05-14
            相关资源
            最近更新 更多