土下座しながら探索中

主に競技プログラミング

独自の言語でflymakeを使うために

flymakeをデフォルトで設定してある言語以外、自分で作った言語等で使う際のflymakeの設定方法のメモ

以下のコードは flymake を a_accepter に使った例
a_accepter は flymake 設定練習用に適当に用意したもの
ファイルを読み込んで 'a' 以外の文字があればエラーとして出力する

;; flymake for a_accepter 
(require 'flymake)
(defun flymake-aAccepter-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    (list "a_accepter" (list " -p " local-file " < $HOME/dummy.txt" ))))

(setq flymake-allowed-file-name-masks
      (cons '(".+\\.aAccepter$"
              flymake-aAccepter-init
              flymake-simple-cleanup
              flymake-get-real-file-name)
            flymake-allowed-file-name-masks))

(setq flymake-err-line-patterns
      (cons '("(\\(.*\\):\\([0-9]+\\)) \\[\\(warning\\|error\\)\\]\\(.*\\): \\(.*\\)"
	      1 2 nil 4)
            flymake-err-line-patterns))

別の言語に使う場合は上の例の
1.aAccepterとなっている部分を別の名前に変える
2.(list "a_accepter" (list " -p " local-file " < $HOME/dummy.txt" ) の "a_accepter" を別の言語のコマンド(C++ならg++,Javaならjavaとか)に変更する
続く(list " -p "... ) はコマンドにつけるオプションなのでファイル名以外に必要なものがないなら他は消す 必要なら書く
3. (cons '("(\\(.*\\):\\([0-9]+\\)) \\[\\(warning\\|error\\)\\]\\(.*\\): \\(.*\\)"
1 2 nil 4) ここでエラーメッセージを解析してハイライトする 2. のコマンドでコンパイルし、そこででたエラーメッセージの中からこの正規表現にマッチした部分をハイライトする 続く4つの数字は1-indexedで先ほどの正規表現のうちファイル名、行番号、列番号(任意)、エラー内容(任意)を表す

正規表現を書く際には M-x re-builder を利用すると良い

あと、 (cons '(".+\\.aAccepter$" の .aAccepter は別の言語の拡張子に変更すること

完成するまでは(setq flymake-log-level 3)を利用すると良い
これをつけるとミニバッファに処理の結果が出力される

最後に、コンパイルした結果の各行の最後に改行が入っていない場合、flymakeがparsed errorとなることがある
そのような場合は仕方ないので一旦コンパイルの結果をテキストに保存し、再度その各行に改行を入れて出力するなどすること