lang/lua: improve moonscript & love2D support

- Fix moonscript-mode not highlighting/treating single-quoted strings as
  strings
- Fontify interpolated expressions in moonscript-mode strings (PR
  upstream?)
- Fix +lua-love-mode project detection
- Fix +lua/run-love-game love project root resolution
This commit is contained in:
Henrik Lissner 2019-07-09 01:01:44 +02:00
parent 74877edd5d
commit 1f0a5f04f2
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
4 changed files with 66 additions and 32 deletions

View file

@ -1,27 +0,0 @@
;;; lang/lua/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(defun +lua/open-repl ()
"Open Lua REPL."
(interactive)
(lua-start-process "lua" "lua")
(pop-to-buffer lua-process-buffer))
;;;###autoload
(defun +lua/run-love-game ()
"Run the current project with Love2D."
(interactive)
(when-let (root (+lua-love-project-root))
(async-shell-command
(format "%s %s"
(or (executable-find "love")
(if IS-MAC "open -a love.app"))
(shell-quote-argument (file-name-directory root))))))
;;;###autoload
(defun +lua-love-project-root ()
"Returns the directory where a main.lua exists.
Returns nil if 'love' executable can't be found."
(and (executable-find "love")
(locate-dominating-file buffer-file-name "main.lua")))

View file

@ -0,0 +1,38 @@
;;; lang/lua/autoload/lua.el -*- lexical-binding: t; -*-
(defun +lua-love-build-command ()
(when-let (root (+lua-love-project-root))
(format "%s %s"
(if (executable-find "love")
"love"
(if IS-MAC "open -a love.app"))
(shell-quote-argument root))))
;;;###autoload
(defun +lua/open-repl ()
"Open Lua REPL."
(interactive)
(lua-start-process "lua" "lua")
(pop-to-buffer lua-process-buffer))
;;;###autoload
(defun +lua/run-love-game ()
"Run the current project with Love2D."
(interactive)
(if-let (cmd (+lua-love-build-command))
(async-shell-command cmd)
(user-error "Couldn't find love project")))
;;;###autoload
(defun +lua-love-project-root ()
"Returns the directory where a main.lua exists.
Returns nil if 'love' executable can't be found."
(when (executable-find "love")
(or (and (projectile-locate-dominating-file default-directory "main.lua")
(when-let (root (projectile-locate-dominating-file default-directory "src/main.lua"))
(expand-file-name "src" root)))
(and (featurep! +moonscript)
(projectile-locate-dominating-file default-directory "main.moon")
(when-let (root (projectile-locate-dominating-file default-directory "src/main.moon"))
(expand-file-name "src" root))))))

View file

@ -0,0 +1,16 @@
;;; lang/lua/autoload/moonscript.el -*- lexical-binding: t; -*-
;;;###if (featurep! +moonscript)
;;;###autoload
(defun +lua|moonscript-fix-single-quotes ()
"Single-quoted strings aren't treated as strings."
;; (modify-syntax-entry ?\" "\"" moonscript-mode-syntax-table)
(modify-syntax-entry ?\' "\"" moonscript-mode-syntax-table))
;;;###autoload
(defun +lua|moonscript-fontify-interpolation ()
"Highlight interpolated expressions in moonscript strings."
(font-lock-add-keywords
nil '(("#{\\([^}]+\\)}"
(0 font-lock-preprocessor-face t)
(1 nil t)))))

View file

@ -19,21 +19,28 @@
(set-company-backend! 'lua-mode '(company-lua company-yasnippet))) (set-company-backend! 'lua-mode '(company-lua company-yasnippet)))
;;;###package moonscript (def-package! moonscript
(setq-hook! 'moonscript-mode-hook moonscript-indent-offset tab-width) :when (featurep! +moonscript)
:defer t
:config
(setq-hook! 'moonscript-mode-hook
moonscript-indent-offset tab-width)
(add-hook! 'moonscript-mode-hook
#'(+lua|moonscript-fix-single-quotes
+lua|moonscript-fontify-interpolation)))
;; ;;
;;; Frameworks ;;; Frameworks
(def-project-mode! +lua-love-mode (def-project-mode! +lua-love-mode
:modes (lua-mode markdown-mode json-mode) :modes (moonscript-mode lua-mode markdown-mode json-mode)
:files (and "main.lua" "conf.lua") :when #'+lua-love-project-root
:on-load :on-load
(progn (progn
(set-project-type! 'love2d (set-project-type! 'love2d
:predicate #'+lua-love-project-root :predicate #'+lua-love-project-root
:run #'+lua/run-love-game) :run #'+lua-love-build-command)
(map! :localleader (map! :localleader
:map +lua-love-mode-map :map +lua-love-mode-map
"b" #'+lua/run-love-game))) "b" #'+lua/run-love-game)))