X-Git-Url: https://git.korewanetadesu.com/?p=pico8.git;a=blobdiff_plain;f=pico8.el;h=7600345ef7d7e4d440def660b68c96d4904dc336;hp=fd6aeeddf4e8e357361fba40dc8692d42a3a5f7d;hb=862c75c9e7c2d4f1d0b448efba49825c8fc73733;hpb=de5c1ca3c9b18928d7302ded50d2fab8ff17a1ea diff --git a/pico8.el b/pico8.el index fd6aeed..7600345 100644 --- a/pico8.el +++ b/pico8.el @@ -6,16 +6,16 @@ ;; URL: https://git.korewanetadesu.com/pico8.git ;; Keywords: convenience ;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or (at +;; your option) any later version. ;;; Commentary: ;; -;; This mode (ab)uses polymode to fit six modes into one buffer, one -;; of which is "real Lua" text and the other five of which have -;; diverse strict formatting requirements. +;; This mode (ab)uses polymode to fit six modes into one buffer, one of +;; which is "real Lua" text and the other five of which have diverse +;; strict formatting requirements. ;; ;; It provides keybindings and commands for inter-mode actions. @@ -25,6 +25,7 @@ (require 'lua-mode) (require 'thingatpt) (require 'dash) +(require 'calc-bin) (defgroup pico8 nil @@ -46,8 +47,8 @@ PICO-8 processes are long-lived with little surprising output, so their output buffers are killed by default when they exit. -However, this is not usual behavior in Emacs, and can be -disabled by setting this to t." +However, this is not usual behavior in Emacs, and can be disabled +by setting this to t." :group 'pico8 :tag "Preserve PICO-8 Output On Exit" :type 'boolean) @@ -55,8 +56,8 @@ disabled by setting this to t." (defcustom pico8-lua-indent-level 1 "Default indentation for PICO-8 Lua mode. -This overrides `lua-indent-level' in `pico8-lua-mode'. -`lua-mode''s default indentation is 3, which is both +This overrides ‘lua-indent-level’ in ‘pico8-lua-mode’. +‘lua-mode’ uses a default indentation is 3, which is both idiosyncratic and quite large when viewed in the PICO-8 editor, where the convention is 1." :group 'pico8 @@ -125,7 +126,7 @@ widened if necessary to reach it." "Look up the PICO-8 executable." (or (car (delete nil (mapcar 'executable-find pico8-executable-paths))) (error "The PICO-8 executable could not be found. -Make sure it is installed, and present in `pico8-executable-paths'"))) +Make sure it is installed, and present in ‘pico8-executable-paths’"))) (defun pico8--create-output-buffer () "Create and return a buffer for PICO-8 output." @@ -256,15 +257,40 @@ Make sure it is installed, and present in `pico8-executable-paths'"))) (col (current-column))) (+ (* 128 row) (/ col 2))))) +(defun pico8-gff-eldoc () + "Show information about the flag under the point." + (save-excursion + (when (cl-oddp (current-column)) + (backward-char)) + (when (looking-at "..") + (let* ((hex (substring-no-properties (match-string 0))) + (int (string-to-number hex 16))) + (format "%08d %3d %02x" + (let ((calc-number-radix 2)) + (string-to-number (math-format-radix int))) + int int))))) + +(defconst pico8-gff-font-lock-keywords + '(("..\n?" 0 + (prog1 nil + ;; TODO: Lots of work to do here… + (let ((pdl (or (car (overlays-at (match-beginning 0))) + (make-overlay (match-beginning 0) (match-end 0))))) + (overlay-put pdl 'after-string " ")))))) + + (define-derived-mode pico8-gff-mode pico8-data-mode '(:eval (format "Flag[%d]" (pico8-gff-lighter))) - "Major mode for editing flags in PICO-8 cartridges.") + "Major mode for editing flags in PICO-8 cartridges." + (font-lock-add-keywords nil pico8-gff-font-lock-keywords) + (setq-local eldoc-documentation-function #'pico8-gff-eldoc)) (defun pico8-gff-offset-of-flag (flag) "Calculate the offset of of flag number FLAG." (unless (<= 0 flag 255) (error "Valid flag numbers are 0 to 255, inclusive")) (+ (* 2 flag) (if (> flag 128) 1 0))) + (defface pico8-pixel '((t (:inherit pico8-data :height 100))) @@ -279,7 +305,7 @@ Make sure it is installed, and present in `pico8-executable-paths'"))) (-map-indexed (lambda (i c) `(,(format "%x+" i) - 0 '(:inherit pico8-pixel :foreground ,c))) + 0 '(face (:inherit pico8-pixel :foreground ,c)))) pico8-colors))) @@ -411,8 +437,8 @@ Returns nil, not 0, if the string was not converted." "Get the sprite number relevant to the point. When editing a flag, this is the flag number. When editing a -map, this is the value at the map. When editing Lua code, -this is the numeric literal in the code." +map, this is the value at the map. When editing Lua code, this +is the numeric literal in the code." (cond ((derived-mode-p 'pico8-gff-mode) (pico8-gff-current-position)) @@ -434,8 +460,8 @@ this is the numeric literal in the code." "Go to the sprite number relevant to the text at the point. When editing a flag, this is the flag number. When editing a -map, this is the value at the map. When editing Lua code, -this is the numeric literal in the code." +map, this is the value at the map. When editing Lua code, this +is the numeric literal in the code." (interactive) (let ((sprite (pico8-sprite-relevant-to-point))) (if sprite (pico8-goto-sprite sprite) @@ -504,7 +530,7 @@ This function needs a lot of work.." (flycheck-define-checker pico8-lua "A PICO-8 Lua syntax checker using the Lua compiler. -See URL `http://www.lua.org/'." +See URL ‘http://www.lua.org/'." :command ("luac" "-p" source) :standard-input nil :error-patterns @@ -516,7 +542,7 @@ See URL `http://www.lua.org/'." (flycheck-define-checker pico8-luacheck "A PICO-8 Lua syntax checker using luacheck. -See URL `https://github.com/mpeterv/luacheck'." +See URL ‘https://github.com/mpeterv/luacheck’." :command ("luacheck" "--formatter" "plain" "--codes" ; Show warning codes @@ -533,7 +559,7 @@ See URL `https://github.com/mpeterv/luacheck'." (error line-start (optional (file-name)) ":" line ":" column ":" - ;; `luacheck' before 0.11.0 did not output codes for errors, hence + ;; ‘luacheck’ before 0.11.0 did not output codes for errors, hence ;; the ID is optional here (optional " (" (id "E" (one-or-more digit)) ") ") (message) line-end)) @@ -583,3 +609,7 @@ See URL `https://github.com/mpeterv/luacheck'." (provide 'pico8) ;;; pico8.el ends here + +;; Local Variables: +;; sentence-end-double-space: t +;; End: