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:
parent
74877edd5d
commit
1f0a5f04f2
4 changed files with 66 additions and 32 deletions
|
@ -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")))
|
|
38
modules/lang/lua/autoload/lua.el
Normal file
38
modules/lang/lua/autoload/lua.el
Normal 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))))))
|
16
modules/lang/lua/autoload/moonscript.el
Normal file
16
modules/lang/lua/autoload/moonscript.el
Normal 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)))))
|
|
@ -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)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue