PHP syntax ellenőrzés Sublime-ban
PHP linter futtatása fájl mentés után.
A minap eszembe jutott, hogy milyen jó is lenne, ha a Sublime jelezné, ha van valami elgépelés az éppen szerkesztett fájlba. És bár létezik elég sok megoldás a problémára, ami ráadásul még több nyelvet is (Python, CSS, JavaScript, stb.) támogat, de azért mégis csak sokkal mókásabb egy sajátot írni.
A megoldás lényege, hogy valahol a vinyón van egy PHP bináris, amit megfuttatunk a -l
kapcsolóval, ami nem futtatja a fájlt, hanem csak szintaxisra ellenőriz. A válasz a PHP szokásos "parse error" szövege lesz, ami azt írja ki, hogy hol hasalt el a fordító, ami nem feltétlen esik egybe azzal, hogy hol van a hiba. A kódot többféleképpen meg lehetne valósítani (pl. parancsként, amit menüből, vagy billentyűkombinációra lehet futtatni), én azt választottam, hogy mentés eseményre automatikusan fusson le, ha megfelelő a fájl kiterjesztése:
import sublime, sublime_plugin, os, subprocess, re
class PhpLintEventListener(sublime_plugin.EventListener):
key = "php_lint_syntax_error"
def on_post_save(self, view):
if not view.settings().has("php_lint"):
return
config = view.settings().get("php_lint")
bin_path = config.get("binary", "")
name, ext = os.path.splitext(view.file_name())
if not bin_path or ext not in config.get("extensions", []):
return
view.erase_regions(self.key)
view.erase_status(self.key)
shell = sublime.platform() == "windows"
p = subprocess.Popen([bin_path, "-l", view.file_name()], shell=shell, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate()
if "" == stderr:
data = stdout
else:
data = stderr
result = re.match(r"(.+?) in (.+?) on line ([0-9]+).*", data, re.M | re.S)
if result:
error = result.group(1)
line = result.group(3)
view.add_regions(self.key, [view.full_line(view.text_point(int(line) - 1, 0))], "markup.deleted", "dot")
view.set_status(self.key, error + " on line " + line)
Nem egy bonyolult jószág, ha létezik a config és a fájl kiterjesztése benne van a configban megadott listában, akkor megfuttatjuk a PHP binárist és megkeressük a kimenetében, hogy hányadik sorban volt a hiba. A hibás sort kiemeljük és a hiba szövegét a státuszba ki is írjuk. A szükséges config pedig valahogy így néz ki:
"php_lint" : {
"binary" : "d:\\php\\5.2\\php.exe",
"extensions" : [".php"]
}
Ezt lehet pakolni a Preferences > Settings - User
részbe vagy akár a projekt beállításai közé is (a .sublime-project
fájlon belül a "settings"
blokkba).