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
Там, вероятно, более простой способ. Я просто не знаю этого.