個人的なGo+vimでのデバック
vim-delveプラグイン以前
Goのプログラムをデバックしたい時はdelveを使うのが定番ではないかと思います。
これまではターミナルでdlv debugとかでデバッカを起動してからブレークポイントを指定して・・・ みたいな感じでデバックしていたのですが、正直面倒くさくて結局fmt.Printfとかでデバックプリントを追加する、というなんだか泥臭い方法でデバックしていました。
普段はvimを使っておりvim-goというプラグインも入れているので、vim-goにデバックの機能があることも知っているのですが、起動するとたくさん画面分割されてしまうリッチなものでなんとなく肌に合わない、と感じていました(結局は慣れの問題だと思うのですが・・・)。
下はvim-goのデバッカを使った時の画面です。
個人的にはブレークポイントの設定だけ支援してくれる、もうちょっとシンプルなものはないか?
と思いdelveの公式ページを見てみるとvim-delveというのがある!
ということでvim-delveを使ってみました。
https://github.com/sebdah/vim-delve
環境
以下のような環境で試しました。
* mac os(10.14.5 mojave)
* neovim 4.3
* tmux
インストール
vim-plugを使っているので以下のような設定を追記して:PlugInstallとしました。
また、neovimなので、設定ファイルは以下の場所になります。
~/.config/nvim/init.vim
" go debug
Plug 'sebdah/vim-delve', { 'for': ['go'] }
まずはデバックしたいプログラムを用意する
今回はリクエストを投げると単純なJSONを返却するだけ、というシンプルなサーバーサイドのプログラムをデバック対象としました。
main.go
package main
import (
"encoding/json"
"net/http"
)
type ResMessage struct {
Message string
Code int
}
func handler(w http.ResponseWriter, r *http.Request) {
resMessage := ResMessage{"Hello", 30}
res, _ := json.Marshal(resMessage)
w.Header().Set("Content-Type", "application/json")
w.Write(res)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8000", nil)
}
ブレークポイントを置く
ブレークポイントを置きたい場所まで移動し、
:DlvAddBreakpoint
と打つだけで行の左に●が付きます。これがブレークポイントになります。
デバッカの起動
これも下記のコマンドを打つだけです。起動すると画面が分割されます。
:DlvDebug
ただ、これだけでは今回作成したサーバプログラムが起動するだけなので、他のターミナルからcurl localhost:8000でリクエストを投げるとブレークポイントで停止すると思います。
ブレークポイントを置いてからデバッカを起動してデバックするまでの一連の流れをGIFアニメにしてみました。
個人的な追加設定
さすがに毎回、ブレークポイントを追加する度に:DlvAddBreakpointoと打つのはしんどいので、vimの設定ファイルに以下のように設定してます。
ノーマルモードで;dと打つとその行にブレークポイントが設定・解除されるようになっています。
autocmd FileType go nmap <silent> ;d :DlvToggleBreakpoint<CR>
あと、vimux.vimというtmuxの他のペインにコマンドを送信できるプラグインがあるのですが、以下のような設定をするだけで連携してくれます。
連携してからデバッカを立ち上げるとtmuxの別のペインでデバッカが起動するようになります。
let g:delve_use_vimux = 1
上記の2つ設定を入れるとこのようなります。
あとがき
GoLandのようなIDEでは当たり前の機能ではありますが、これでGoでのデバックがだいぶ楽になりました!