yaottiの日記

2009-09-14

flymakeでのシンタックスチェック

22:17

ちょっとした書き捨てプログラムにファイルに紐付いていないバッファ(*scratch*とか)を良く使うんだけど,その時flymakeがシンタックスチェックをしてくれないので追ってみた&解決した.


そもそもflymakeのメカニズムは,

  1. 現在のバッファ内容をコピーした,flymake用の一時ファイルを作成
  2. そのファイルをコンパイル(perlなどのLLなら実行)する
  3. エラーを吐くかチェックし,エラーなら該当部分にハイライト&メッセージ

というもの.


そこで,ファイルに紐付いていないバッファでflymakeしようとすると,編集中のファイルが存在しないため一時ファイルを作成できずうまく動かない,ということになる.

一時ファイルを作成する際に,buffer-file-nameとdefault-directoryという2つの変数を見ているようなので,flymakeをonにする前に以下のように適当なディレクトリ&ファイル名を指定してやれば良い.

(setq buffer-file-name "/tmp/perl-scratch.pl"
      default-directory "/tmp/")
(flymake-mode t)

実際に/tmp/perl-scratch.plは作成されてしまうので,kill-bufferにdefadviceで削除するロジック付けたほうが綺麗といえば綺麗かも.

ちなみにperlの書き捨てバッファは以下のような関数を作ってやっている.

(defun create-perl-buffer ()
  "Create a perl buffer like *scratch*"
  (interactive)
  (let* ((buf-name "*perl-scratch*")
         (buffer (get-buffer-create buf-name))
         (modules '(strict warnings Data::Dumper Perl6::Say)))
    (switch-to-buffer buffer)
    (if (= (buffer-size buffer) 0)
        (progn
          (dolist (m modules)
            (insert (format "use %s;\n" m)))
          (insert "\n")
          ;; flymakeによるシンタックスチェックを有効にするため,ファイルに紐付ける
          (setq buffer-file-name "/Users/hiroshige/tmp/perl-scratch.pl"
                default-directory "/Users/hiroshige/tmp/")
          (cperl-mode)
          (require 'perl-completion)
          (perl-completion-mode t)
          ))))
;; バッファ内容を実行
(defun perl-eval-buffer ()
  "Run buffer as Perl code"
  (interactive)
  (save-excursion
    (mark-whole-buffer)
    (shell-command-on-region (point) (mark) "perl"))
 )
(define-key cperl-mode-map "\C-cP" 'perl-eval-buffer)

M-x create-perl-bufferして適当にコード書いて,C-c P(M-x perl-eval-buffer)で実行というサイクル.


なんかemacsというよりperlの話だ.

flymakeの話に戻ると,flymakeの適当な関数に上の(setq buffer-file-name ...)をdefadviceで実行前にセットするようにすれば,他の言語においてもいい感じにやってくれるようになるはず.

BereniceBerenice 2012/08/21 13:18 Thanky Thanky for all this good infortmaion!

slrsdqduckrslrsdqduckr 2012/08/21 18:41 K8cmJE <a href="http://borjuogcxbcq.com/">borjuogcxbcq</a>

rdifhmsmtrdifhmsmt 2012/08/25 01:47 YySnGM , [url=http://tsoiotjscuyl.com/]tsoiotjscuyl[/url], [link=http://mhvejqomymec.com/]mhvejqomymec[/link], http://grupjsjncnhc.com/

ゲスト



トラックバック - http://emacs.g.hatena.ne.jp/yaotti/20090914