rubymotion検討とvimでcocoapodsの補完(メソッド名とクラス名)

Swiftが発表されたすぐ後にrubymotionを購入し数日、経過した。
ネイティブアプリに関してもObjective-CとRubymotionの双方について1週間くらいチュートリアルなどを試して得られた、rubymotionに関する知見を書く。

Android開発についてはまったく知らない。

  • rubymotionはObjective-Cの代替手段と考える
    • Objective-Cの書き方が好きになれない場合に検討する
  • rubymotionやSwiftではなく、TitaniumかXamarinかCordovaを利用するべきシーン
  • rubymotionできればCocoa APIに詳しくなっているはずなので、Swiftでも困らないはず
  • rubymotionはCocoa APIにlock-inされるので、それを嫌う場合は前述の3種から選ぶ。
    • Titaniumはより複雑なことをしたい、もしくはパフォーマンスに問題ある箇所が出たならネイティブモジュールを書いた方が良い
      • そうすると結局はネイティブのAPIを覚えることになる
      • それでもTitaniumを使うことで手数が減るかどうか、のトレードオフ
  • rubymotionはAndroidにも対応するようだが、抽象化はライブラリ次第?
  • rake
    • rakeコマンドを叩いたときが快感、rake deviceも良い
    • gem追加すれば、rake ib:openでinterface builderも開ける。驚き

補完

  • CocoaAPIを利用する場合、補完がないと初心者は厳しい
    • 長いクラス名、メソッド名
  • メソッド名の候補を表示する際に型を考慮してより候補を絞る
  • 明示的に型を指定するObjective-Cに対して、補完は弱くなるはず
    • Rubyでは型を推定してメソッドの補完を呼び出す必要があるので、工夫が必要。RSenseがそれを行っているのか?
    • Objective-Cでは先頭にヘッダファイルを書くので、ヘッダファイル経由で補完対象を呼び出しにいける
    • SwiftはRubyと同様の理由で補完が当初から存在していない?
  • 現状のRubymotion(Ruby)の開発ではどうしているのか?

rubymotionでCocoaPodsも補完したい

ReactiveCocoaを使いたいがクラス名とメソッド名がすぐに出てこない。
書き始めれば覚えてしまうのかもしれない。リファレンスを見るのがだるい。

どうにか補完でがんばる。

メソッド名の補完
desc "Generate ctags"
task :ctags2 do
  tags_file = 'tags'
  config = App.config
  if !File.exist?(tags_file) or File.mtime(config.project_file) > File.mtime(tags_file)
    files = config.bridgesupport_files + config.vendor_projects.map { |p| Dir.glob(File.join(p.path, '*.bridgesupport')) }.flatten + config.files.flatten
    files << "./vendor/Pods/build-iPhoneSimulator/Pods.bridgesupport"
    ctags = File.join(config.bindir, 'ctags')
    config = File.join(config.motiondir, 'data', 'bridgesupport-ctags.cfg')
    sh "#{ctags} --options=\"#{config}\" #{files.map { |x| '"' + x + '"' }.join(' ')}"
  end
end
    • 前述のgistでスニペットを作る
      • rac...なんたらなメソッドが追加されていることを確認する
    • このままではクラス名が補完されないので辞書を作る
クラス名の補完
  • 前述のgistを改変する
#!/usr/bin/env ruby
require 'FileUtils'

words = []
File.read('tags').each_line do |line|
  next unless line.match /^[A-Z]\w+[^:]\t/
  line =~ /(^[^:\t]*)\t/
  words << $1
end
words.uniq!
File.open('rubymotion.dict', 'w') do |f|
  words.each do |word|
    f.write word+"\n"
  end
end
      • $HOME/.vim/dict あたりに生成されたファイルをつっこむ
      • .vimrcにてneocomplcacheを使っている。そのプラグインの方法でrubyファイルを読み込んだときの辞書ファイルを指定する
let g:neocomplcache_dictionary_filetype_lists = {
  \ 'ruby' : $HOME . '/.vim/dict/rubymotion.dict'
  \ }
    • UIWindowとかRACSignalとか書いて補完されることを確認する

この方法で未だコードを書き始めていないので便利かどうかは分からない。
別のプロジェクトにて追加していないcocoapodsの補完が出てしまう件については、我慢する。