2

Haxeコンパイラからflymake出力をフィードしようとしていますが、makeファイルがどこにあるかを伝える方法がわかりません(理想的には、代わりにnxmlファイルを使用します)。これまでのところ、Makefileにこれがあります。

BIN = ./bin
MAIN = com.wunderwafer.Main
SWF = wunderwafer.swf
SWFSETTINGS = -debug -swf-version 10 -swf-header 800:600:31
HFLAGS = -main $(MAIN) $(SWFSETTINGS) -cp ./src -swf $(BIN)/$(SWF)
HC = haxe

default: compile

compile: $(HC) $(HFLAGS)

clean:
    $(RM) -r $(BIN)/*

.PHONY: check-syntax

check-syntax:
    $(HC) $(HFLAGS)

後でそのように実行すると:

$ make -k check-syntax

期待される出力を生成します。ただし、チェックしようとしているファイルはsrcディレクトリの奥深くにあるため、flymakeはMakefileを見つけることができません(またはそう思われます)。

makefileがどこにあるかを認識できるようにflymakeを構成する方法は何ですか?(または、さらに良いことに、Haxeコードをコンパイルする一般的な方法は* .nxml設定ファイルを使用することであるため、シェルコマンドを実行するだけです。

編集:

近づいているようですが、どうもありがとうございましたが、flymakeは何か奇妙なことをしていて、それが何をしているのか正確に理解できないので、ここにログがあります:

received 65 byte(s) of output from process 967
file /home/wvxvw/projects/wafer/src/com/wunderwafer/map/Battlefield.hx, init=haxe-flymake-init
parsed 'Error : Invalid class name /home/wvxvw/projects/wafer/build.nxml', no line-err-info
file /home/wvxvw/projects/wafer/src/com/wunderwafer/map/Battlefield.hx, init=haxe-flymake-init
process 967 exited with code 1
cleaning up using haxe-flymake-cleanup
deleted file /tmp/flymake-Battlefield-855Cad.hx
Battlefield.hx: 0 error(s), 0 warning(s) in 0.15 second(s)
switched OFF Flymake mode for buffer Battlefield.hx due to fatal status CFGERR, warning Configuration error has occurred while running (haxe /home/wvxvw/projects/wafer/build.nxml)

実行しようとしているコマンドは次のようになります。

(defun haxe-flymake-get-cmdline (source base-dir)
  "Gets the cmd line for running a flymake session in a Haxe buffer.
This gets called by flymake itself. The output is a list of two elements:
the command to run, and a list of arguments.  The resulting command is like:

  $ haxe ${project-root}/build.nxml

"
  (message "base-dir %s" (file-name-as-directory base-dir))
  (list *haxe-compiler*
        (list
     (concat (file-name-as-directory base-dir)
         *build-nxml*))))

印刷されるメッセージは次のようになります。

base-dir /home/wvxvw/projects/wafer/

したがって、私が理解できる限り、結果のコマンドは次のようになります。

haxe /home/wvxvw/projects/wafer/build.nxml

しかし、flymakeは引数の前または後に何かを追加するように見えます。これにより、Haxeコンパイラはエラー「エラー:無効なクラス名」を生成します。このエラーは、追加の引数が1つある場合に発生し、コンパイラは次のように理解します。コンパイルする追加のクラス。しかし、ログには何が送信されているかは示されていません...

編集2:

私は追加しました:

#!/usr/bin/env bash

echo "$@" > /home/wvxvw/projects/wafer/log

そして、flymakeにコンパイラの代わりにこのスクリプトを呼び出させ、私が期待するように、引数を1つだけ渡します...ため息

4

1 に答える 1

1

いい質問ですね。makeツールの新しい「フレーバー」をflymakeに追加する簡単な方法がわかりません。私は方法を知っています、それは単純ではありません。これは私がphpcodesnifferに対して行ったことです。これは、任意のmakeツールでも同様です。

まず、インストールfnを定義します。

(defun fly/phpcs-install ()
  "install flymake stuff for PHP CodeSniffer files."
  (add-to-list
   'flymake-err-line-patterns
   (list fly/phpcs-error-pattern 1 2 3 4))

  (let* ((key "\\.php\\'")
         (phpentry (assoc key flymake-allowed-file-name-masks)))
    (if phpentry
        (setcdr phpentry '(fly/phpcs-init fly/phpcs-cleanup))
      (add-to-list
       'flymake-allowed-file-name-masks
       (list key 'fly/phpcs-init 'fly/phpcs-cleanup)))))

これにより、ファイル拡張子として.phpをキー入力した、flymakeリストに新しいエントリがインストールされます。flymakeのリストのエントリは、基本的にファイル拡張子を関数のペアに関連付けます。1つはinit用、もう1つはクリーンアップ用です。

init fnは、構文をチェックするために実行するコマンドを返すだけです。これは、適切な引数を使用したシェルコマンドにすることができます。codenifferの場合、このfnは次のようになります。

(defun fly/phpcs-init ()
  "initialize flymake for PHP using the PHP CodeSniffer tool."
  (let ((create-temp-f 'fly/phpcs-create-temp-intemp)
        (use-relative-base-dir t)
        (use-relative-source t)
        (get-cmdline-f 'fly/phpcs-get-cmdline)
        args
        temp-source-file-name)
    (setq temp-source-file-name (flymake-init-create-temp-buffer-copy create-temp-f)
          args (flymake-get-syntax-check-program-args
                temp-source-file-name "."
                use-relative-base-dir use-relative-source
                get-cmdline-f))
    args))

うわぁ!うさぎの穴を下ります。get-cmdlinefnは次のようになります。

(defun fly/phpcs-get-cmdline (source base-dir)
  "Gets the cmd line for running a flymake session in a PHP buffer.
This gets called by flymake itself. The output is a list of two elements:
the command to run, and a list of arguments.  The resulting command is like:

  php.exe -d auto_append_file="" -d auto_prepend_file="" phpcs\scripts\phpcs --report=emacs file.php

"
  (list fly/phpcs-phpexe
        (list
         "-d" "auto_append_file=''"
         "-d" "auto_prepend_file=''"
         (concat (file-name-as-directory fly/phpcs-phpcs-dir)
                 "scripts\\phpcs")
         (concat "--standard="  fly/phpcs-standard)
         "--report=emacs"
         "-s" ;; show the fullname of the rule being violated
         (expand-file-name source))))

あなたはhttp://www.emacswiki.org/emacs/flyphpcs.elで完全なelispを見ることができます

おそらくもっと簡単な方法があります。わからない。

于 2012-06-13T16:24:11.200 に答える