2012年1月15日日曜日

[vim] 地味に便利。関数を抽出するunite sourceを作った。

前々から書いてみようと思っていたunite のsource。
現在編集しているファイルから関数を定義している行を抽出し、そこにジャンプできるものを書いた。


uniteソースの書き方


unite、vim、source、書き方、
とか調べたら結構出てきた。

あと、unite.vimのデフォルトソースとか参考になった。


使い方


プログラムのファイルを開いた状態で、
vimのコマンドに以下を入力すると。
:Unite get_function


こんな感じで表示される。
Sources: get_function
>
-   13   public function executeIndex(sfWebRequest $request)
-   21   public function executeShow(sfWebRequest $request)
-   27   public function executeNew(sfWebRequest $request)
-   32   public function executeCreate(sfWebRequest $request)
-   45   public function executeEdit(sfWebRequest $request)
-   51   public function executeUpdate(sfWebRequest $request)
-   62   public function executeDelete(sfWebRequest $request)
-   72   protected function processForm(sfWebRequest $request, sfForm $form)

たとえば、「- 32 public function executeCreate(sfWebRequest $request)」を選択してEnterを押すと。
  public function executeCreate(sfWebRequest $request)
  {
    $jobeet_affiliate::func_karino2();
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new jobeet_jobForm();
    $this->processForm($request, $this->form);
    $this->setTemplate('new');
  }
この関数にジャンプする。
普通に便利だ。
これあれば、foldingとかいらないんじゃないかな。

実際使うときは、下の感じでキーバインドを設定した。
noremap  :Unite  get_function -direction=botright  


インストール


以下のソースを
.vim/bundle/unite-function/autoload/unite/sources
以下に配置。

"----------------------------------------------------------+
" get function                                             |
"----------------------------------------------------------+
let s:save_cpo = &cpo
set cpo&vim


" define source
let s:get_function = {
\   'name': 'get_function',
\   'action_table': {},
\   'default_action': {'common':'execute'},
\}


" bzr status
function! s:get_function.gather_candidates(args, context)

  let s:path = expand('%:p')
  let s:ext  = expand('%:e')
  let s:lines = getbufline('%', 1, '$')

  let s:func_list = []
  let s:line_number = 1

  for line in s:lines
    if line =~ 'function ' && s:ext == "php"
      call add(s:func_list, [s:line_number, line])

    elseif line =~ 'function! ' && s:ext == "vim"
      call add(s:func_list, [s:line_number, line])

    elseif line =~ 'def ' && s:ext == "py"
      call add(s:func_list, [s:line_number, line])

    endif
    let s:line_number += 1
  endfor

  return map(copy(s:func_list), '{
  \   "word": v:val[0]." ".v:val[1],
  \   "source": "get_function",
  \   "kind": "jump_list",
  \   "action__path": s:path,
  \   "action__line": v:val[0]
  \ }')

endfunction

"
function! unite#sources#get_function#define()
    return [ s:get_function ]
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo

0 件のコメント:

コメントを投稿