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種から選ぶ。
- rubymotionはAndroidにも対応するようだが、抽象化はライブラリ次第?
- rake
- rakeコマンドを叩いたときが快感、rake deviceも良い
- gem追加すれば、rake ib:openでinterface builderも開ける。驚き
補完
- CocoaのAPIを利用する場合、補完がないと初心者は厳しい
- 長いクラス名、メソッド名
- メソッド名の候補を表示する際に型を考慮してより候補を絞る
- インテリセンス(Visual Studio, RubyMine)
- オムニ補完(Vim)
- 明示的に型を指定するObjective-Cに対して、補完は弱くなるはず
- Rubyでは型を推定してメソッドの補完を呼び出す必要があるので、工夫が必要。RSenseがそれを行っているのか?
- Objective-Cでは先頭にヘッダファイルを書くので、ヘッダファイル経由で補完対象を呼び出しにいける
SwiftはRubyと同様の理由で補完が当初から存在していない?
- 現状のRubymotion(Ruby)の開発ではどうしているのか?
- 暗記
- スニペット
- インテリセンス(RubyMine)
rubymotionでCocoaPodsも補完したい
ReactiveCocoaを使いたいがクラス名とメソッド名がすぐに出てこない。
書き始めれば覚えてしまうのかもしれない。リファレンスを見るのがだるい。
どうにか補完でがんばる。
メソッド名の補完
- snipmate-snippets-rubymotion
- https://github.com/rcyrus/snipmate-snippets-rubymotion
- 本質は以下のgistでスニペットを作成する箇所
- https://gist.github.com/shayarnett/2652913
- rubymotionではrake ctagsでタグを出力できるのでそれを利用してスニペットを作成する手法
- まず rake ctags で CocoaPodsを参照するように変更する
- https://github.com/HipByte/RubyMotion/blob/8ad5261b1b622768ca64f0f5491d660fe54b0c0e/lib/motion/project.rb
- 上記URLを参考にしつつRakefileに以下を追加
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を改変する
#!/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の補完が出てしまう件については、我慢する。