スクリーンショット_2019-12-21_17

個人的なGo+vimでのデバック

vim-delveプラグイン以前 


Goのプログラムをデバックしたい時はdelveを使うのが定番ではないかと思います。
これまではターミナルでdlv debugとかでデバッカを起動してからブレークポイントを指定して・・・ みたいな感じでデバックしていたのですが、正直面倒くさくて結局fmt.Printfとかでデバックプリントを追加する、というなんだか泥臭い方法でデバックしていました。

普段はvimを使っておりvim-goというプラグインも入れているので、vim-goにデバックの機能があることも知っているのですが、起動するとたくさん画面分割されてしまうリッチなものでなんとなく肌に合わない、と感じていました(結局は慣れの問題だと思うのですが・・・)。

下はvim-goのデバッカを使った時の画面です。

スクリーンショット 2019-12-21 17.26.02

個人的にはブレークポイントの設定だけ支援してくれる、もうちょっとシンプルなものはないか?

と思い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

と打つだけで行の左に●が付きます。これがブレークポイントになります。

スクリーンショット 2019-12-21 17.30.05

デバッカの起動

これも下記のコマンドを打つだけです。起動すると画面が分割されます。

:DlvDebug

ただ、これだけでは今回作成したサーバプログラムが起動するだけなので、他のターミナルからcurl localhost:8000でリクエストを投げるとブレークポイントで停止すると思います。

ブレークポイントを置いてからデバッカを起動してデバックするまでの一連の流れをGIFアニメにしてみました。

画像2

個人的な追加設定

さすがに毎回、ブレークポイントを追加する度に:DlvAddBreakpointoと打つのはしんどいので、vimの設定ファイルに以下のように設定してます。
ノーマルモードで;dと打つとその行にブレークポイントが設定・解除されるようになっています。

autocmd FileType go nmap <silent> ;d :DlvToggleBreakpoint<CR>

あと、vimux.vimというtmuxの他のペインにコマンドを送信できるプラグインがあるのですが、以下のような設定をするだけで連携してくれます。
連携してからデバッカを立ち上げるとtmuxの別のペインでデバッカが起動するようになります。

let g:delve_use_vimux = 1

上記の2つ設定を入れるとこのようなります。

画像4

あとがき

GoLandのようなIDEでは当たり前の機能ではありますが、これでGoでのデバックがだいぶ楽になりました!

この記事が気に入ったらサポートをしてみませんか?