Vimでプログラムを書く時の環境設定について。
IDEっぽくと書いてますが、基本 GNU screen を開いた上でウィンドウを分割して作業を行うので、 別のファイルを開きたいとかgrepしたいとか言った場合には Vimを開いているウィンドウとは別のウィンドウで普通にコマンドラインから行います。
なので主に重要なのはシンタックスチェックとtagsファイルの取り扱いです。 ファイルリストとかタグリストとかの表示は基本的にはOFFにしておいて、 たまに気が向いたら使う感じ。 (なんとなくやってみたかった感が強い。。。)
- Syntax check
- vim-rooter
- タグジャンプ
- タグのリスト表示
- 関数等の定義場所のソース表示
- ファイルエクスプローラー
- Tagbar, SrcExpl, NERDTreeを全て表示する
- Unite
- その他
Syntax check
SyntasticはVimでコードの文法チェックを行えるようにするプラグイン。 設定はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
:SyntasticCheck
で文法チェック。- チェックを行った後に
:Errors
とするとquick fixでエラー一覧表示が出来る。 - g:syntastic_check_on_open = 0/g:syntastic_check_on_wq = 0:ファイルを開いた時にはチェックしない。終了時にもチェックしない。
(
:w
とかで保存するだけならチェックされる。) - c/c++はデフォルトでは
gcc
でチェックする。 - g:syntastic_c_check_header/g:syntastic_cpp_check_header =1でc/c++でheaderファイルもチェックする。
- c/c++ではconfigファイルがデフォルトで読み込まれる。
(.syntastic_c_config/.syntastic_cpp_config)
- これらは現ディレクトリに無いと 上のディレクトリを探しに行って最初にあった所でそれを読み込む。
- なのでプロジェクトの一番上においておくだけでOK。
-
中身には
-I/path/to/include
みたいなチェッカーに渡すための headerファイルの場所などを示すオプションなどを 1行に一オプションずつ書いておく。
- configファイルの中で
$HOME
みたいな環境変数が使えない。 - ただし、configファイルの中に相対パスを書けば
configファイルがある位置からのパス、になるので、
インクルードディレクトリの指定など書きたいときは
プロジェクトのトップにconfigファイルがあるならならそこから
-I./.../include/
と書いておけば良い。
- Javaの方はデフォルトでは
javac
がチェッカーとして使われる。 - Javaの方はconfigファイルを使いたいときは明示的に
enabledにしないといけない。
- Java: javac · scrooloose/syntastic Wiki
- Javaの方はカレントディレクトリにあるファイルか、 明示的に指定したものしか使えない。(C++の様に親ディレクトリに置いておいても読んでくれない。)
- 面倒なので、HOMEに色々含めた全部入れを作っておいて、それを読み込む。
- Javaのconfigファイルでは、上のWikiにあるvim内の変数を与える外部vim設定ファイルみたいなもの。
- クラスパス(g:syntastic_java_javac_classpath)は
javac
の-classpath
オプションに渡される値。- 相対パスだとカレントディレクトリからになるので絶対パスで書いておく必要がある。
- 環境変数は普通に使える
let g:syntastic_java_javac_classpath = '$PROJECT/src:$PROJECT2/jars/*.jar
--sourcepath
オプションは使われないので- *jarファイル
- classesファイルがあるディレクトリ
- ソース(src)ディレクトリ
をどれでも設定できる(複数の場合はLinux/Macなどでは
:
で区切る。 Windows(CygwinとかでなくWndowsのVim)では;
で区切る)。
:SyntasticJavacEditClasspath
コマンドを使うと、 クラスパスを分けて1行ずつにして追加したり編集したりできるので ちょっと便利。(勝手にlet g:syntastic_java_javac_classpath = … の形にしてconfigファイルへ書き出してくれる。):SyntasticJavacEditConfig
コマンドの方は単に configファイルを開いて編集するだけ。 ただし、これらのコマンドは一度:SyntasticCheck
を呼んだりしてチェックを動かさないと使えない模様。
vim-rooter
プロジェクトのrootディレクトリを見つけて移動するコマンドを実装するプラグイン。 設定はこんな感じ。
1 2 3 4 5 6 7 8 9 |
|
- デフォルトで
<Leader>cd
でrootディレクトリに移動できる。 - :Rooterでも行ける。
- g:rooter_use_lcd = 1で、通常
<Leader>cd
では:cd
コマンドを使って移動するところを:lcd
コマンド(:local cd
、現ウィンドウのディレクトリのみ変更)に変更。 - rootディレクトリは、g:rooter_patternsで定められた
ファイルやディレクトリがある一番近い親ディレクトリになる。
複数patternが指定されてる時は、左から優先される。
- e.g. もし一つ上に.git/があっても、 その上のディレクトリにtagsがあればtagsがある ディレクトリがrootディレクトリになるになる。
- ディレクトリには
/
を最後に付けないといけない。 - git submoduleなんかでsubmoduleとして登録してある レポジトリのなかでは、そのサブモジュールレポジトリを rootにしたい場合は.gitを.git/よりも左に書く必要がある。
- .svn/に関しては.git/等と違ってサブディレクトリにも出来るので tagsやMakefileなんかを先にしておかないとあまり意味が無い。
- 最後にコメントアウトしてある部分のようにBufEnterでのautocomdで、 指定の拡張子のファイルを開いた時には自動的に移動、 みたいなこともできるが、取り敢えず今のところ使わない。
タグジャンプ
プラグインではなく最初からVimに付いてるタグジャンプ機能について。
タグファイルの用意
ctags
コマンドを使ってコードがあるディレクトリで
$ ctags --sort=foldcase -R .
とすれば関数やクラスの定義がリストされたtagsと言うファイルが出来ます 1
ただし、ちなみにGNUバージョンとBSDバージョンには違いが合って、
Macに入ってるBSDバージョンだと-R
が使えません。
色々使えないので、MacではHomebrewなんかで
$ brew install ctags
とするとGNUバージョンが入れられるので入れておきます。
このファイルを読み込んでおくことで、Vimの中で関数の定義が 他のファイルにある場合なんかでも簡単にその箇所にジャンプ出来ます。
Vimではtagsファイルはデフォルトでは
tags=./tags,tags
と定義されていて、最初の./tagsは開いているファイルと 同じディレクトリにあるtags、 2番めのはvim内でのカレントディレクトリにあるtags 2になっています。
さらにpath_extraオプションつきでコンパイルしていると 3、 tags;のような;付きが使えて、 これを使用すると、指定のディレクトリからさかのぼってすべてを検索します。 相対パスならカレントディレクトリから。
tags=/usr/local/share/tags;
とかなら、
- /usr/local/share/tags
- /usr/local/tags
- /usr/tags
- /tags
を検索。 /usr/local/share 内でファイルを開くなりしてカレントディレクトリがそこの場合に、
tags=tags;
としても同じ事。
pathの値等も同じように設定できて、こちらはディレクトリ指定なので ;を使うとそれ以上のディレクトリを順次探すことに。 この場合には
path=/usr/local/share;/usr
の様に後ろに途中のディレクトリ名を挟むと、そこまで (/usr/まで、/は探さない)を探して止まる様になります。 この途中まで、の機能はどうもtagsの方では使えない感じでした。
tags=./tags;../
みたいにしてもずっと上の方まで探すし、 絶対パスを指定しても上までずっと探してました。
path_extraが入ってれば上のディレクトリを再帰的に探してくれると便利なので (プロジェクトのルートディレクトリにtagsファイルを置いておけばどこでも参照できる)、
1 2 3 |
|
こんな感じでtags;
を追加しておきます。
ジャンプの仕方
- tagsが有効な関数名などの上でCtrl-] を押せば定義されてる所一覧が出てくるのでそこに飛べる。
- Ctrl-tで戻る。
とりあえずこれだけ覚えておけばOK。
タグのリスト表示
画面の横にウィンドウを作ってそこに現在開いているファイル内にある タグ一覧を表示してくれるプラグイン。 (つまり変数/関数/クラス一覧的な物を表示してくれる。) 選択して移動することも出来る。
設定:
1 2 3 4 5 6 7 8 |
|
:TagbarToggle
でタグリストを新しいウィンドウで表示/非表示。:TagbarOpen
/:TagbarClose
と言った表示/非表示専用コマンドもあるが、 トグルだけで十分なのでNeoBundleLazyを使って:TagbarToggle
が使われた時にロードする様に(Open/Closeコマンドもいれておいても特に問題はありませんが)。- デフォルトのwidth=40は大きいので小さく。
- Tagbarのウィンドウで
x
を押すと幅を拡大出来る。
- Tagbarのウィンドウで
- ショートカットキーとして
<Leader>t
を:TagbarToggle
に割り当て。
同じ様な物に、 taglist 4 というものも有りますが、 アップデートがよりアクティブなのと、 taglistで起きる色々な不具合がtagabarでは起きない、などがあるみたいなので tagbarのが良さ気。
taglist vs tagbar? Question directed to people that were using both of those…
関数等の定義場所のソース表示
tagsファイルを利用してカーソル下の関数などを定義されているところを 画面下に表示してくれる 5。
設定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
:ScrExplToggle
で表示/非表示をトグル。:ScrExpl
/:ScrExplClose
で表示/非表示もできるがトグルだけで十分なので NeoBundleLazyでも:SrcExplToggle
だけを指定。
RefreshTime
:カーソルを移動した際の更新時間を1秒に(デフォルト値は100ms)。isUpdateTags
:自動的にタグをアップデートしない。updateTagsCmd
:タグのアップデートコマンド。-
デフォルトでは
let g:SrcExpl_updateTagsCmd = "ctags --sort=foldcase -R ."
となっています。
- このコマンドはtagsファイルがあるディレクトリで実行されるので、 デフォルトだとtagsファイルのあるディレクトリ以下全てのファイルをチェックし直します。
- これだと大きいプロジェクトとかだと大変なので、
%
(今開いてるファイル)だけを見てアップデートする様に。 - 全てをアップデートしたい時もあるので、関数を作って一時的に コマンドを入れ替えて実行出来る様にも。
- 出力先のtagsファイルはその時使っているtagsファイルになります。
-
winHeight
:デフォルトだと8行の表示で少し小さすぎるので14行表示に。- トグル用のショートカットは
<Leader>E<CR>
に。 <Leader>Eu
で現ファイルのタグをアップデート。<Leader>Ea
で全てのファイルのタグをアップデート。<Leader>En/p
はその関数が複数の場所で定義されてる時などに 次の候補や前の候補への移動。
ファイルエクスプローラー
ファイルエクスプローラーを表示できる様になる。
設定:
1 2 3 4 5 |
|
:NERDTreeToggle
で表示/非表示。- こちらも
:NERDTree
/:NERDTreeClose
という表示/非表示コマンドもあり。
- こちらも
- ショートカットは
<Leader>N
に。
Tagbar, SrcExpl, NERDTreeを全て表示する
上のTagbar, SrcExpl, NERDTreeを全てトグルする ショートカットも作っておきます。
1 2 3 4 5 |
|
<Leader>A
で全てをトグル。
それぞれの位置はデフォルトのママ
- Tagbar: 右
- SrcExpl: 下
- NERDTree: 左
に表示されて、SrcExplと他の2つは開く順番によってかぶる領域が変わるので注意。
SrcExplを先に開くとその後Tagbar等はその右全体に開かれます。 逆にTagbarを開いた後にSrcExplを開くとTagbarの下にもSrcExplが侵食します。
メインのウィンドウとSrcExplの幅を同じにしたいので最初にSrcExplを開いています。
こんな感じ (ちょっと見やすいように小さいウィンドウで取ったのでメインの画面(真ん中上)が 小さいですが)。
Unite
ファイルとかその他いろいろ検索。
色々設定してありますが、いまいち使いこなせてないので とりあえず設定だけ。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
|
その他
以下は昔使ってた/今は使わないけど一応見てみたもの。
ctags関連
SrcExplでtagsのアップデートが出来るのですが、 ファイル保存時等に自動的にtagsをアップデートしたり出来る プラグインについて。
- viim-scripts/ctags.vim
- NeoBundle “ctags.vim”: 開いてるファイルのtagを作る。
- szw/vim-tags
- タグをvimから作ったり。
- soramugi
- vim-tagをもっと良くした感じ?
- ctagsと連携するように環境を構築する
- xolox/vim-easytags
- デフォルトで~/.vimtagsにタグを作る。
- ハイライト機能とか使ってみたいと思ったが上手くいかず。。。
- vim-scripts/AutoTag
- 古い。
ファイル検索
- kien/ctrlp.vim
- Ctrl-pでファイルの検索的な事が出来る。
ファイルツリー表示等
- shemerey/vim-project
- 古い?使い方よく分からない。。。
\c
(プロジェクトファイルの生成)しても上手く自動生成されない。- 単に左側にファイル一覧のツリーを表示してすぐに そこに移動できるようにするだけ?
- amiorin/vim-project
- こちらは派生版?
C/C++用
- vim-scripts/c.vim
- 色々出来そうだけど試してない。そのうち試したい。
その他参考
Recommended Vim plugins for C coding? - Stack Overflow: http://stackoverflow.com/questions/149558/recommended-vim-plugins-for-c-coding
-
--sort=foldcase
でソートの仕方を指定。ソートする(yes
)、しない(no
)、 または大文字小文字区別せずソートする(foldcase
)。-R
はディレクトリを再帰的に検索。- 最後にパスやファイル指定。 ↩
通常移動してなければ前者と同じ。 上で出したvim-rooterでルートディレクトリに常に移動するようにしておけば ルートディレクトリに置いておけばこの設定だけでも常に参照出来る様になります。 ↩
-
通常は入ってるはず。
:echo has('path_extra')
でチェック(1なら入ってる、0なら入ってない)。 ↩ -
一応taglist様の設定としては、
NeoBundle "taglist.vim" if ! empty(neobundle#get("taglist.vim")) set tags=tags "let Tlist_Ctags_Cmd = "/usr/bin/ctags" let Tlist_Show_One_File = 1 let Tlist_Use_Right_Window = 1 let Tlist_Exit_OnlyWindow = 1 nn <silent> <leader>t :TlistToggle<CR> endif
こんな感じ。 ↩
-
もともと、 Source-Explorer-srcexpl.vim という名前だったもの。
さらに vim-scripts/SrcExpl にもありますが、こちらはアップデートされてなく、 上のwesleyche自身のレポジトリに移行した模様。 ↩