ずっと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ユーザーは少ないのでしょうね。