From 36efbc122db62c6ffe6b1271d84c6f92c94bc9d6 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Sun, 10 Mar 2024 17:47:22 +0300 Subject: [PATCH 1/4] biome: add biome-preset --- biome-multi.el | 14 +++++++++++--- biome-query.el | 14 +++++++++++--- biome.el | 27 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/biome-multi.el b/biome-multi.el index b116ac8..63700fa 100644 --- a/biome-multi.el +++ b/biome-multi.el @@ -113,12 +113,20 @@ This is a list of forms as defined by `biome-query-current'.") (defun biome-multi--generate-preset () "Generate a preset for the current multi-query." (interactive) - (let ((buf (generate-new-buffer "*biome-preset*"))) + (let ((buf (generate-new-buffer "*biome-preset*")) + (preset-symbol (gensym "biome-query-preset-"))) (with-current-buffer buf (emacs-lisp-mode) (insert ";; Add this to your config\n") - (insert (pp-to-string `(biome-def-multi-preset ,(gensym "biome-query-preset-") - ,biome-multi-query-current)))) + (insert (pp-to-string `(biome-def-multi-preset ,preset-symbol + ,biome-multi-query-current))) + (insert ";; invoke with M-x " (symbol-name preset-symbol)) + (insert "\n\n;; Or:\n") + (insert (pp-to-string `(add-to-list 'biome-presets-alist + '(,(symbol-name preset-symbol) + :multi + ,biome-multi-query-current)))) + (insert ";; invoke with M-x biome-preset")) (switch-to-buffer buf))) (transient-define-prefix biome-multi-query (callback) diff --git a/biome-query.el b/biome-query.el index d82d11c..67e0b69 100644 --- a/biome-query.el +++ b/biome-query.el @@ -965,12 +965,20 @@ SUFFIXES is a list of suffix definitions." (defun biome-query--generate-preset () "Generate a preset for the current query." (interactive) - (let ((buf (generate-new-buffer "*biome-preset*"))) + (let ((buf (generate-new-buffer "*biome-preset*")) + (preset-symbol (gensym "biome-query-preset-"))) (with-current-buffer buf (emacs-lisp-mode) (insert ";; Add this to your config\n") - (insert (pp-to-string `(biome-def-preset ,(gensym "biome-query-preset-") - ,biome-query-current)))) + (insert (pp-to-string `(biome-def-preset ,preset-symbol + ,biome-query-current))) + (insert ";; invoke with M-x " (symbol-name preset-symbol)) + (insert "\n\n;; Or:\n") + (insert (pp-to-string `(add-to-list 'biome-presets-alist + '(,(symbol-name preset-symbol) + :normal + ,biome-query-current)))) + (insert ";; invoke with M-x biome-preset")) (switch-to-buffer buf))) (transient-define-prefix biome-query--section (section &optional parents) diff --git a/biome.el b/biome.el index f0af0ca..538a664 100644 --- a/biome.el +++ b/biome.el @@ -57,6 +57,16 @@ API." :type 'function :group 'biome) +(defcustom biome-presets-alist nil + "Presets for `biome' queries." + :type '(repeat + (list + (string :tag "Preset name") + (choice (const :tag "Normal" :normal) + (const :tag "Multi" :multi)) + (sexp :tag "Parameters"))) + :group 'biome) + (defun biome () "Bountiful Interface to Open Meteo for Emacs." (interactive) @@ -117,5 +127,22 @@ PARAMS as query." (setq biome-multi-query-current ',params) (call-interactively #'biome-multi))) +(defun biome-preset (preset-def) + "Run PRESET-DEF." + (interactive (list (alist-get + (completing-read "Preset" biome-presets-alist) + biome-presets-alist nil nil #'equal))) + (pcase-let ((`(,kind ,params) preset-def)) + (pcase kind + (:normal + (setq biome-query--callback + (lambda (query) + (biome-api-get query biome-frontend))) + (setq biome-query-current params) + (biome-query--section-open (alist-get :name params))) + (:multi + (setq biome-multi-query-current params) + (call-interactively #'biome-multi))))) + (provide 'biome) ;;; biome.el ends here From db0784e243988005f4f45919a90bf323442401cf Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Sun, 10 Mar 2024 22:33:52 +0300 Subject: [PATCH 2/4] biome: improve presets --- biome-multi.el | 7 ++++++- biome-query.el | 18 ++++++++++++------ biome.el | 25 +++++++++++++++++++++---- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/biome-multi.el b/biome-multi.el index 63700fa..587015a 100644 --- a/biome-multi.el +++ b/biome-multi.el @@ -25,10 +25,14 @@ ;; Tools for doing multiple queries to Open Meteo. ;;; Code: -(require 'biome-query) (require 'font-lock) (require 'transient) +(require 'biome-query) + +;; XXX Recursive imports T_T +(declare-function biome-preset "biome") + (defvar biome-multi-query-current nil "Current query. @@ -140,6 +144,7 @@ This is a list of forms as defined by `biome-query-current'.") ["Actions" :class transient-row ("RET" "Run" biome-multi-exec) + ("p" "Preset" biome-preset :transient transient--do-replace) ("P" "Generate preset definition" biome-multi--generate-preset) ("R" "Reset" biome-multi-reset :transient t) ("q" "Quit" transient-quit-one)] diff --git a/biome-query.el b/biome-query.el index 67e0b69..3a97e6a 100644 --- a/biome-query.el +++ b/biome-query.el @@ -39,6 +39,10 @@ (require 'biome-api-data) +;; XXX Recursive imports T_T +(declare-function biome-preset "biome") +(declare-function biome-multi "biome") + (defcustom biome-query-max-fields-in-row 20 "Maximum number of fields in a row." :type 'integer @@ -438,7 +442,7 @@ number of options is more than (mapconcat (lambda (choice) (propertize (cdr choice) 'face - (if (eq (car choice) value) + (if (equal (car choice) value) 'transient-value 'transient-inactive-value))) (oref obj options) @@ -1030,14 +1034,16 @@ SECTION is a form as defined in `biome-api-parse--page'." (transient-parse-suffixes 'transient--prefix (cl-loop for (name . params) in biome-api-data - collect `(,(alist-get :key params) - ,name - (lambda () (interactive) - (biome-query--section-open ,name)) - :transient transient--do-stack))))] + collect `(,(alist-get :key params) + ,name + (lambda () (interactive) + (biome-query--section-open ,name)) + :transient transient--do-stack))))] ["Actions" :class transient-row ("r" "Resume" biome-resume :transient transient--do-replace) + ("p" "Preset" biome-preset :transient transient--do-stack) + ("u" "Join multiple queries" biome-multi :transient transient--do-stack) ("q" "Quit" transient-quit-one)] (interactive (list nil)) (unless callback diff --git a/biome.el b/biome.el index 538a664..c44a742 100644 --- a/biome.el +++ b/biome.el @@ -58,7 +58,17 @@ API." :group 'biome) (defcustom biome-presets-alist nil - "Presets for `biome' queries." + "Presets for `biome' queries. + +One item of the list is another list with three elements: +- preset name; +- `:normal' for normal `biome' or `:multi' for `biome-multi'; +- parameters as defined by `biome-query-current' or + `biome-multi-query-current'. +Thus, preset names are the keys of the alist. + +To generate expressions that add stuff to this list, run \"Generate +preset definition\" in `biome' or `biome-multi'." :type '(repeat (list (string :tag "Preset name") @@ -128,7 +138,14 @@ PARAMS as query." (call-interactively #'biome-multi))) (defun biome-preset (preset-def) - "Run PRESET-DEF." + "Run `biome' with a preset. + +PRESET-DEF is one preset as defined by `biome-presets-alist', sans the +name. If run interactively, prompt PRESET-DEF from +`biome-presets-alist'. + +Run \"Generate preset definition\" in `biome' or `biome-multi' to +generate expressions that add stuff to `biome-presets-alist'." (interactive (list (alist-get (completing-read "Preset" biome-presets-alist) biome-presets-alist nil nil #'equal))) @@ -138,10 +155,10 @@ PARAMS as query." (setq biome-query--callback (lambda (query) (biome-api-get query biome-frontend))) - (setq biome-query-current params) + (setq biome-query-current (copy-tree params)) (biome-query--section-open (alist-get :name params))) (:multi - (setq biome-multi-query-current params) + (setq biome-multi-query-current (copy-tree params)) (call-interactively #'biome-multi))))) (provide 'biome) From 6a19f636bff5fb9067bad2328d60fd56b44f64a6 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Sun, 10 Mar 2024 22:50:00 +0300 Subject: [PATCH 3/4] biome-grid: add highlight current hour / day (#6) --- biome-grid.el | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/biome-grid.el b/biome-grid.el index 4f9798a..448ce47 100644 --- a/biome-grid.el +++ b/biome-grid.el @@ -38,6 +38,18 @@ :type 'boolean :group 'biome) +(defcustom biome-grid-highlight-current t + "Highlight current hour or day. + +This requires time formatted as iso8601." + :type 'boolean + :group 'boolean) + +(defface biome-grid-highlight-current-face + '((t :inherit highlight)) + "Highlight current hour or day." + :group 'biome) + (defun biome-grid--format-units (format) "Add derived units to FORMAT. @@ -646,6 +658,31 @@ transient switches)." keymap) "Keymap for `biome-grid-mode'.") +(defun biome-grid--maybe-highlight-current () + "Highlight current hour or day (if hour is not found)." + (when biome-grid-highlight-current + (save-excursion + (goto-char (point-min)) + (let ((needle-datetime + (substring + (format-time-string biome-grid-datetime-format (current-time)) + ;; Remove seconds + 0 -3)) + (needle-date + (format-time-string biome-grid-date-format (current-time))) + start end) + (if (search-forward needle-datetime nil t) + (setq start (line-beginning-position) + end (line-end-position)) + (goto-char (point-min)) + (when (search-forward needle-date nil t) + (setq start (line-beginning-position) + end (line-end-position)))) + (when (and start end) + (let ((ov (make-overlay start end))) + (overlay-put ov 'priority -49) + (overlay-put ov 'face 'biome-grid-highlight-current-face))))))) + (define-derived-mode biome-grid-mode tabulated-list-mode "Biome Grid" "Major mode for displaying biome results. @@ -668,6 +705,7 @@ displaying more columns than the window width, so there's (tabulated-list-print t) (tabulated-list-init-header) (toggle-truncate-lines 1) + (biome-grid--maybe-highlight-current) (run-mode-hooks 'biome-grid-mode-hook)) (switch-to-buffer buf))) From fb1ebdb02cfbc5eafb54ca9f8f087f957b971957 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Tue, 12 Mar 2024 00:16:23 +0300 Subject: [PATCH 4/4] readme: add some notes --- README.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.org b/README.org index c399a4a..aaa47a2 100644 --- a/README.org +++ b/README.org @@ -65,6 +65,8 @@ To save a query for later, press =P= in the root of the query interface. This wi Add this somewhere in your config after the package is loaded, e.g., in the =:config= section of the =use-package= form or wrapped in [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Hooks-for-Loading.html#index-with_002deval_002dafter_002dload][with-eval-after-load]]. Running =M-x biome-query-preset-177= will create a query interface with this preset. +Alternatively, use the =add-to-list= form (generated below the =biome-def-preset= form). Presets added that way will show up in =M-x biome-presets= or "Presets" in =M-x biome=. + Table formatting can be configured with =biome-grid-format=; check the docstring for more information. For instance, if you want to disable all gradients: #+begin_src emacs-lisp (setq biome-grid-format (seq-filter (lambda (f) (not (eq (car-safe (nth 2 f)) @@ -72,6 +74,11 @@ Table formatting can be configured with =biome-grid-format=; check the docstring biome-grid-format)) #+end_src +Turn off highlighting of the current hour or day as follows: +#+begin_src emacs-lisp +(setq biome-grid-highlight-current nil) +#+end_src + * Composite queries The package also allows executing multiple queries at once to join their results. This can be useful for comparing weather in different locations or for viewing different reports about the same location.