VimでHaxeを書く時に入れておきたいプラグイン1つ and more

こんにちわ。
Haxeの開発環境と言えば、ネット上で紹介されるのはFlashDevelopやIDEAばかり。しかしこれらのIDEは、導入がめんどうだったり、独自のビルド用ファイルを使っていたりと気軽さや小回りに欠けるきらいがあります。

やはり、苛虐趣味の変態あるいは自分の頭のスペックはエディタだけで開発できるほどハイスペックと自慢したい人種であるところの僕としては、Haxeの開発といえどVimで行いたいものです。

幸い、Haxeは公式のコンパイラが高性能かつ、Makefile的なモノにあたる*.hxmlの仕様が簡潔なのもあり、素のVimでもほぼストレスなく開発出来ます。
そしてその上で、以下にあげるプラグインを導入すれば、IDEに負けない、人に優しいプヨグラミング環境の構築が実現でタイピング速度も倍点ですね？
　

## vaxe

[jdonaldson/vaxe](https://github.com/jdonaldson/vaxe)

オムニ補完をはじめとした機能を全部乗せで提供する、オールインワンなHaxe用プラグインです。
記事を書いたときの半年ほど前は不安定だったりしたのですが、今ではかなり安定して動作しています。

色々なプラグインとの連携も考慮されており、公式の画像だとこんな感じになっちょります。
![公式の](https://github-camo.global.ssl.fastly.net/4bfb5efb2f9b130fc59788c084ecc30cc6b32f92/687474703a2f2f692e696d6775722e636f6d2f4a46767a652e706e67)

このプラギンの一番のメリットは、なんといってもHaxeコンパイラの機能を利用した、高速で高度なオムニ補完機能です。
公式でのアナウンスーはありませんが、オムニ補完の関数を設定すればNeocompleteからも利用出来ます。


以下はVaxeの設定例です。
細かいところとかは、GithubのREADMEやhelpを参照したほうが安全です。

```vim
"set autogroup
augroup MyAutoCmd
  autocmd!
augroup END

" vaxeの動作にはautowriteを有効にする必要がある
autocmd MyAutoCmd FileType haxe
      \ setl autowrite
autocmd MyAutoCmd FileType hxml
      \ setl autowrite
autocmd MyAutoCmd FileType nmml.xml
      \ setl autowrite

let g:vaxe_haxe_version = 3

function! s:init_vaxe_keymap()
  " .hxmlファイルを開いてくれるやつ
  nnoremap <buffer> ,vo :<C-u>call vaxe#OpenHxml()<CR>
  " タグファイル作ってくれるやつ(別途、.ctagsの定義をしませう)
  nnoremap <buffer> ,vc :<C-u>call vaxe#Ctags()<CR>
  " 自動インポートな
  nnoremap <buffer> ,vi :<C-u>call vaxe#ImportClass()<CR>
endfunction

autocmd MyAutoCmd FileType haxe call s:init_vaxe_keymap()
autocmd MyAutoCmd FileType hxml call s:init_vaxe_keymap()
autocmd MyAutoCmd FileType nmml.xml call s:init_vaxe_keymap()

" 以下はNeocomplete用
if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.haxe = '\v([\]''"\)]|\w|(^\s*))(\.|\()'

```

　　

# おすすめの連携プラグイン

vaxe的には、[Tagbar](http://majutsushi.github.io/tagbar/), [syntatic](https://github.com/scrooloose/syntastic), [ powerline ](https://github.com/Lokaltog/powerline) or [ airline ](https://github.com/bling/vim-airline) の連携をおすすめ（というより標準で備えている）ようですが、僕はTagbar以外はどれも好きになれないので代替となるものを入れます。


 - Tagbar(そのまま)

 - エラー箇所を表示 

   [vim-hier](https://github.com/cohama/vim-hier)

 - カーソル化のエラー情報を出力

   [quickfixstatus](https://github.com/dannyob/quickfixstatus)

 - クールなステータスライン

   [lightline.vim](https://github.com/itchyny/lightline.vim)

お好みの方法でこの四つを導入します。
僕はNeobundleを使います。

なお、vim-hierに関してはcohama氏による改良版を使います。
こちらを使えば、行単位ではなくて問題のあるカラムのみをハイライトしてくれます。マルチバイト文字でのずれなどが発生するようですが、マルチバイト文字は使わなければ問題ないので問題ないです。

```vim
NeoBundle 'majutsushi/tagbar'
NeoBundle 'cohama/vim-hier'
NeoBundle 'dannyob/quickfixstatus'
NeoBundle 'itchyny/lightline.vim'
```
　　

次に、vaxeは :make を定義してくれていますので、makeすれば自動で`build.hxml`を探し出してコンパイルとエラー箇所の解析を行ってくれます。
以下のようなアレを定義して、hierやstatusの挙動やらをいい感じに制御したります。

```vim

" make後の結果をquickfixへ出力させる
autocmd QuickfixCmdPost make copen
autocmd QuickfixCmdPost make call <SID>auto_ccl()

function! s:auto_ccl()
  if &ft != 'qf'
    return
  endif

  " リストが空ならそのまま閉じる
  if getqflist() == []
    :QuickfixStatusDisable
    :cclose
  else
    :QuickfixStatusEnable
  endif
  :HierUpdate
endfunction

```

　　

最後に、ステータスラインです。見たところ、ビルド用のhxmlファイル名と、ビルドターゲットを表示してくれるもののようです。
なので、vaxeのソースをのぞいてそれっぽい関数を勝手に使います。

```vim

function! MyVaxe()
  if &ft == 'haxe'
    return pathshorten(fnamemodify(vaxe#CurrentBuild(), ':p:.')) . ' =>[' . vaxe#CurrentBuildPlatform() . ']'
  else
    return ''
  endif
endfunction
```

こんな感じの関数を作って、'component_function'に突っ込んでやりましょう。

なお、lightlineのカスタマイズについては[lightline.vim を使って vim のステータスラインをカスタマイズ](http://qiita.com/yuyuchu3333/items/20a0acfe7e0d0e167ccc)の記事がとても参考になります。

　　

以上のプラグインを入れてみたらイメージ図は以下のような感じになります。


![Screen Shot 2013-09-19 at 12.00.42 AM.png](https://qiita-image-store.s3.amazonaws.com/0/5640/592b466f-4105-b1f1-f6e0-66b91af150d8.png "Screen Shot 2013-09-19 at 12.00.42 AM.png")


端末のVimの画像なので、GVim系を使えばもっときれいに表示出来る可能性が重点ですね？