できる Flycheck拡張 (shell scriptでチェッカーを実装する)

Posted on
Emacs Flycheck Shell

FlycheckはEmacsのデファクトスタンダードな構文チェッカーです。

以前マイナーな言語の構文チェッカーを自作しました。 Flycheckの拡張は思ったより簡単にできたので、ここでやり方を紹介しておきます。

基本的にはDeveloper’s Guideに必要なことは全て書いてあるので、わからないことがあったらこちらを参照すると良いかと思います。

この記事では、より気軽に実践できるように、構文チェッカー本体をshell scriptで実装します。

shell scriptでチェッカーを書く

例としてコード中のTODOコメントを警告するという(おせっかいな)チェッカーをshell scriptで実装してみましょう。

こんなshell scriptをチェックの対象とします。(bad.sh)

#!/bin/sh

# TODO: 引数チェック
name=$1

echo "Hello, ${name}"

# TODO: 気の利いたことを言う
echo 'Bye!'

試しにgrepで問題のある行を抽出してみます。

$ cat bad.sh | grep -n TODO
3:# TODO: 引数チェック
8:# TODO: 気の利いたことを言う

エラーメッセージっぽく整形。

$ cat bad.sh | grep -n TODO | awk -F: '{print "warning:"$1":TODO comments should be removed."}'
warning:3:TODO comments should be removed.
warning:8:TODO comments should be removed.

エラーのフォーマットは

エラーの種類:行:エラーメッセージ

としました。

良さそうなら以下のようなshell scriptとして保存しておきます。(check_todo.sh)

#!/bin/sh

cat $1 |
    grep -n TODO |
    awk -F: '{print "warning:"$1":TODO comments should be removed."}'

実行権限を付与

chmod +x check_todo.sh

Emacsのexec-pathの通った所に置いておきます。例えば

(add-to-list 'exec-path "~/bin")

と設定してあったら

cp check_todo.sh ~/bin

Flycheckの設定

先程のshell scriptをFlycheckから呼び出せるようにします。

(require 'flycheck)

(flycheck-define-checker sh-todo-checker
  "Check TODO comment"
  :command ("check_todo.sh" source)
  :error-patterns
  ((warning line-start "warning:" line ":" (message) line-end))
  :modes sh-mode)

(add-to-list 'flycheck-checkers 'sh-todo-checker)

:error-patternsでFlycheckのDSLを使ってエラーのフォーマットを指定しています。

shell scriptを開いてFlycheckを有効にすれば警告が表示されるはずです。