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. 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))) diff --git a/biome-multi.el b/biome-multi.el index b116ac8..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. @@ -113,12 +117,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) @@ -132,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 d82d11c..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) @@ -965,12 +969,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) @@ -1022,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 f0af0ca..c44a742 100644 --- a/biome.el +++ b/biome.el @@ -57,6 +57,26 @@ API." :type 'function :group 'biome) +(defcustom biome-presets-alist nil + "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") + (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 +137,29 @@ PARAMS as query." (setq biome-multi-query-current ',params) (call-interactively #'biome-multi))) +(defun biome-preset (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))) + (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 (copy-tree params)) + (biome-query--section-open (alist-get :name params))) + (:multi + (setq biome-multi-query-current (copy-tree params)) + (call-interactively #'biome-multi))))) + (provide 'biome) ;;; biome.el ends here