土曜日, 11月 20, 2010

gofmtをvimで簡単に使うためのスクリプト

Go言語は、推奨コーディングスタイルがあります。
とはいえ、実際に書くときにはあまり細かく気にする必要はなく、gofmtというGo言語をインストールするとついてくるフォーマッタを通してやれば、推奨スタイル通りに整形してくれます。
これを随時実行したいので、vimスクリプトを書いてみました。
都合上、フォーマットをかける前に、ファイルを保存します。

function! Gofmt()
:w
python << EOF
import vim
import subprocess

cb = vim.current.buffer
cursor = vim.current.window.cursor
p=subprocess.Popen(
['gofmt', cb.name],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
close_fds=True)
returncode=p.poll()
if not returncode:
err = p.stderr.read()
if err != None and err == '':
del cb[:]
cb.append(p.stdout.readlines(), 0)
else:
print(err)
vim.current.window.cursor = cursor
EOF
endfunction

4 件のコメント:

thinca さんのコメント...

:%!gofmt

亀鶴 さんのコメント...

最初は「:%!gofmt」でやってたんですが、構文エラーがある時に、カレントバッファがエラーメッセージで置き換えられてしまうのが嫌になってしまったのです。
uすれば戻るんですが、それもめんどくさい。

フィルタしたときにシェルから返ってきた値で分岐させる方法があれば、こんなスクリプトを使うより、よっぽどスマートなんですが。

thinca さんのコメント...

自動でundoするだけで良いのであれば…

:execute '%!gofmt' | if v:shell_error | undo | endif

亀鶴 さんのコメント...

ありがとうございます。これシンプルでいいですね。

後はechoにエラーメッセージを渡せれば、このスクリプトを完全に無用に出来そう。
もう少し研究してみます。