У меня действительно проблемы с чтением кода с пробелами, поэтому я использую редактор кода 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!
В настоящее время не работает:
- Влияет на пробелы (\ t , \ r, \ n) кроме пробелов.
- Влияет на вывод кода, преобразует только пробелы в табуляции.
Я не могу использовать свой редактор, потому что:
- С 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