-local付きでgoimportsする
goのformatとimportパッケージをよしなにしてくれる goimports
コマンドですが、localで独自に定義したpackageをimportするときにこんな風に並んでほしいことが多いです。
import( // 標準pkg // github.comとか有名所pkg // localの独自pkg )
goimportsは何も指定しないと https://github.com/golang/tools/blob/165bdd618e6d174c61ee7bd73a28f3e5c6fdced1/imports/fix.go#L44-L67 で示された順序で import の内部をsortします。
ここでは https://github.com/golang/tools/blob/165bdd618e6d174c61ee7bd73a28f3e5c6fdced1/imports/fix.go#L48 にあるようにlocalで定義されているpackageのPrefixを指定してあげます。
以下のようにして goimports を叩きます。
goimports -w -local "localのpackage名" foo.go
※ -w
オプションはgoimportsをかけた出力結果でgoのファイルを上書きするオプションです。
注) importをsortするときは一度importの中から改行を消します。
どういうことかというと以下のような感じです。
import( "fmt" "bar" "github.com/foo" )
みたいに整列されているのを
import( "fmt" "bar" "github.com/foo" )
こうして改行を削除して goimports をかけると
import( "fmt" "github.com/foo" "bar" )
こんな普通に意図した結果で sortされるはずです。
※ bar
はlocalのカスタムpkg
なぜ改行を一度外すかと言うと、goimportsは改行があるとすでにgrouping済みと認識してしまい、意図したsortをしない可能性があるからです。
intellij(jetbrains系IDE)での設定
intellijでは以下のように設定するとうまくいきます。
Preference > Tools > ExternalTools > (+) でカスタムコマンド作成
以下のように設定します。この設定した External ToolsにKeymapでショートカットとか割り当てておけば、コード書き終わったあとにgoimportsをかけてソートします。
Working Directory はこのコマンドが動作するディレクトリの範囲を決めることができます。
引数定義の中身は以下
追記
Intellijでは Plugin から FIle Watchers をDLします。これでFileのSaveをHookして任意のスクリプトなり、actionを指定することができます。
上記の設定と同様の設定をFile Watchersに設定したので Cmd + S でFileを保存したときによしなに imports を聞かせることができるようになりました。