golangci-lintをTUIから操作する


TL;DR


「linterの選択〜コード修正まで」を一貫して行えるTUIツールであるgolintuiを作った話。

はじめに

Go言語の好きなところは?と聞かれたら、いくつか理由がありますが「linterを作りやすいこと」は間違いなく上位に入ります。Go言語が提供する強力かつシンプルなAPIのおかげで数々のlinterが乱立しているわけですが、golangci-lintを使うことでそれらをまとめて実行することが可能です。
そのgolangci-lintを直感的に扱えるTUIツールを作ったので、本記事ではそのツールの紹介をしたいと思います。

モチベーション

以前から以下のニーズが筆者の中にありました:

  • 気軽に色々なlinterを実行したい
  • 解析するパッケージを気軽に選択したい
  • linterから報告されたissueを一覧表示して、必要なとこだけサクッと直したい

気軽に色々なlinterを実行したい
golangci-lintで公式にサポートされているlinterは執筆時点でも50近くあり、それらが何をチェックしてくれるのかを全て把握するためには一定の労力を要します。挙動を見るためにはそれぞれenableしていく必要があるのですが、いちいち設定ファイルやコマンドライン引数を書き換えるのは面倒です。

解析するパッケージを気軽に選択したい
筆者が携わるプロジェクトでは、ビルドシステムにbazelを採用しており、構文解析以上の解析を必要とするlinterを全体に対して実行することが出来ないという悩みがありました。そこで、高度な解析を実行することが出来るパッケージだけをピックアップして実行するということを簡単に行えるUIが必要になりました。

linterから報告されたissueを一覧表示して、必要なとこだけサクッと直したい
定期的にコード全体の問題を直していきたいので、ローカルでターミナル上で実行していたのですが、これが面倒。肉眼で問題のある行を確認して手動でファイルを開いていく作業は耐え難いものでした。

これらの要望を叶えるために、「linterの実行〜該当ファイルを行指定して開く」を一貫して行えるTUIツールを作りました。

クイックスタート

とりあえず触ってみたいという方は以下の手順で実行してみて下さい。

  1. お好きな方法でインストール
  2. $ export LC_CTYPE=en_US.UTF-8
  3. $ cd {YOUR_GO_PROJECT}
  4. $ golintui
  5. rを押下してlinter実行
  6. 直したいissueを選択して、oを押してファイルを開く

各パネルの使い方

Linters

赤枠で囲った一番左のパネルではSpaceを押すことでlinterのenable/disbleを切り替えることが出来ます。デフォルトではカレントディレクトリで有効になっているlinterが選択されています。

注意:もし設定ファイルにてdisable-all: trueを指定している場合は、設定ファイルでenableに指定しているlinterをUI上でdisableすることは出来ません。これは、disable-allオプションとdisableオプションを併用できないようにgolangci-lint側で制御されているためです。

Source Files

赤枠で囲った真ん中のパネルでは、解析する対象となるディレクトリを選択できます。選択されたディレクトリは再帰的に解析されます。何も指定しない場合はカレントディレクトリが再帰的に解析されます。つまり./...が渡されるということです。

ここまできたら準備OKです。rを押してlinterを実行してみましょう。

Results

一番右のパネルには実行結果がlinter毎にまとめて表示されます。メッセージの上でoを押すとgolintuiは一時中断し、エディタでファイルを開きます。そしてエディタによっては該当の行にカーソルが移動します。
デフォルトでは環境変数$EDITORに設定されているエディタコマンドを使ってファイルを開きますが、$GOLINTUI_OPEN_COMMANDにコマンド設定することで変更することも出来ます。例えばVSCodeユーザーの場合は:

export GOLINTUI_OPEN_COMMAND="code -r"

また前述したように、サポートされてるエディタの場合は該当行を指定してファイルを開きます。現在サポートされているのは以下のエディタです。もしお使いのエディタが無い場合はissueやPRを投げてもらえると都度対応します。

  • vim(vi)
  • emacs
  • VSCode

リポジトリ

命名: go + lint + TUI = golintui
Github: https://github.com/nakabonne/golintui

ロードマップ

とりあえず最低限の機能を作って公開したので、もし需要がありそうだったら色々な機能強化を考えています。なのでもし使いたいと思った場合は、今記事にLGTMして頂くなりリポジトリにStarをつけて頂くなりのリアクションをして頂けると嬉しいです。

  • windowsサポート
  • 色々なエディタサポート
  • 小さな画面でもlinterからのメッセージが読めるように、カーソル下の文字を別パネルに表示
  • 各パネルで検索機能
  • lintersの詳細をmodalで表示
  • issueの対象行を別パネルに表示
  • issueを色々な条件でまとめる