Sublime Text で Groovy の構文チェック

やりたいこと

Sublime Text を使って Groovy の構文エラーを表示させたい。

まずはビルドさせてみる

メニューから [Tools] > [Build System] > [New Build System] を選択すると新しい設定ファイルが開かれるので、Groovy の情報を書き込む。

{
    "cmd": ["C:\\groovy\\2.2.0\\bin\\groovy.bat",  "$file"]
}

これを名前の先頭に Groovy とつけて保存(場所はたぶん変更しなくてOK)

再びメニューから [Tools] > [Build System] > [Groovy] を選択して、Groovy ファイルを開いた状態で Ctrl + b

f:id:erudoru:20131207171427p:plain

できた。

でも違う!

1、2年前 PHP の開発を行った時に Sublime Text を使い始めたのですが、その時は SublimeLinter を使ってファイル保存時に構文チェックをかけて、エラーの箇所にアラートを表示してたのですが、それを Groovy でもやりたい!

※ SublimeLinter のインストールは省略します

SublimeLinter を Groovy に対応させる

Sublime Text のプラグインは Python で作成されているため、Groovy 用の Python コードを書きます。

メニューから [Preferences] > [Brose package] でパッケージディレクトリが開かれます。 SublimeLinter > sublimelinter > modules の中に各種言語用の処理が記載されています。今のバージョンでは Groovy は無いっぽいので自作してしまいます。

groovy.py

import re

from base_linter import BaseLinter, INPUT_METHOD_FILE

CONFIG = {
    'language': 'Groovy',
    'executable': 'groovy',
    'lint_args': ['-e', 'new GroovyShell().parse(new FileReader(args[0]), args[0])', '{filename}'],
    'input_method': INPUT_METHOD_FILE
}

class Linter(BaseLinter):
    def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
        for line in errors.splitlines():
            match = re.match(r'^(?P<file>.*\.groovy)[\d: ]+(?P<error>.*)\s+@\s+line\s+(?P<line>\d+)\s*,\s*column\s+(?P<column>\d+)\s*.', line)
            if match:
                break

        if match:
            error, line = match.group('error'), match.group('line')
            self.add_message(int(line), lines, error, errorMessages)

Groovy には PHP の -l オプションの様な構文チェックオプションがありません。そのため GroovyShell クラスを使用して構文チェックを行います。 内容は既存のコードを参考にしています(主に php.py)

チェック用の python コードができたら今度は SublimeLinter の設定。

[Preferences] > [Package Settings] > [SublimeLinter] > [Settings - User] で、Groovy のパスを通します。

{
    "sublimelinter_executable_map":
    {
        "groovy": "C:\\groovy\\2.2.0\\bin\\groovy.bat"
    }
}

さて、これで Groovy ファイルを編集&保存を行うと

f:id:erudoru:20131207173147p:plain

でた!

行番号の箇所にエラーが表示されました。 (表示のされ方が以前とちょっと違う気がしますがプラグインのバージョンの違いでしょうか)

groovyserv を使ってもっと早く!

チェックはできたのですが、反応が一瞬遅れて表示されます。sublimelinter_executable_map の設定に groovyclient のパスを指定すれば速度が向上します。

Windows 環境の場合、Cygwin 上で GVM を使っている場合でも、別途 groovyserv の公式サイトから Windows 用の groovyclient.exe を落としてくる必要があると思います。 かつ自前の環境では、事前に groovyserv を起動していないと Sublime Text が固まってしまいました。