2010-10-16
■[Xcode]XcodeのUserScript
こちらの記事をみて、昔 cocoa 勉強会でちょこっと紹介した内容に似たようなのがあったのを思い出しました。
久しぶりなのでブログに書いてみようかと思いました。
Objective-C 2.0 の プロパティ定義文を挿入する UserScript
さきの記事ではテキストマクロとしてプロパティ定義文を挿入して実際のプロパティ名は自分で入力するような形をとっていました。
私はもっと怠け者なので文字入力なしで済ましたいと思ったので UserScript にしました。
UserScript とは
これ。
ちょっとしたことができる仕組みです。
デフォルトで入っているのものでおそらくみんながお世話になっているだろう
コメントアウトのショートカット Cmd+/ は実は Perl で書かれた UserScript が実行されています。
何ができる?
こんなのが実行できます。
- Automator のワークフローを実行
- シェルスクリプト
- LL 言語
- AppleScript
入力としては以下のものを受けられます。
出力はこんな感じ。
メニューから " Edit User Scrippts ..." を選べば編集画面が表示されます。
ショートカットキーもここでわりあてられます。
UserScript でプロパティ定義文を挿入する
やりたいことは
以下の2パターン作ったことがありますが、今回はクリップボード拡張を導入していない人向け。
@property を挿入する UserScript
#!/usr/bin/env ruby lines = `pbpaste` lines.each { |line| if line.match(/([_A-Za-z][_A-Za-z0-9]*\s*)+([\s\*]+)([_A-Za-z][_A-Za-z0-9]*);/) klas = $1 star = $2 ivar = $3 if klas != nil if /\ANSString/ =~ klas print "@property (nonatomic, copy) #{klas.strip} #{star.strip}#{ivar};\n" elsif /\Aid/ =~ klas if /delegate/ =~ ivar print "@property (assign) #{klas.strip} #{star.strip}#{ivar};\n" else print "@property (nonatomic, retain) #{klas.strip} #{star.strip}#{ivar};\n" end elsif /\*/ =~ star print "@property (nonatomic, retain) #{klas.strip} #{star.strip}#{ivar};\n" else print "@property (assign) #{klas.strip} #{star.strip}#{ivar};\n" end elsif star == nil end end }
使い方は
インスタンス変数定義部分をまとめてコピーして挿入したい場所でこのスクリプトを実行。
すると
- NSString は @property (nonatomic, copy)
- delegate という変数名は @property (assign)
- その他オブジェクトは @property (nonatomic, retain)
- オブジェクト以外は @property (assign)
として挿入します。
@synthesize を挿入する UserScript
#!/usr/bin/env ruby lines = `pbpaste` lines.each { |line| if line.match(/([_A-Za-z][_A-Za-z0-9]*\s*)+([\s\*]+)([_A-Za-z][_A-Za-z0-9]*);/) klas = $1 star = $2 ivar = $3 print "@synthesize #{ivar};\n" end }
使い方は
インスタンス変数定義部分をまとめてコピーして挿入したい場所でこのスクリプトを実行。
release を挿入する UserScript
#!/usr/bin/env ruby lines = `pbpaste` def releaseAndNil(variable) print "[#{variable} release], #{variable} = nil;\n" end lines.each { |line| if line.match(/([_A-Za-z][_A-Za-z0-9]*\s*)+([\s\*]+)([_A-Za-z][_A-Za-z0-9]*);/) klas = $1 star = $2 ivar = $3 if klas != nil if /\ANSString/ =~ klas releaseAndNil(ivar) elsif /\Aid/ =~ klas if /delegate/ =~ ivar print "delegate = nil;" else releaseAndNil(ivar) end elsif /\*/ =~ star releaseAndNil(ivar) end end end }
使い方は
インスタンス変数定義部分をまとめてコピーして挿入したい場所でこのスクリプトを実行。
すると
として挿入します。
保存方法
今回紹介したスクリプトは Output を ”Insert after Selection” として保存してください。
使い方の流れとしてはこんな感じで使うとインスタンス変数のリリース漏れなどを起こしにくいと思います。
- インスタンス変数をずらっと定義
- 定義部分をコピー
- プロパティ定義を挿入したい箇所で「@property を挿入する UserScript」を実行
- 実行ファイルを開いて@synthesize を挿入したい箇所で「@synthesize を挿入する UserScript」を実行
- dealloc メソッド内で「release を挿入する UserScript」を実行
その他
今回のスクリプトは普段使っていて特に問題はありませんでしたが、結構適当なのでコーディングスタイルが違う人は使えない代物かもしれません。ご利用は自己責任でお願いします。
- 980 http://java.cocolog-nifty.com/blog/2008/03/safarigesture_7281.html
- 813 http://samuraism.jp/diary/2008/11/26/1227631069299.html
- 514 http://www.google.co.jp/search?client=safari&rls=en&q=Xcode+ショートカット&ie=UTF-8&oe=UTF-8&redir_esc=&ei=WLK7TNf7NITUvQOpi6XTDQ
- 484 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/griffin-stewie/20090311/p1&rct=j&q=Xcode 補完&ei=y5CvTar5AYbwvwO20tmQBw&usg=AFQjCNFxkGC8jxNtKj8zrX3j8ul8gnyHvA
- 428 http://www.google.co.jp/search?client=safari&rls=en&q=SafariGestures&ie=UTF-8&oe=UTF-8&redir_esc=&ei=IZ65TL62HI-gvQPM_6y3DQ
- 359 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=XCode+コメントアウト
- 354 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=xcode+debug+コンソール
- 339 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/griffin-stewie/20080830/p1&rct=j&q=iphone 写真 転送 mac&ei=17eTTYDSEIm8vwOQ3_S8CA&usg=AFQjCNFgQhJk6MFG0dt99d5qKdKa
- 338 http://www.google.co.jp/search?client=safari&rls=en&q=safari+マウスジェスチャー&ie=UTF-8&oe=UTF-8&redir_esc=&ei=bge7TMe5CouWvAOTr823DQ
- 333 http://yskhori.seesaa.net/article/96660030.html






