読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Vim でJava を書く環境を整えましたが、IDE で良い気がします

VimJava を書く環境を整えました。

結論

Eclipse 等のIDE を利用したほうが良いと思います!!! 理由は色々あるので後述します。 あと、Eclipse だとVrapper というVimキーバインドを再現するプラグインがあるので、 それを使えばある程度幸せに暮らせると思います。

本記事で取り上げるプラグイン達

取り上げないけれど、入っていると心が豊かになるであろうプラグイン達

  • NeoBundleVundle といったプラグインを管理するプラグイン
  • vim-quickrun
    • Normal Mode で'\r' を押下すると *1Java でもコンパイルして実行してくれるので便利です。
  • neocomplcache
    • 各種補完をサポートしてくれます。非常に強力なので良いです。
  • neosnippet
    • スニペットによる補完をサポートしてくれます。非常に強力なので良いです。
  • vim-surround
    • 括弧やクォーテーションの入力等をサポートしてくれます。
  • tcomment_vim
    • コメント文の入力、もしくは解除 (つまりはトグル) をサポートしてくれます。
  • textobj-wiw
    • キャメルケース、あるいはアンダーバーで区切られた単語をテキストオブジェクトとして扱ってくれます。

java.vim

vim-scripts/java.vim · GitHub java.vim は入力を補助してくれるキーマップが登録されているプラグインファイルです。 取り上げてはみましたが、実際はneosnippet があれば事足りるので使ってません。

javaid.vim

javaid.vim Java 用の拡張シンタックスファイルです。詳細なシンタックスハイライトが有効になります。 取り上げてはみましたが、 Vim デフォルトのシンタックスハイライトでも十分な感じがしますし、 ファイルの最終更新日が結構古い (2005 年) 上に、Github 等にリポジトリが無くて、 プラグイン管理するのがダルく感じたので使ってません。

javacomplete

vim-scripts/javacomplete · GitHub Java 用のOmni 補完プラグインです。このプラグインをインストールするとOmni 補完が有効になります。 neocomplcache と組み合わせると強力です。が、上手く動かないケースがままあるので、 その時は なんかで手動でOmni 補完を叩き起こす必要があります。 あと、インストール後の初期状態でこのプラグインを扱うと、 VimにJava補完のjavacompleteをインストール - 30日でいいのでプログラミング で言及されているように、ホームディレクトリ以下にReflection.class が生成されて気分が悪くなります。 解決するためにはインストール後にプラグインに含まれているReflection.java ファイルをコンパイルする必要があります。 僕はNeoBundle を使っているので、以下のように書いて使っています。 こうすると (インストール | アップデート) 時に自動的にコンパイルを通してくれるので便利です。
NeoBundleLazy 'vim-scripts/javacomplete', {
\   'build': {
\       'cygwin': 'javac autoload/Reflection.java',
\       'mac': 'javac autoload/Reflection.java',
\       'unix': 'javac autoload/Reflection.java',
\   },
\}

jcommenter.vim

vim-scripts/jcommenter.vim · GitHub Javadoc の入力補助を行なってくれます。 雑な紹介のしかたをするとJAutoDocVim 版みたいな感じです。 オリジナルのjcommenter.vim はファイルフォーマットと改行コードの関係で読み込み時にエラーが出てしまっていたので、 僕がfork して、自前でファイルフォーマットを修正したバージョンを利用しています。*2 moznion/jcommenter.vim · GitHub ← コレ

java_getset.vim

vim-scripts/java_getset.vim · GitHub アクセッサの記述をサポートしてくれるプラグインです。地味に便利です。 ただ、オリジナルのjava_getset.vim が生成するアクセッサは
public String getFoo()
{
    return foo;
}
みたいな感じでGNU スタイルなのに加えて、this キーワードがメンバ変数に付加されないので、 その辺を改造したオレオレプラグインをfork して作りました。*3 moznion/java_getset.vim · GitHub ← コレ このオレオレプラグインでは新たに"b:javagetset_enable_K_and_R" と"b:javagetset_add_this" という変数を作ったので、
" K&Rスタイルを有効にする (1 の時に有効)
let b:javagetset_enable_K_and_R=1
" this キーワードを付加する (1 の時に付加する)
let b:javagetset_add_this=1
という風に.vimrc 等で指定してやると、
public String getFoo() {
    return this.foo;
}
というゲッタ (あるいはセッタ) を返してくれるようになります。

java_checkstyle.vim

vim-scripts/java_checkstyle.vim · GitHub vim 上でCheckStyle を通せるようになるという代物です。 予め、コンピュータにCheckStyle がインストールされていることが前提です。 僕の環境だとなんだか上手く動かなかったので使ってません。 ファイル保存時にフックしてその都度CheckStyle を走らせるというスタイルに憧れていましたが、 今になって思ってみれば、保存の処理速度が遅くなる事が予想されるのでイライラする事請け合いです。

そんな感じで

環境を整えてみましたが、Java を書くならなんだかんだでIDE の方が良いと思います。

IDE の方がいいと思う理由

VimJava を書く人が少ないのか、プラグイン等が少ないので他言語と比べると物足りないです。 というか、Java に関してはIDE、特にEclipse が最強すぎます。 特にEclipse は、
  • リアルタイムコンパイル
  • めちゃくちゃ強力な補完
  • CheckStyleFindBugs 等の外部プラグインと簡単に連携が取れる
  • Maven やらAnt やらGradle といったビルドツールとも親和性が高い
  • リファクタリング機能
  • (頭の良い)シンタックスハイライト
  • キーマッピングによる、痒い所に手が届く機能へのイージーアクセス化
なんかが強すぎです。(あと、Android アプリの開発環境なんかも整ってますね) その影響で「わざわざVim で書かなくても……」という感じになって、皆さんEclipseJava をお書きになるのでは無いでしょうか。 割と僕もそう思ってて、ある一定よりも規模の大きいプロジェクトになってくると、やっぱりIDE の方が強いなーと実感します。 あと偏見かも知れませんが、そもそもJava での開発って全体的に重い感じがします。 リアルタイムでコンパイルしてみたり、CheckStyle を走らせてみたり……といった重い処理をVim にやらせるのは何か変な気がします。 Vim にはできるだけ軽く、自分が望んだ最低限の事のみをこなして欲しいので、 そう考えるとJava での開発はIDE に任せたほうが良いのかなーと思うなどしました。 ただ、書き捨てるようなプロトタイプ的なプログラムを書く分にはVim でも十分いけるとは思います。 でも、普段使いはEclipse + Vrapper になるのかなー、という感じです。

(補足) Java のシンタックスハイライトについて

僕は以下のように書いています。こう書くと良い感じに色鮮やかになります。
let g:java_highlight_all=1
let g:java_highlight_debug=1
let g:java_allow_cpp_keywords=1
let g:java_space_errors=1
let g:java_highlight_functions=1

(付録) ぼくのかいたオレオレプラグインと.vimrc

moznion/vimrc · GitHub moznion/java_getset.vim · GitHub moznion/jcommenter.vim · GitHub

*1:デフォルトの設定の場合

*2:pull-request を送ったほうが良いのでしょうか……

*3:実際はそんなことをしなくても、b:javagetset_getterTemplate 等の変数にテンプレートを書けば何とかなるんですが、いちいち.vimrc にそういうのを書くのはダルかったので……