Flymake указывает местоположение Makefile

Я пытаюсь передать вывод flymake из компилятора Haxe, но я не знаю, как сказать ему, где находится файл 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

Это производит ожидаемый результат. Однако flymake не может найти Makefile (или так кажется), потому что файлы, которые я пытаюсь проверить, находятся глубже в каталоге src.

Как настроить flymake, чтобы он знал, где находится make-файл? (или, что еще лучше, просто выполните команду оболочки, потому что наиболее распространенный способ компилирования кода 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 выдавать ошибку "Ошибка: неверное имя класса" - эта ошибка возникла бы, если бы был один дополнительный аргумент, который компилятор понял бы как дополнительный класс для компиляции. Но журнал не показывает, что отправляется...

РЕДАКТИРОВАТЬ 2:

Я добавил:

#!/usr/bin/env bash

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

И заставил flymake вызывать этот скрипт вместо компилятора, и он передает только один аргумент, как я и ожидал... вздох

1 ответ

Решение

Это хороший вопрос. Я не знаю простого способа добавления нового "аромата" инструмента make в flymake. Я знаю способ, это просто не просто. Это то, что я сделал для php codesniffer - это будет похоже на любой произвольный инструмент 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)))))

Это устанавливает новую запись в список flymake alist с ключом.php в качестве расширения файла. Запись в списке flymake в основном связывает расширение файла с парой функций, одна для init и одна для cleanup.

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-cmdline fn выглядит так:

(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))))

Вы можете увидеть полную версию elisp на http://www.emacswiki.org/emacs/flyphpcs.el

Там, вероятно, более простой способ. Я просто не знаю этого.

Другие вопросы по тегам