弱Vim使いが中途半端な予備知識でGoを書き始めたら

2015年6月21日日曜日

ぬるま湯Vimおじさん

私は、自分が離れたプログラミング環境を忘れるのがとても早いです。VimでPHPコードをひたすら書いていた時期もあって、その頃はctags連携とかいろいろやっていた気がしますが、今では何一つPHPについて思い出せません。
Vim自体の使い方にしても、タブは使うけどウィンドウ分割は全然使わないという生活をしていた結果、C-w jhklC-w C-wすらすっかり忘れてました。思えばこの数年、vim -pでぶわーーっとタブを開いて、あとはほぼgtしか使わない生活でした。とりわけ、Mac上では割とMacVimも多用しているため、ウィンドウ移動をトラックパッドでまかなえるという事情もありました。
そんな私、実はgolangを勉強しては少々離れている間に忘れる、というループを既に数回繰り返しているので、今度は特に開発環境面のメモを残しながら進めてみようかと思って書いてみました。


golangはVimで書かれることが多いらしい

3月あたりに自分用のツールいくつかを勉強がてらgolangで書こうと思い立ちました。
作業に先立ち、まず周りを眺めてみたところ、自社ではgolangを書くのにVimを使っている人が大半で一部Emacs(小声)という感じでした。
というわけでVimらしいという電波を受けるままに環境を作りました。つまり、Vimエキスパートでもなくgolang習熟者でもない状況からVimベースで足がかりを得ていこうという話です。
vimのGoサポートが手厚くて打ち震えている - Qiitaなども、よく分かってる人なら「全盛りだ、すげぇぇぇ」となるのかもしれませんが、分かってない人間(私)からすると「ほいでどうやって使うのこれ」と感じました。
なので最低限このへんを掴むとよちよち歩きできるのでは、というものをまとめてみました。

前提環境

手元の開発にはOS Xを使います。
前述のvimのGoサポートが手厚くて打ち震えている - Qiitaに準拠して環境を作りました。

開発上で発生する諸々の作業メモ

言語と編集環境、実行/検証のフローというのは密接に結びついているので、全体をバランスよく学んでいかないと段々辛くなります。
最低限、外部ライブラリの取得〜バイナリの生成〜実行までに必要となるのはこのあたりです。
  • 外部のライブラリはgo getで拾ってくる
    • go getではGitHubにあるリポジトリを便利に拾ってこれるらしい、というのは事前に知っていました
  • コードの即時実行はgo runでおこなう
  • ちゃんとビルドするならgo buildでおこなう
  • ビルドした結果を自分用実行ファイル置き場へ放り込むならgo installを使う
    • GOBIN環境変数を設定してないとダメ
    • go getしてきたものもGOBIN以下へinstallされる

パッケージのインポート管理

春のGoConでのセッションを聞いていて、パッケージのインポート文は手動で書くものではないらしい(記載順序などあるので自動補完に委ねる)ことが分かっていました。
なので、最初に必要となったのはインポート管理です。

パッケージをインポートしてくる

socket.ioのライブラリ使いたいなーと思って
:Import github.com/googollee/go-socket.io
と叩くとgo getまでやってくれるんだろうと思いました。が、そんなことはありませんでした。
むーーー? と思った結果、なるほどgo getは自分でやるのか、と気付き
go get github.com/googollee/go-socket.io
という具合で処理しました。

使っていないパッケージの扱い

ソース中で使っていないパッケージは:wで保存するたびに該当するimport文が抹消されるという、よくできた感じでした。
これ、思考に詰まった瞬間に:wを叩く癖がある人は結構ストレスに感じてるのでは(知りませんが)*1
[*1] そういえば、キータイプが一定時間なければ自動保存するようにした結果、この挙動でムキャーっとなっていた人が社内に居ました

コード補完

http://mattn.kaoriya.net/software/vim/20130531000559.htm
適当なところまでキータイプして、あとはC-x C-oでokです。
これはすぐ手に馴染む一方、VSやIntelliJばかり使う生活をしていたらまたすぐに抜けそうです。
賢い補完ではないほうの、C-nは何年経っても覚えているんですが。そういえばEmacsのC-x C-cは忘れないんですけれどね、というかこれぐらいしかEmacsのコマンド覚えてない(あとはC-a/e/f/b/kとか)んでした。

保存時の自動フォーマット

前述のVim用環境構築一式で組み込まれているので特に問題ありませんでした。
フォーマット絡みの戦が起こらない文化圏、素晴らしいですね。

リファクタリング(シンボルのリネーム)

golang のリファクタリングには gofmt ではなく、gorename を使おう。によると、gorenameというパッケージを使うことでほどよくできるようです。
ということでインストールしました。
Vimな人がVim上での利用に言及しているのを見かけないのでvim-go用のバインディングはまだないのかな、と思ったのですが、実際には有りました*2
gorenameでの指定はパッケージ識別子からの修飾でやるのが普通っぽいので真似して同様に。
結果、自分のコードにしてもgo getで拾ってきたローカルコピーに対して変更をしていく形となるので、こちらのコピーを今後の開発用に使っていこうということで手元環境を整理しました。
$GOPATH/src以下で作業やってpushという流れ、でいいのかな。。
https://golang.org/doc/code.htmlをチラ見した感じ、こういう流儀のようです。
[*2] @methaneに教えてもらいました。

最初のgoコードできたよー

そんなこんなで、https://github.com/muojp/review-bloggerにRe:VIEWのファイルをBloggerへ流し込めるようにするやつを投入しました。
ざっくりと、review-compileというコマンドが吐き出してくれるXHTMLをほどよくblog出力用に加工して標準出力へべたーっと書き出すものです。そのうちやりたいことはいろいろありますが、差し当たり今日明日困らないように最低限の機能実装だけおこないました。Re:VIEWで書いた文章をblogへ簡単に流せるようにするといろいろ便利だなーと感じているので、もうしばらく作りこんでいってみます*3
[*3] 実は、Blogger v3 APIを使った下書き投稿までは動いています。このエントリもコマンド一発で下書き化しています。credentialsの保存方法をもう少しいい感じにしたらリポジトリ更新します。

次のステップ

割とゴリ押しで書けることは分かりましたが、このまま変な癖が補正されない状態で進むと危険そうです。
実際に使うものを作ることでモチベーションを維持しつつ、golang文化に馴染むための学習をしていくのがよさそうです。
具体的には、
の2つのページを時折読みつつ、手元で必要なツールをごそごそと作っていこうと思います。
定番のA Tour of Goは今のところ遠巻きに眺める程度にします。
ソースファイルの切り分け方とかstructのほどよい使い方とかがわかってきたら、徐々にgolangっぽいコードになるのかな、と思っています。
あと、Vim向けgolang環境の下回りとして、昨今だと素直にvim-goを使ったほうが良いのかも?というのを感じています(リファクタ機能の組み込みとか強さが...!)。
じきに環境を作り直すかもしれません。

0 件のコメント:

コメントを投稿