From 40ced6f3f2f3701e659045c4e3ec99c20b107dd8 Mon Sep 17 00:00:00 2001 From: TEC Date: Sun, 23 Jan 2022 01:03:38 +0800 Subject: [PATCH] feat(tutorial): basic page loading --- modules/config/tutorial/autoload/tutorial.el | 61 ++++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/modules/config/tutorial/autoload/tutorial.el b/modules/config/tutorial/autoload/tutorial.el index f4d94c3fe..f4b71917f 100644 --- a/modules/config/tutorial/autoload/tutorial.el +++ b/modules/config/tutorial/autoload/tutorial.el @@ -36,8 +36,10 @@ (defun doom-tutorial-run (name) "Run the tutorial NAME." + (doom-tutorial-quit) (when-let ((tutorial (cdr (assoc name doom-tutorial--registered)))) - (eval (plist-get tutorial :setup)))) + (eval (plist-get tutorial :setup))) + (doom-tutorial-load-page name)) (defun doom-tutorial-run-maybe (name) (unless (plist-get (cdr (assoc name doom-tutorial--progress)) :skipped) @@ -88,22 +90,6 @@ (doom-tutorial-run-maybe ',name))) (doom-tutorial-register ',name ',parameters)))) -(defmacro doom-tutorial-page! (&rest body) - (let ((parameters (doom-tutorial-normalise-plist body))) - (dolist (strparam '(:instructions :title)) - (when-let ((paramvalue (plist-get parameters strparam))) - (plist-put parameters strparam - (if (cl-every #'stringp paramvalue) - (apply #'concat paramvalue) - `(lambda () (concat ,@paramvalue)))))) - (when-let ((test (plist-get parameters :test))) - (plist-put parameters :test - (cond - ((functionp test) test) - ((consp test) `(lambda () ,@test)) - (_ (error "Test is invalid. %S" test))))) - `(list ,@parameters))) - (defun doom-tutorial-register (name parameters) (push (cons name parameters) doom-tutorial--registered) (unless (assoc name doom-tutorial--progress) @@ -125,6 +111,47 @@ doom-modules) loaded-tutorials)) +(defmacro doom-tutorial-page! (&rest body) + (let ((parameters (doom-tutorial-normalise-plist body))) + (dolist (strparam '(:instructions :title)) + (plist-put parameters strparam + (if-let ((paramvalue (plist-get parameters strparam))) + (if (cl-every #'stringp paramvalue) + (apply #'concat paramvalue) + `(lambda () (concat ,@paramvalue))) + ""))) + (when-let ((test (plist-get parameters :test))) + (plist-put parameters :test + (cond + ((functionp test) test) + ((consp test) `(lambda () ,@test)) + (_ (error "Test is invalid. %S" test))))) + `(list ,@parameters))) + +(defun doom-tutorial--current-page (name) + (plist-get (cdr (assoc name doom-tutorial--progress)) :page)) + +(defun doom-tutorial--set-page (name page) + (plist-put (cdr (assoc name doom-tutorial--progress)) :page page)) + +(defun doom-tutorial-load-page (name &optional page) + (let ((content (nth (or (and page + (doom-tutorial--set-page name page)) + (doom-tutorial--current-page name)) + (plist-get (cdr (assoc name doom-tutorial--registered)) + :pages)))) + (let ((instructions (plist-get content :instructions)) + (title (plist-get content :title))) + (with-current-buffer doom-tutorial--instructions-buffer-name + (with-silent-modifications + (erase-buffer) + (insert ?\n) + (insert (cond + ((stringp instructions) instructions) + ((functionp instructions) (funcall instructions))))))) + (with-current-buffer doom-tutorial--scratchpad-buffer-name + (setq-local doom-tutorial-test (plist-get content :test))))) + (defvar doom-tutorial-workspace-name "*tutorial*") (defvar doom-tutorial--old-windowconf)