X-Git-Url: https://git.korewanetadesu.com/?p=pico8.git;a=blobdiff_plain;f=pico8.el;h=fd6aeeddf4e8e357361fba40dc8692d42a3a5f7d;hp=543e71b92ccec7ed7d7aa3ce0414b5efe6338eab;hb=de5c1ca3c9b18928d7302ded50d2fab8ff17a1ea;hpb=fce210261ad1c4ac9de00cb8c872220f27743a23 diff --git a/pico8.el b/pico8.el index 543e71b..fd6aeed 100644 --- a/pico8.el +++ b/pico8.el @@ -2,7 +2,8 @@ ;; ;; Author: Joe Wreschnig ;; Package-Version: 20170620 -;; Package-Requires: ((emacs "25") (polymode "20170307") (lua-mode "20151025")) +;; Package-Requires: ((emacs "25") (polymode "20170307") (lua-mode "20151025") (dash "2.12.0")) +;; URL: https://git.korewanetadesu.com/pico8.git ;; Keywords: convenience ;; ;; This program is free software; you can redistribute it and/or @@ -16,13 +17,14 @@ ;; of which is "real Lua" text and the other five of which have ;; diverse strict formatting requirements. ;; -;; It provides the keybinds and commands for inter-mode actions. +;; It provides keybindings and commands for inter-mode actions. ;;; Code: (require 'polymode) (require 'lua-mode) (require 'thingatpt) +(require 'dash) (defgroup pico8 nil @@ -30,11 +32,6 @@ :tag "PICO-8" :group 'languages) -(defgroup pico8-faces nil - "Faces for PICO-8 (.p8) cartridge files." - :tag "PICO-8 Faces" - :group 'pico8) - (defcustom pico8-executable-paths '("/Applications/PICO-8.app/Contents/MacOS/pico8" ; macOS "/usr/lib/pico8/pico8" ; PocketCHIP @@ -58,9 +55,10 @@ disabled by setting this to t." (defcustom pico8-lua-indent-level 1 "Default indentation for PICO-8 Lua mode. -This overrides lua-indent-mode in `pico8-lua-mode'. `lua-mode''s -default indentation is 3, which is both idiosyncractic and quite -large when viewed in the PICO-8 editor, where the convetion is 1." +This overrides `lua-indent-level' in `pico8-lua-mode'. +`lua-mode''s 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 :tag "PICO-8 Lua Indent Level") @@ -86,10 +84,9 @@ large when viewed in the PICO-8 editor, where the convetion is 1." (defconst pico8-data-characters (append "0123456789abcdef" nil)) -(defface pico8-data-face +(defface pico8-data '((t (:inherit fixed-pitch))) - "Face for PICO-8 binary data." - :group 'pico8-faces) + "Face for PICO-8 binary data.") (define-derived-mode pico8-data-mode fundamental-mode "PICO-8 Data" @@ -107,13 +104,13 @@ insert the typed character if it is one of these characters, overwriting one of these characters." (interactive "P") (when (memq (char-after) pico8-data-characters) - (let ((overwrite-mode t)) + (let ((overwrite-mode 'overwrite-mode-textual)) (self-insert-command (prefix-numeric-value n))))) (let ((map pico8-data-mode-map)) (suppress-keymap map) - (dolist (c pico8-data-characters) - (define-key map (format "%c" c) 'pico8-data-self-insert-command))) + (dolist (c (mapcar #'char-to-string pico8-data-characters)) + (define-key map c 'pico8-data-self-insert-command))) (defun pico8-goto-char (position) "Set point to POSITION, a number. @@ -269,48 +266,22 @@ Make sure it is installed, and present in `pico8-executable-paths'"))) (error "Valid flag numbers are 0 to 255, inclusive")) (+ (* 2 flag) (if (> flag 128) 1 0))) -(defgroup pico8-pixel-faces nil - "Font faces to use for PICO-8 pixels. - -Rather than customizing each directly, you'll probably just want -to change `pico8-pixel-face'." - :tag "PICO-8 Pixel Faces" - :group 'pico8-faces) - -(defface pico8-pixel-face - '((t (:inherit pico8-data-face :height 100))) - "Face for PICO-8 sprite 'pixels'." - :group 'pico8-faces) - -(dotimes (i (length pico8-colors)) - (let ((c (nth i pico8-colors))) - (eval `(defface ,(intern (format "pico8-pixel-%x" i)) - '((t (:inherit pico8-pixel-face :foreground ,c))) - ,(format "Face for PICO-8 sprite 'pixel' %x" i) - :group 'pico8-pixel-faces - :tag ,(format "Face for PICO-8 sprite 'pixel' %x." i))))) +(defface pico8-pixel + '((t (:inherit pico8-data :height 100))) + "Face for PICO-8 sprite “pixels.”" + :group 'pico8) (defconst pico8-gfx-font-lock-keywords - `(("0+" . 'pico8-pixel-0) - ("1+" . 'pico8-pixel-1) - ("2+" . 'pico8-pixel-2) - ("3+" . 'pico8-pixel-3) - ("4+" . 'pico8-pixel-4) - ("5+" . 'pico8-pixel-5) - ("6+" . 'pico8-pixel-6) - ("7+" . 'pico8-pixel-7) - ("8+" . 'pico8-pixel-8) - ("9+" . 'pico8-pixel-9) - ("a+" . 'pico8-pixel-a) - ("b+" . 'pico8-pixel-b) - ("c+" . 'pico8-pixel-c) - ("d+" . 'pico8-pixel-d) - ("e+" . 'pico8-pixel-e) - ("f+" . 'pico8-pixel-f) - - ;; If the \n isn't in the smaller face the line is taller to - ;; accomodate the full sized point at the end-of-line. - ("\n" . 'pico8-pixel-0))) + (cons + ;; If the \n isn't in the smaller face the line is taller to + ;; accommodate the full sized point at the end-of-line. + '("\n" . 'pico8-pixel) + (-map-indexed + (lambda (i c) + `(,(format "%x+" i) + 0 '(:inherit pico8-pixel :foreground ,c))) + pico8-colors))) + (defun pico8-gfx-current-position () "Calculate the sprite and in-sprite position of the cursor." @@ -368,14 +339,14 @@ to change `pico8-pixel-face'." (define-key pico8-gfx-mode-map "q" 'pico8-backward-sprite) (define-key pico8-gfx-mode-map "w" 'pico8-forward-sprite) -(defface pico8-map-tile-face - '((t (:inherit pico8-data-face :height 100))) +(defface pico8-map-tile + '((t (:inherit pico8-data :height 100))) "Face for PICO-8 map 'tiles'." :group 'pico8-faces) (defconst pico8-map-font-lock-keywords - '(("[0-9a-f]+" . 'pico8-map-tile-face) - ("\n" . 'pico8-map-tile-face))) + '(("[0-9a-f]+" . 'pico8-map-tile) + ("\n" . 'pico8-map-tile))) (defun pico8-map-lighter () "Calculate the map tile under the cursor." @@ -452,9 +423,8 @@ this is the numeric literal in the code." (let ((beg (- (point) (% (min 255 (current-column)) 2)))) (string-to-number (buffer-substring beg (+ beg 2)) 16))) - ;; In Lua or other code, the sprite is a numeric literal. - ;; lua-mode doesn't derive from anything. - ((or (derived-mode-p 'lua-mode) (derived-mode-p 'prog-mode)) + ;; In Lua, the sprite is a numeric literal. + ((derived-mode-p 'lua-mode) (pico8--string-to-number (or (word-at-point) ""))) (t nil))) @@ -494,9 +464,6 @@ This function needs a lot of work.." (and (re-search-backward "\\" (- (point) 30) t) (char-after))))) - ;; FIXME: Actually parse something? lua-mode's sexp - ;; commands don't seem too good, and counting parentheses - ;; by hand is for nerds. (cond ((= c ?f) (pico8-goto-flag n)) ((= c ?s) (pico8-goto-sprite n)) (t (error "There's nothing obvious to go to")))))