Отступ пробелов до табуляции - PullRequest
2 голосов
/ 02 августа 2020

У меня действительно проблемы с чтением кода с пробелами, поэтому я использую редактор кода Visual Studio для отступа кодов от пробелов до табуляций, прежде чем я их читаю. приходится повторять одну и ту же операцию. Итак, я хочу использовать Dir.glob, чтобы перебирать их все и скрывать пробелы во вкладках и перезаписывать эти файлы. Это ужасная идея, но все же ...

В настоящее время мой метод String # space_to_tabs () выглядит так:

Код

# A method that works for now...
String.define_method(:spaces_to_tabs) do
    each_line.map do |x|
        match = x.match(/^([^\S\t\n\r]*)/)[0]
        m_len = match.length
        (m_len > 0 && m_len % 2 == 0) ? ?\t * (m_len / 2) + x[m_len .. -1] : x
    end.join
end

Какой тип работает

Вот тест:

# Put some content that will get converted to space
content = <<~EOF << '# Hello!'
  def x
    'Hello World'
  end

  p x

  module X
    refine Array do
      define_method(:tally2) do
        uniq.reduce({}) { |h, x| h.merge!( x => count(x) ) }
      end
    end
  end

  using X
  [1, 2, 3, 4, 4, 4,?a, ?b, ?a].tally2
  p [1, 2, 3, 4, 4, 4,?a, ?b, ?a].tally2
  \r\r\t\t # Some invalid content
EOF

puts content.spaces_to_tabs

Вывод:

def x
    'Hello World'
end

p x

module X
    refine Array do
        define_method(:tally2) do
            uniq.reduce({}) { |h, x| h.merge!( x => count(x) ) }
        end
    end
end

using X
[1, 2, 3, 4, 4, 4,?a, ?b, ?a].tally2
p [1, 2, 3, 4, 4, 4,?a, ?b, ?a].tally2
         # Some invalid content
# Hello!

В настоящее время не работает:

  1. Влияет на пробелы (\ t , \ r, \ n) кроме пробелов.
  2. Влияет на вывод кода, преобразует только пробелы в табуляции.

Я не могу использовать свой редактор, потому что:

  1. С Dir.glob (не включенным в этот пример) я могу перебирать только .rb,. js, .erb,. html,. css и .s css files.

Кроме того, это медленно, но у меня может быть не более 1000 файлов (выше расширений) с 1000 строк кода для каждого файла, но это максимум и не слишком практично, у меня обычно <100 файлов с парой сотен строк кода. Код может занять 10 секунд, что здесь не проблема, так как мне нужно запустить код один раз для проекта ... </p>

Есть ли лучший способ сделать это?

Edit

Вот полный код с подстановкой для преобразования всех основных файлов в рельсы:

#!/usr/bin/ruby -w
String.define_method(:bold) { "\e[1m#{self}" }

String.define_method(:spaces_to_tabs) do
    each_line.map do |x|
        match = x.match(/^([^\S\t\n\r]*)/)[0]
        m_len = match.length
        (m_len > 0 && m_len % 2 == 0) ? ?\t * (m_len / 2) + x[m_len .. -1] : x
    end.join
end

GREEN = "\e[38;2;85;160;10m".freeze
BLUE = "\e[38;2;0;125;255m".freeze
TURQUOISE = "\e[38;2;60;230;180m".freeze
RESET = "\e[0m".freeze
BLINK = "\e[5m".freeze

dry_test = ARGV.any? { |x| x[/^\-(\-dry\-test|d)$/] }
puts "#{TURQUOISE.bold}:: Info:#{RESET}#{TURQUOISE} Running in Dry Test mode. Files will not be changed.#{RESET}\n\n" if dry_test

Dir.glob("{app,config,db,lib,public}/**/**.{rb,erb,js,css,scss,html}").map do |y|
    if File.file?(y) && File.readable?(y)
        read = IO.read(y)
        converted = read.spaces_to_tabs

        unless read == converted
            puts "#{BLINK}#{BLUE.bold}:: Converting#{RESET}#{GREEN} indentation to tabs of #{y}#{RESET}"
            IO.write(y, converted) unless dry_test
        end
    end
end

1 Ответ

1 голос
/ 02 августа 2020

Если это просто интеллектуальное упражнение об алгоритмах отступа табуляции, тогда хорошо. Если у вас действительно проблемы с просмотром файлов, используйте Rubocop. У него есть параметры конфигурации, которые позволяют украсить код, а также тип создаваемых им пробелов и степень применяемого отступа. Я использую его с Atom и atom-beautify, но я уверен, что у него тоже есть плагин для кода VS. https://docs.rubocop.org/rubocop/0.86/cops_layout.html#layoutindentationconsistency

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...