Anything.elが楽しいです♪
というわけで、ちょっとだけですが前回の記事からAnything.elをつかったObjective-Cのメソッドの補完をバージョンアップをさせてみました。何行か追加しただけなのですが、結構使い勝手がよくなった気がします。
;; anything-c-source-stClass-dumpの設定
;; stClass-dumpをanythingから使う key-mapはObjctive-Cの設定参照
(defvar anything-make-objc-method-command "stClass-dump %s")
(defun anything-c-make-objc-method-init ()
(start-process-shell-command "stClass-dump" nil
(format anything-make-objc-method-command
anything-pattern)))
(defvar anything-c-source-stClass-dump
'((name . "stClass-dump")
(candidates . anything-c-make-objc-method-init)
(action . (("InsertMethod" . anything-c-make-objc-insert-method)
("InsertAction" . anything-c-make-objc-insert-action)))
(requires-pattern . 3)
(delay)))
(defun anything-c-make-objc-insert-method (line)
(let ((selected-line (string-match " *\\(\\+\\|-\\) ([^)]*)\\([^;]*\\)" line)))
(insert (match-string 2 line))))
(defun anything-c-make-objc-insert-action (line)
(let ((selected-line (string-match " *\\(.*\\)$" line)))
(insert (match-string 1 line))))
(defun anything-objc-complete ()
(interactive)
(anything-other-buffer '(anything-c-source-stClass-dump)
"*anything-objc*"))
追加した機能は一つだけなのですが、画像の候補を選んでタブを押すと

こんな感じでActionが選択できるようになります

ここでInsertActionを選択すると、前回と同じで選択した項目がそのまま入力されます。

ここでInsertMethodを選択した場合

候補を選択してそのまま決定すると、InsertMethod が選択されます。 InsertAction を選択する場合は C-e もしくは TAB で候補を出してから InsertAction を選択してください。
一番上の画像のように -C UIApplication と指定すると UIApplication を含むクラスに絞った検索ができるようになっています。
ついでにiPhoneの開発しかしない & UIKit.framework のメソッドだけ補完できればいいという人は、以下のように書き換えるのもおすすめです。
(defvar anything-make-objc-method-command "stClass-dump %s")
↓
(defvar anything-make-objc-method-command "stClass-dump -i uikit -C %s)
この設定だと一番上の画像のように「UIKit.framework内の文字列 “UIApplication” を含むクラスで “application” を含むメソッドの検索が、「UIApplication -f application」と検索するだけで出てくるようになります。楽ちんなのです。ぜひ使ってみてくださいね。
でわでわ、たかともでした。
Emacsの記事ばっかりでVimからEmacsに乗り換えたのか??と思われると寂しいので、Vimのウィンドウを便利にする設定の紹介です。。。。といってもたいしたことはしていないのですが。
Vimの設定ファイルに以下を追加します
set statusline=[%{winnr('$')>1?''.winnr().'/'.winnr('$'):''}]\ %<\ %f\ %m%r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).'\|'.&ff.']'}%=%l/%L\ (%P)
nnoremap <silent> <TAB> <C-w>w
現在のステータスバーの設定がある人はそこに
[%{winnr('$')>1?''.winnr().'/'.winnr('$'):''}]の部分を追加します。
上記の設定をするとステータスバーが以下の画像のような表示になります。

一番左に表示されているのが分割ウィンドウの番号なので、ノーマルモードで 「移動したいウィンドウの番号<TAB>」 と入力すると、そのウィンドウに移動することができます。もしタブに割り当てするのは。。。という場合は、「移動したいウィンドウの番号<C-w>w」 で移動することができます。上の画像のウィンドウに移動するときは「1<TAB>」
よかったらつかってみてください。
でわでわ、たかともでした。
Emacs テクニックバイブルを手にいれたかた、どれぐらいいるんでしょうか?
たかともはいまだに購入を迷っています。知っていることも多いというのが一番の悩み。最後の方のAnything.elの章はものすごく手元にほしいのですが、それだけのために購入していいものかというところです。
そんなわけでAnything.elを使ってObjective-Cのメソッド名を補完するanything-c-sourceを作ってみました。
導入にあたって必要なもの
Anything.elはもう導入できているものとして、class-dump,stClass-dumpについては、この記事を参照にインストールしてください。ということで、あとはEmacsの設定ファイルにコードを追加していくだけになります。
(add-hook 'objc-mode-hook
(lambda ()
(define-key objc-mode-map (kbd "C-;") 'anything-objc-complete)))
;; anything-c-source-stClass-dumpをつくる。
(defvar anything-make-objc-method-command "stClass-dump %s")
(defun anything-c-make-objc-method-init ()
(start-process-shell-command "stClass-dump" nil
(format anything-make-objc-method-command
anything-pattern)))
(defvar anything-c-source-stClass-dump
'((name . "stClass-dump")
(candidates . anything-c-make-objc-method-init)
(action . anything-c-make-objc-insert-action)
(requires-pattern . 3)
(delay)))
(defun anything-c-make-objc-insert-action (line)
(let ((selected-line (string-match " *\\(.*\\)$" line)))
(insert (match-string 1 line))))
(defun anything-objc-complete ()
(interactive)
(anything-other-buffer '(anything-c-source-stClass-dump)
"*anything-objc*"))
使い方
iPhone開発に使う場合
- -i : iOS SDKに含まれるフレームワークをすべて表示
- -i フレームワーク名 : フレームワーク名を検索
- -i フレームワーク名 -a : フレームワークに含まれるメソッド・プロパティを検索
- -i フレームワーク名 -f : フレームワークに含まれるメソッド一覧
- -i フレームワーク名 -f hoge : フレームワークに含まれるメソッドでhogeを含むものを検索
Mac開発に使う場合は -i を -m に変更してください。
選択した項目はカーソル位置に挿入されるようになっています。また以下のように設定しておくとメソッド名をほとんどみられるようになっておいしいかもしれません。
(setq anything-candidate-number-limit 30000)
(setq anything-lisp-complete-symbol-set-timer 500)
(setq anything-mp-highlight-delay nil)
(setq anything-mp-highlight-threshold nil)
まだ設定したばかりですが、 「-i uikit -f numberOf…」のように検索して、メソッドを選択していくような使い方を想定しています。=他の機能はおまけ。よかったら試してみてください。そのうち「-(void)hotehote」をそのまま入力するのではなくて、 [hogehoge addSubView:]のような形での入力もできるように仕様と思っています。
でわでわ、たかともでした。
おまけ: anything の入力をするときに /Applications/Safari.app などすると Safariで使っているメソッドが見られるようになっています。
Emacsをいじっていて、すごく楽だったのが別の分割ウィンドウをスクロールさせるコマンド
ちょっと横に開いたファイルをみるときとか、かなり重宝したのでVimでもできないかなぁ〜と探してみたのですが、見つからなかったのでさくっとスクリプトを書いてみました。
nnoremap <C-`> :<C-u>call g:ScrolOtherWindow(1)<CR>
inoremap <C-`> <Esc>:<C-u>call g:ScrolOtherWindow(1)<CR>i
nnoremap <C-~> :<C-u>call g:ScrolOtherWindow(0)<CR>
inoremap <C-~> <Esc>:<C-u>call g:ScrolOtherWindow(0)<CR>i
function! g:ScrolOtherWindow(direction)
let current = winnr()
if a:direction == 1
wincmd w
execute "normal \<C-d>"
execute current . "wincmd w"
else
wincmd w
execute "normal \<C-u>"
execute current . "wincmd w"
endif
endfunction
たしか元のウィンドウに戻るコマンドがあったと思ったのですが、探すよりもこれぐらいなら書いてしまった方が早いかな?なんておもったので、winnr()を使って現在の分割ウィンドウに戻るようにしてしまいました。実際には Control + `・Control + ~ を使わずに Option + `・Option + ~ に割り当てて使っています。好きなキーバインドに割り当てて使ってください。
うむ、だんだんVimが便利になってきた♪
ちなみにこのスクリプトをつくったのはVimShellで前回の記事で紹介したclass-dumpを拡張したものをつかったときにウィンドウを移らずにチェックしたかった。それだけだったりします。意外と便利だと思うのでよかったらVimの設定ファイルにいれてみてください。
でわでわ、たかともでした
・・・というか、もともとこの機能あったらごめんなさい>< Vimをバカにしてごめんなさい
Objective-Cのメソッド名って長くって覚えられない。そんな自分のためにclass-dumpというシェルスクリプトを利用して、簡単にメソッド名を検索できるスクリプトを作ってみました。といってもclass-dumpにちょっとオプションを追加しただけのスクリプトですが。
インストール方法
- まずはここからclass-dumpというシェルスクリプトをダウンロード。
- PATHの通った場所にclass-dumpを移動。PATHの通った場所はターミナルで「echo $PATH」で確認してください。
- 次にここからstClass-dumpをダウンロード
- class-dumpを移動させたフォルダにファイルを移動させる。
- ターミナルで「cd 移動させたフォルダ」「chmod +x class-dump stClass-dump」とコマンドを打つ。
これで準備は完了です。
class-dumpに追加したオプションとして -i と -m があります。
- -i オプション
- iOS SDKに含まれるフレームワークからの検索
- $ stClass-dump -i
- iOS SDK に含まれるフレームワークをすべて表示
- $ stClass-dump -i フレームワーク名 (拡張子はいれない、大文字小文字は無視します)
- 指定したフレームワークを検索
- $ stClass-dump -i フレームワーク名 -a
- 指定したフレームワークのメソッド名、プロパティをすべて表示
- $ stClass-dump -i フレームワーク名 -f hoge
- 指定したフレームワーク内のメソッドでhogeを含むメソッドを検索
- -m オプション
- Macのフレームワークからの検索。使い方は -i オプションと同じです。
- -m オプションも -i オプションつけずに使った場合
- class-dumpと同じ挙動になっています。
-i -m オプションをstClass-dumpコマンドの後につけた場合、それぞれフレームワークを検索してclass-dumpに渡しているだけのスクリプトなので、-i -m オプション以外はclass-dumpのオプションがそのまま使えるようになっています。詳しい使い方を知りたいときは class-dump –helpでもしてみてください。
class-dumpの機能としてバイナリファイルに含まれているヘッダーを出力できるようになっています。
$ stClass-dump /Applications/Safari.app/Contents/MacOS/Safari などするとSafariで使われているクラスやメソッドがみれて楽しいですよ〜。ためしてみてください♪
たかともが、いちばん使うのは $ stClass-dump -i uikit -f hoge 。
$ class-dump /Developer/Platform/iPhoneOS なんちゃら〜 -f hoge が長い。。。という理由、それだけ。
みなさんも使ってみてくださいね。
でわでわ、たかともでした。
追記1: もしSDKのバージョンがかわったらファイルのFWFOLDERの部分を直してください。別のフォルダを追加したい場合もFWFOLDERに追加すれば使えるので、外部のフレームワークを入れているフォルダがあれば、そのフォルダも追記してください。
追記2: バグ?
- フレームワークの指定が1つしかできない。2つ以上のフレームワークの串刺し検索はできない。
- Cocoa.framaworkが検索できない。AppKit、Foundation、CoreDataを指定して使ってください。
1つめのフレームワークの指定に関してはスクリプトを変更することで対応できるのですが、2つめのCocoa.frameworkに関してはclass-dump自体がCocoa.frameworkを指定したときに検索ができないので、対応できません。ただし、Cocoa.framework自体はAppKit、Foundation、CoreDataをインポートしているものなので、AppKit、Foundation、CoreDataを指定して検索することで参照することはできるようになっています。