vimでD言語開発環境を整える

ずっとpythonばかりなので久しぶりにD言語を使おうと思い、現在のD開発環境を調べてみました。vimmer なので当然vimでの使用が前提です。

使用するソフト

DCD
https://github.com/Hackerpilot/DCD
補完用ソフトです。ちゃんと構文解析してくれますし、十分実用的な速度です。

Dscanner
https://github.com/Hackerpilot/dscanner
タグファイル生成用ソフトです。DCDだけでも定義元へのジャンプは出来るようですが、タグ使った方が早いです。

使用するvimプラグイン

vim-dutyl
https://github.com/idanarye/vim-dutyl
https://github.com/kyouryuukunn/vim-dutyl
上記のソフトをvimから使えるようにするvimプラグインです。
(追記: Windowsでプロンプトが開くのがうっとうしかったので、vimprocを使用して完全にバックグラウンドで動作するように作り替えました。)

watchdogs.vim
https://github.com/osyo-manga/vim-watchdogs
非同期でシンタックスチェックをしてくれるvimプラグインです。詳細はこちらで説明されているのでここでは触れません。

導入方法

まずはおなじみのNeoBundleでそれぞれダウンロードしてきます。割りと頻繁に更新されているようなので更新時に自動でビルドするようにしておきましょう。OSはwindowsで、dmdにパスを通してあることが前提です。各自書き換えてください。

NeoBundleLazy 'Hackerpilot/DCD',  {'autoload': {'filetypes': ['d']},
    \ 'build' : {
    \ 'windows' : 'git submodule update --init && build.bat',
  \ },
\ }
NeoBundleLazy 'Hackerpilot/Dscanner',  {'autoload': {'filetypes': ['d']},
    \ 'build' : {
    \ 'windows' : 'build.bat',
  \ },
\ }
NeoBundleLazy 'idanarye/vim-dutyl',  {'autoload': {'filetypes': ['d']}}
NeoBundleLazy 'kyouryuukunn/vim-dutyl', {'autoload': {'filetypes': ['d']}} 

設定例

"  dutyl {{{
" ライブラリへのパスを設定
let g:dutyl_stdImportPaths=['E:/D/dmd2/src/phobos','E:/D/dmd2/src/druntime/import']
" 各種実行ファイルへのパスを登録、パスが通っているなら必要ないです。
call dutyl#register#tool('dcd-client', $DOTVIM.'/bundle/DCD/dcd-client.exe')
call dutyl#register#tool('dcd-server', $DOTVIM.'/bundle/DCD/dcd-server.exe')
call dutyl#register#tool('dscanner',   $DOTVIM.'/bundle/Dscanner/dscanner.exe')
"  }}}

" neocompleteと併用する場合の設定
if !exists("g:neocomplete#force_omni_input_patterns")
    let g:neocomplete#force_omni_input_patterns = {}
endif
autocmd FileType d setlocal omnifunc=dutyl#dComplete
let g:neocomplete#force_omni_input_patterns.d = '[^.[:digit:] *\t]\%(\.\|->\)\|::'

" <F1>でドキュメントを開く
autocmd FileType d nnoremap <buffer> <F1> :DUddoc<CR>
" \dで定義元にジャンプ
autocmd FileType d nnoremap <buffer> \d :DUjump<CR>
" server起動が面倒なので自動起動、終了するようにする
autocmd BufAdd *.d DUDCDstartServer
autocmd BufDelete *.d DUDCDstopServer

これで準備は完了です。補完のためにはDCDを起動する必要があります。Dのソースを開いたらDUDCDstartServerコマンドでDCDを起動してください。終了はDUDCDstopServerです。DCDが起動した状態でオムニ補完をすれば構文解析して補完してくれます。

主なコマンド

DUDCDstartServer

DCDを開始します。

DUDCDstopServer

DCDを停止します。

DUjump

定義元を開きます。

DUvjump

ウィンドウを分割して定義元を開きます。

DUupdateCtags

タグファイルを作成します

DUddoc

マウス下の単語でドキュメントを開きます。

これでvimを使って快適にD言語を使用できるでしょう。

(追記: kyouryuukunn/vim-dutyを使用する場合以下は必要ありません。)

…と言いたいところなのですが、これでDUDCDstartServerをするとコマンドが存在しませんとか言われてしまいます。調べてみたところwindows上でのDCD起動には!startコマンドを使用しているようなのですが、!startでファイルを実行するには普通

    :!start dcd-server -I hogehoge

の様にします。しかしvim-dutylの場合

    :!start 'dcd-server' '-I hogehoge'

となっています。このためそのままだとエラーがでてDCDが動作しません。
これを修正するためにvim-dutyl/autoload/dutyl/core.vimを編集します。

    function! dutyl#core#runToolInBackground(tool,args) abort
        if has('win32')
            " before
            " silent execute '!start '.s:createRunToolCommandIgnoreVimproc(a:tool,a:args)
            " after
            silent execute '!start '.substitute(s:createRunToolCommandIgnoreVimproc(a:tool,a:args), "'", "", "g")
        else
            silent execute '!'.s:createRunToolCommand(a:tool,a:args).' > /dev/null &'
        endif
    endfunction

滅茶適当な修正ですがとりあえずこれで動きます。一度でも起動テストしてれば気付くと思うのですがやっぱりDユーザーは少ないのでしょうね。


コメントを残す

メールアドレスが公開されることはありません。