inthisfucking.world

💩🌎

Vala-LintをVimで扱う

Valaには、Vala-Lintというlinterが存在します。これをALE経由でVimから使う方法を紹介します。

Vala

Valaとは、GTKのアプリケーションを書く際に便利なhigh levelに抽象化されたプログラミング言語です。GTKのアプリケーションを書く際は、GTKがcで書かれているためにcで書くことが多いと思いますが、もうちょっとモダンに書きたい際にはとても良い、Javaみたいな文法の言語です。

現在、rclpのクライアントをLinux向けに開発しています。私は普段Elementary OSを使っているので、Elementary OSで上手く動作するように作っています。Elementary OSは、基本的にはUbuntuですが、デスクトップ環境は自分で開発しています。そのデスクトップ環境では、GTKのアプリケーションをValaで書くことが推奨されています。

Elementary OSにおけるアプリケーションの開発や、Valaに関して興味がある人は、是非このドキュメンテーションを見てみてください。サンプルのアプリケーションを作成し、実際にAppCenter (Elementary OSのApp Storeみたいなもの) でアプリケーションを配布するまでの過程を順を追って説明してくれており、Elementary OS向けのアプリケーションを開発するとはどういうことなのかが良く分かります。

Vimでlinterを走らせる

私はVimを使っているので、Valaでコードを書く際もVimで書いています。普段はALEでlinterを走らせているのですが、残念ながらValaに対するlinterがサポートされていませんでした。そこで、折角なので自分でALEで動くValaのlinterをサポートすることにしました。

Valaには、Elementary OSのチームが主に開発しているVala-Lintというlinterがあるので、それをALEで使えるようにします。

まず使ってみる

現時点では、ALEをforkした私のレポジトリで開発を行っています。Vundleを使っている場合は、以下の様に当該のレポジトリを指定します。

2021年1月23日更新
Vala-LintのサポートはALEにmergeされました。私のレポジトリではなく、ALEのレポジトリをそのまま使うことでVala-Lintがサポートされます。
Plugin 'dense-analysis/ale'

// 上のALEのレポジトリを使って下さい。
// 下の私のレポジトリは、以下の記事の説明のために残しておきます。
Plugin 'atsuya/ale', { 'pinned': 1 }

Vim Plugなど、他のツールでも似たような感じになるかと思います。

pinned: 1は、Vundleがこのプラグインの更新をする際にいかなるgitのオペレーションも行わない、という設定です (:PluginUpdateの際など)。Vundleは、指定されたレポジトリのデフォルトのブランチをチェックアウトして使用しますが、私のレポジトリでは特定のブランチで開発を行っています。Vundleで当該のレポジトリをクローンした後に、その特定のブランチを手動でチェックアウトします。今後Vundleを使ってプラグインの更新を行った場合に、またデフォルトのブランチに戻らないようにするために、pinnedフラグを使っています。

:PluginInstallをしてVundleを使って私のレポジトリがクローンされたら、手動で開発で使っているブランチをチェックアウトします。

$ cd ~/.vim/bundle/ale
$ git checkout feature/support-vala-lint

後は、Vala-Lintをインストールします。こちらの手順に従って下さい。

これで準備は完了です。Vimを起動して、Valaファイルを開いてみてください。もしVala-Lintでなんらかしらのエラーが見つかれば、ALEとしてそれらのエラーが表示されるはずです。

Vala-Lint showing errors via ALE on Vim

しばらく使ってみて、問題がなさそうであればALEのレポジトリにpull requestを送ろうと思っています。

ALEがどのようにlinterを扱っているか

普段はALEは使っているだけだったので、その実装などは全然見ていませんでした。今回、自分でALEからVala-Lintを使えるようにするために、その設計と実装を見てみました。とても綺麗な設計と実装になっており、新規にlinterをサポートするコードを書くのは比較的簡単です。Vala-Lintに対するlinterのコードはこちらになります。

とてもハイレベルには、ale-linters/{PROGRAMMING_LANGUAGE}/{LINTER_NAME}.vimにファイルを作成し、実行したいlinterへのパスやオプションを定義し、その出力結果をパースしてALEが解釈できるフォーマットに変換する、という感じです。ALEは、linterなどのコードは基本的に全てVimLで書くことを設計の理念としているので、基本的には全てVimLで書くことになります。

ALEそのものが、既にlinterなどを書くためによく使われる関数などを提供しているので、VimLを書いたことがない人でも比較的簡単にやりたいことができると思います。ALEの作者が、JavaScriptでコードを書いている人向けにVimLの説明をしてくれている記事があるので、そちらも参考になります。

結論

普段使っているVimで、Vala-Lintを走らせることができるようになりました。これで、Valaのコードを使った開発がやりやすくなると思います。

VimでサポートしたいlinterがあるけどVimLが面倒でやっていなかった人は、是非これを機会に自分でVimLを書いてみるのも良いかと思います。