もし、「無人島に行って Erlang を書け。最小限の .vimrc だけは持って行って良い」と言われた場合に備えて設定を考えました。
非同期
無人島では時間を有効に使わないと死が待っています。tag ファイル作成や cache 作成を同期でやっていては死にます。
vimproc
https://github.com/Shougo/vimproc.vim
NeoBundle を使用していれば、特に設定は必要ありません。
補完
すべてのプログラムを手動でタイプしていては時間切れで死にます。
neocomplete
https://github.com/Shougo/neocomplete.vim
vim-erlang-omnicomplete
https://github.com/vim-erlang/vim-erlang-omnicomplete
特に設定は必要ありません。
" Launches neocomplete automatically on vim startup.
let g:neocomplete#enable_at_startup = 1
" Use smartcase.
let g:neocomplete#enable_smart_case = 1
" Use camel case completion.
let g:neocomplete#enable_camel_case = 1
" buffer file name pattern that locks neocomplete. e.g. ku.vim or fuzzyfinder
let g:neocomplete#lock_buffer_name_pattern = '\*ku\*'
" This variable controls the number of candidates displayed in a pop-up menu
let g:neocomplete#max_list = 20
" Define file-type dependent dictionaries.
let g:neocomplete#sources#dictionary#dictionaries = {
\ 'default' : '',
\ }
" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'
" Plugin key-mappings.
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
if !exists('g:neocomplete#force_omni_input_patterns')
let g:neocomplete#force_omni_input_patterns = {}
endif
オムニ補完の keymap <C-x><C-o> をタイプするのが面倒な場合は別のキーマップを定義するのが良いでしょう
" Ctrl + f でオムニ補完発動
imap <C-f> <C-x><C-o>
tags
関数が定義されているファイルをもし忘れてしまった場合、無人島には ag や grep は無いので死にます。
auto-ctags
https://github.com/soramugi/auto-ctags.vim
ファイル保存時に自動で tags ファイルを更新してくれます。
vim-rooter
https://github.com/airblade/vim-rooter
buffer を切り替えたときにプロジェクトの root ディレクトリを探して、vim の current ディレクトリを自動で変更してくれます。
set tags+=.git/tags,tags
let g:auto_ctags = 1
let g:auto_ctags_directory_list = ['.git']
let g:rooter_use_lcd = 1
autocmd BufEnter * :Rooter
上記の設定でプロジェクトの .git/ に tags ファイルができていれば成功です。<C-]> でプロジェクト内で定義された関数であればジャンプができるようになります。
追記しましたなお、vim-erlang-tags というのもあるのですが、私の OSX + Erlang/OTP 18.0 環境では正常に動作しませんでした。
flymake
無人島では心が折れやすくなっているため、がんばって書いたのに make でこけると心が死にます。事前にある程度チェックしましょう。
vim-erlang-compiler
https://github.com/vim-erlang/vim-erlang-compiler
escript で書かれた compiler plugin
vim-watchdogs
https://github.com/osyo-manga/vim-watchdogs
非同期 syntax check を行えます。
quickrun と shabadou に依存しているためこの2つは必須。
その他に vim-hier と quickfixstatus も入れておくとエラー箇所が見やすくなり、より便利になります。
let g:quickrun_config = {
\ "watchdogs_checker/_" : {
\ "hook/close_quickfix/enable_exit" : 1,
\ "runner" : "vimproc",
\ "runner/vimproc/updatetime" : 10,
\ "outputter/quickfix/open_cmd" : "",
\ "hook/qfstatusline_update/enable_exit" : 1,
\ "hook/qfstatusline_update/priority_exit" : 4,
\ },
\ "erlang/watchdogs_checker" : {
\ "type" : "watchdogs_checker/flymake",
\ },
\ "watchdogs_checker/flymake" : {
\ "command" : expand('~/.vim/bundle/vim-erlang-compiler/compiler/erlang_check.erl'),
\ "exec" : "%c %o %s:p ",
\ },
\ }
call watchdogs#setup(g:quickrun_config)
let g:watchdogs_check_BufWritePost_enable = 1
シンタックス
無人島では適切にインデントしてくれないなどのストレスで死にます。
vim-erlang-runtime
https://github.com/vim-erlang/vim-erlang-runtime
特に設定は必要ありません
まとめ
私はそんなに Erlang 書かないです。
filetype plugin indent off
if has('vim_starting')
set nocompatible
set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle/'))
" plugin list
NeoBundle 'Shougo/neocomplete'
NeoBundle 'Shougo/vimproc', {
\ 'build' : {
\ 'mac' : 'make -f make_mac.mak',
\ },
\ }
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'osyo-manga/shabadou.vim'
NeoBundle 'osyo-manga/vim-watchdogs'
NeoBundle 'cohama/vim-hier'
NeoBundle "dannyob/quickfixstatus"
NeoBundle 'soramugi/auto-ctags.vim'
NeoBundle 'airblade/vim-rooter'
NeoBundle 'vim-erlang/vim-erlang-runtime'
NeoBundle 'vim-erlang/vim-erlang-compiler'
NeoBundle 'vim-erlang/vim-erlang-omnicomplete'
call neobundle#end()
filetype plugin indent on
" Launches neocomplete automatically on vim startup.
let g:neocomplete#enable_at_startup = 1
" Use smartcase.
let g:neocomplete#enable_smart_case = 1
" Use camel case completion.
let g:neocomplete#enable_camel_case = 1
" buffer file name pattern that locks neocomplete. e.g. ku.vim or fuzzyfinder
let g:neocomplete#lock_buffer_name_pattern = '\*ku\*'
" This variable controls the number of candidates displayed in a pop-up menu
let g:neocomplete#max_list = 20
" Define file-type dependent dictionaries.
let g:neocomplete#sources#dictionary#dictionaries = {
\ 'default' : '',
\ }
" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'
" Plugin key-mappings.
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
if !exists('g:neocomplete#force_omni_input_patterns')
let g:neocomplete#force_omni_input_patterns = {}
endif
set tags+=.git/tags,tags
let g:auto_ctags = 1
let g:auto_ctags_directory_list = ['.git']
let g:rooter_use_lcd = 1
autocmd BufEnter * :Rooter
let g:quickrun_config = {
\ "watchdogs_checker/_" : {
\ "hook/close_quickfix/enable_exit" : 1,
\ "runner" : "vimproc",
\ "runner/vimproc/updatetime" : 10,
\ "outputter/quickfix/open_cmd" : "",
\ "hook/qfstatusline_update/enable_exit" : 1,
\ "hook/qfstatusline_update/priority_exit" : 4,
\ },
\ "erlang/watchdogs_checker" : {
\ "type" : "watchdogs_checker/flymake",
\ },
\ "watchdogs_checker/flymake" : {
\ "command" : expand('~/.vim/bundle/vim-erlang-compiler/compiler/erlang_check.erl'),
\ "exec" : "%c %o %s:p ",
\ },
\ }
call watchdogs#setup(g:quickrun_config)
let g:watchdogs_check_BufWritePost_enable = 1
追記
https://github.com/vim-erlang/vim-erlang-tagsを使って tags を作成できました。
NeoBundle 'vim-erlang/vim-erlang-tags'
を追加して
NeoBundle 'soramugi/auto-ctags.vim'
let g:auto_ctags = 1
let g:auto_ctags_directory_list = ['.git']
を削除します。
プロジェクトのルートディレクトリで
$ ~/.vim/bundle/vim-erlang-tags/bin/vim-erlang-tags.erl
を実行すれば tags が作成されます。--otp オプションがあって otp まで tags に含めることもできます。
自動で作成したい場合は vim-erlang-tagsの README に Git checkout hook の方法が乗っているので参考までに。
私は
autocmd BufWritePost *.erl call vimproc#system_bg(
\ '~/.vim/bundle/vim-erlang-tags/bin/vim-erlang-tags.erl --otp')
で様子見てる。