Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Erlang 開発専用 Vim 設定

$
0
0

もし、「無人島に行って 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')

で様子見てる。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>