branch: externals/hyperbole commit 72d17af6e81c30dddf42dfaa5f9a21f228701f16 Merge: ffd2dcbb85 3940e00d12 Author: Bob Weiner <r...@gnu.org> Commit: Bob Weiner <r...@gnu.org>
Merge branch 'rsw' into HEAD --- ChangeLog | 99 ++++++++++++++++++++++++++++++++++++- DEMO | 2 - FAST-DEMO | 1 - HY-COPY | 2 +- HY-NEWS | 2 - Makefile | 22 +++++---- hargs.el | 10 ++-- hmouse-drv.el | 8 +-- hmouse-tag.el | 4 +- hpath.el | 4 +- hsys-flymake.el | 28 +++++------ hsys-org.el | 81 +++++++++++++++++++++++++++--- hsys-xref.el | 4 +- hui-mouse.el | 32 +++++++++--- hui.el | 12 +++-- hypb.el | 38 ++++++++++++--- hyperbole.el | 14 ++++-- hyrolo.el | 114 ++++++++++++++++++++++++++----------------- test/demo-tests.el | 1 - test/hui-tests.el | 5 +- test/hy-test-dependencies.el | 23 +++++++-- test/hy-test-helpers.el | 4 +- test/hyrolo-tests.el | 7 ++- 23 files changed, 386 insertions(+), 131 deletions(-) diff --git a/ChangeLog b/ChangeLog index b22591cf36..35b0fe694f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,7 +9,104 @@ (ebut-delete-removes-ebut-in-message-mode-buffer): Add tests for non-file buffer and non-file in message-mode buffer. -2024-01-09 Bob Weiner <r...@gnu.org> +2024-01-13 Bob Weiner <r...@gnu.org> + +* test/hy-test-dependencies.el: Print status of resolving any + multi-version/mixed Org installations. + +* hyrolo.el (hyrolo-any-file-type-problem-p): Disable printing + output if 'hyrolo-boolean-only-flag' is non-nil, used in + testing. + test/hyrolo-tests.el (hyrolo-tests--get-file-list-wrong-suffix): + Use above flag. + +* Makefile (test-ert): Do not ellide any stack traces, i.e. set + 'ert-batch-print-length' to nil. + Change test SELECTOR= to test= and document how to run. + +* hyrolo.el (hyrolo-any-file-type-problem-p): Disable printing of + any output when 'hyrolo-boolean-only-flag' is non-nil, typically + used for testing purposes. + +* hui.el (hui:ebut-unmark): Fix to handle a non-file-based buffer as + 'key-src'. + +* hsys-org.el (hsys-org-fix-version): Add. Add .org suffix to + 'auto-mode-alist' as it may be removed in this function. Return + t when Org is reloaded, nil if not. Require Org libraries even + when no reload is done. Handle when 'org-version' differs from + version number in 'org-dir'. + hyperbole.el (hyperb:init): Add call to 'hsys-org-fix-version' when + detect a mixed version installation of Org, typically part of + built-in Org loaded before loading a newer packaged version. + +* hargs.el (hargs:at-p): Fix 'no-default' arg handling to not select + non-existent dirs and files when no-default is true. + +* hsys-xref.el (hsys-xref-definitions): Fix to pass symbol, not string to + 'ert-test-boundp'. + +* hmouse-drv.el (hkey-help-show): Rename local var from 'org-help' to + 'hkey-org-help' to eliminate any confusion that this is an Org variable. + +* hyrolo.el (hyrolo-any-file-type-problem-p): Print error buffer to stdout + when run noninteractively (batch mode). + +* hyrolo.el (hyrolo-org-mode): Conditionalize org-fold usage as it is only + available in newer Org versions. Add missing forward declarations. + +* hyrolo.el (hyrolo-org-mode): Add newer Org 9.7-pre hide/show support. + test/hyrolo-tests.el (hyrolo-tests--outline-hide-show-heading, + hyrolo-tests--outline-show-when-moving-out-of-hidden-line): + The above change fixes these tests, so they have been re-enabled. + +* hmouse-tag.el (smart-lisp-identifier-chars): Add @ char as advised + functions use the orig-function@advice-wrapper-name to refer to the + advice. + +* hpath.el (hpath:variables): Move 'load-path' and 'exec-path' before + 'Info-directory-list' as they should be higher priority matches. + Remove old 'Info-directory'. + +2024-01-12 Bob Weiner <r...@gnu.org> + +* hypb.el (hypb:display-file-with-logo): Expand any folded headings + in the file. + + Improve use in tests by doing the following when in batch mode + (noninteractive): Kill off any non-modified buffer showing the file + to display before freshly reading it. + +2024-01-10 Bob Weiner <r...@gnu.org> + +* hui-mouse.el (hkey-alist): Move 'smart-eolp' to immediately before + 'smart-org' clause. + hsys-org.el (hsys-org-cycle-bob-file-list): Add to list files auto + set to 'org-mode' with minor 'view-mode' that allow org global + cycling of headings with {TAB} when at the beginning of buffer and + not on a heading. + hyrolo.el (hyrolo-verify): Allow buffers associated with files from + 'hsys-org-cycle-bob-file-list' as well. + hui-mouse.el (smart-org-bob-and-non-heading-p): Check whether {TAB} or + {M-RET} should org-global-cycle at point." + (smart-eolp): Allow for org global cycling at start of + buffer on a non-heading line in Hyperbole doc files when displayed from + Hyperbole menu items. + hypb.el (hypb:insert-hyperbole-banner): Update so Hyperbole logo link + does not include the first blank line, allowing for a different + action on {RET} there. + +* hyrolo.el (hyrolo-verify): Remove mentions of HyNote (not in this release). + +* hypb.el (hypb:display-file-with-logo): Remove call (skip-syntax-forward "-") + so point stays at the beginning of buffer for Org global display cycling. + Replace 'id-browse-file' and 'view-mode' with 'hyrolo-mode'. + +* hsys-flymake.el (repeat-mode): Add missing (require 'repeat) since + 'repeat-mode' function used herein is not autoloaded. + (flymake-mode-hook): Check whether `repeat-mode' is + fboundp or not before trying to enable it (should be autoloaded when + it exists, probably in Emacs 28 or greater). * hsys-xref.el: Add forgotten file. diff --git a/DEMO b/DEMO index dea93b59ec..48df6e4b27 100644 --- a/DEMO +++ b/DEMO @@ -1,5 +1,3 @@ --*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*- - * GNU Hyperbole Full Demo/Tutorial by Bob Weiner Send an email or a testimonial if you like Hyperbole to <r...@gnu.org>. diff --git a/FAST-DEMO b/FAST-DEMO index 8c0c6982ac..1e032c4fff 100644 --- a/FAST-DEMO +++ b/FAST-DEMO @@ -1,4 +1,3 @@ --*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*- * GNU Hyperbole Fast Demo by Bob Weiner diff --git a/HY-COPY b/HY-COPY index a9335e0425..abd302f665 100644 --- a/HY-COPY +++ b/HY-COPY @@ -4,7 +4,7 @@ The following copyright applies to the GNU Hyperbole software. -Copyright (C) 1989-2022 Free Software Foundation, Inc. +Copyright (C) 1989-2024 Free Software Foundation, Inc. Originally developed with support from Motorola Inc., who donated all such work to the Free Software Foundation, Inc. in the 1990s. diff --git a/HY-NEWS b/HY-NEWS index 5ea5c7929c..bc544534d9 100644 --- a/HY-NEWS +++ b/HY-NEWS @@ -1,5 +1,3 @@ --*- Mode: org; org-cycle-global-at-bob: t; hsys-org-enable-smart-keys: t -*- - * What's New in GNU Hyperbole by Bob Weiner diff --git a/Makefile b/Makefile index e58eae5ad5..5fc7426c91 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # Author: Bob Weiner # # Orig-Date: 15-Jun-94 at 03:42:38 -# Last-Mod: 7-Jan-24 at 14:27:34 by Bob Weiner +# Last-Mod: 13-Jan-24 at 19:12:58 by Bob Weiner # # Copyright (C) 1994-2023 Free Software Foundation, Inc. # See the file HY-COPY for license information. @@ -70,8 +70,9 @@ # * Developer targets # # To run unit tests: -# make test - run not interactive tests in batch mode -# make test-all - run all tests starting an Emacs in windowed mode +# make test - run non-interactive tests in batch mode +# make test-all - run all tests starting an interactive Emacs +# make test test=<test-name> - run a single test or tests matching the name # # Verify hyperbole installation using different sources: # make install-<source> @@ -459,7 +460,7 @@ packageclean: cd $(pkg_hyperbole)/man/im && $(RM) -r .DS_Store core .place* ._* .*~ *~ \ *.ps *\# *- *.orig *.rej .nfs* CVS .cvsignore; fi -# Ert test +# ERT test .PHONY: tests test test-ert all-tests test-all tests: test test: test-ert @@ -469,10 +470,10 @@ test: test-ert LET_VARIABLES = (auto-save-default) (enable-local-variables :all) LOAD_TEST_ERT_FILES=$(patsubst %,(load-file \"%\"),${TEST_ERT_FILES}) -# Run make test SELECTOR=<ert-test-selector> to limit batch test to +# Run make test test=<ert-test-selector> to limit batch test to # tests specified by the selector. See "(ert)test selectors" -ifeq ($(origin SELECTOR), command line) -HYPB_ERT_BATCH = (ert-run-tests-batch-and-exit \"${SELECTOR}\") +ifeq ($(origin test), command line) +HYPB_ERT_BATCH = (ert-run-tests-batch-and-exit \"${test}\") else HYPB_ERT_BATCH = (ert-run-tests-batch-and-exit) endif @@ -487,9 +488,10 @@ endif test-ert: @echo "# Tests: $(TEST_ERT_FILES)" $(EMACS_BATCH) --eval "(load-file \"test/hy-test-dependencies.el\")" \ - --eval "(let ((auto-save-default) (ert-batch-print-level 10) (ert-batch-print-length 20) \ - $(HYPB_ERT_BATCH_BT) (ert-batch-backtrace-right-margin 2048)) \ - $(LOAD_TEST_ERT_FILES) $(HYPB_ERT_BATCH))" + --eval "(let ((auto-save-default) (ert-batch-print-level 10) \ + (ert-batch-print-length nil) (backtrace-line-length 5000) \ + $(HYPB_ERT_BATCH_BT) (ert-batch-backtrace-right-margin 2048)) \ + $(LOAD_TEST_ERT_FILES) $(HYPB_ERT_BATCH))" all-tests: test-all test-all: diff --git a/hargs.el b/hargs.el index fb58c616a3..355a01007b 100644 --- a/hargs.el +++ b/hargs.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 31-Oct-91 at 23:17:35 -;; Last-Mod: 1-Dec-23 at 11:23:52 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 16:09:00 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -658,9 +658,9 @@ Handles all of the interactive argument types that `hargs:iform-read' does." ((hpath:at-p 'file)) ;; Unquoted remote file name. ((hpath:is-p (hpath:remote-at-p) 'file)) - ;; Possibly non-existent file name - ((when no-default (hpath:at-p 'file 'non-exist))) (no-default nil) + ;; Possibly non-existent file name + ((hpath:at-p 'file 'non-exist)) ((buffer-file-name)))) ((eq hargs:reading-type 'directory) (cond ((derived-mode-p 'dired-mode) @@ -672,9 +672,9 @@ Handles all of the interactive argument types that `hargs:iform-read' does." ((hpath:at-p 'directory)) ;; Unquoted remote directory name. ((hpath:is-p (hpath:remote-at-p) 'directory)) - ;; Possibly non-existent directory name - ((when no-default (hpath:at-p 'directory 'non-exist))) (no-default nil) + ;; Possibly non-existent directory name + ((hpath:at-p 'directory 'non-exist)) (default-directory))) ((eq hargs:reading-type 'string) (or (hargs:delimited "\"" "\"") (hargs:delimited "'" "'") diff --git a/hmouse-drv.el b/hmouse-drv.el index fa7f3822f4..fb40cad7ef 100644 --- a/hmouse-drv.el +++ b/hmouse-drv.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 04-Feb-90 -;; Last-Mod: 3-Jan-24 at 02:24:39 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 15:32:40 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -1240,7 +1240,7 @@ the current window. By default, it is displayed according to the setting of `hpath:display-where'." (if (bufferp buffer) (setq buffer (buffer-name buffer))) (if (null buffer) (setq buffer (buffer-name (current-buffer)))) - (let ((org-help (and (stringp buffer) (string-match "\\`\\*Org Help\\*" buffer))) + (let ((hkey-org-help (and (stringp buffer) (string-match "\\`\\*Org Help\\*" buffer))) (owind (selected-window))) (and (stringp buffer) (string-match "^\\*Help\\|Help\\*$" buffer) @@ -1262,7 +1262,7 @@ the current window. By default, it is displayed according to the setting of (selected-window)) (t (hpath:display-buffer buf))))) ;; Ignore org-mode's temp help buffers which it handles on its own. - (when (and wind (not org-help)) + (when (and wind (not hkey-org-help)) (setq minibuffer-scroll-window wind) ;; Don't use help-mode in buffers already set up with a ;; quit-key to bury the buffer, e.g. minibuffer completions, @@ -1275,7 +1275,7 @@ the current window. By default, it is displayed according to the setting of (when (derived-mode-p 'help-mode) (local-set-key "q" #'hkey-help-hide))))) ;; If in an *Org Help* buffer, reselect the Org buffer. - (when org-help + (when hkey-org-help (select-window owind)) ;; If in a *Completions* buffer, re-select the window that ;; generated the completions. diff --git a/hmouse-tag.el b/hmouse-tag.el index ae64e23b86..29bf64d525 100644 --- a/hmouse-tag.el +++ b/hmouse-tag.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 24-Aug-91 -;; Last-Mod: 7-Jan-24 at 14:34:32 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 01:29:42 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -598,7 +598,7 @@ in the current directory or any of its ancestor directories." "Regexp matching the first character of a Lisp identifier.") ;;;###autoload -(defconst smart-lisp-identifier-chars "-_:/*+=%$&?!<>a-zA-Z0-9~^" +(defconst smart-lisp-identifier-chars "-_:/*+=%$&?!<>a-zA-Z0-9~^@" "Regexp matching a valid char in a Lisp identifier except the first char. Excludes character matching square brackets, so may be used with skip-characters-forward/backward.") diff --git a/hpath.el b/hpath.el index 0ed3599ea3..4ee5a5793d 100644 --- a/hpath.el +++ b/hpath.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 1-Nov-91 at 00:44:23 -;; Last-Mod: 26-Dec-23 at 22:42:39 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 00:57:41 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -546,7 +546,7 @@ Used only if the function `image-mode' is defined." ;; link is later resolved. ;; (defcustom hpath:variables - '(hyperb:dir Info-directory Info-directory-list sm-directory load-path exec-path) + '(hyperb:dir load-path exec-path Info-directory-list sm-directory) "*List of Emacs Lisp variable symbols to substitute within matching link paths. Each variable value, if bound, must be either a pathname or a list of pathnames. When embedded within a path, the format is ${variable}." diff --git a/hsys-flymake.el b/hsys-flymake.el index 10d167972f..4873af3b7d 100644 --- a/hsys-flymake.el +++ b/hsys-flymake.el @@ -3,16 +3,14 @@ ;; Keywords: tools ;; ;; Author: Bob Weiner -;; Org: RWorks -;; E-mail: r...@gnu.org ;; ;; Orig-Date: 31-Dec-23 at 13:54:08 -;; Last-Mod: 4-Jan-24 at 22:51:11 by Bob Weiner +;; Last-Mod: 9-Jan-24 at 21:29:43 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; ;; Copyright (C) 2023-2024 Free Software Foundation, Inc. -;; Licensed under the GNU General Public License, version 3. +;; See the "HY-COPY" file for license information. ;; ;; This file is part of GNU Hyperbole. ;; @@ -59,11 +57,11 @@ ;; ;;; Code: -;; Don't require `flymake-mode' or `repeat-mode' here. Instead we -;; leave it to each function to check whether `flymake-mode' is -;; enabled and active in the current buffer. This way, if the user -;; never uses `flymake-mode' that library is never loaded and the -;; Smart Key context from `hkey-alist' in "hui-mouse.el" that invokes +;; Don't require `flymake-mode' or `repeat' here. Instead we leave +;; it to each function to check whether `flymake-mode' is enabled +;; and active in the current buffer. This way, if the user never +;; uses `flymake-mode' that library is never loaded and the Smart +;; Key context from `hkey-alist' in "hui-mouse.el" that invokes ;; functions from herein, never triggers. (require 'hbut) @@ -141,7 +139,7 @@ Issue is inserted into the buffer after the current visible line." ;; flymake-mode does not bind any keys; it has only menu bindings. ;; Add key bindings for use in the source buffer on the C-c C-l prefix. -;; Each time these keys are changed, need to disable repeat-mode and +;; Each time these keys are changed, need to disable `repeat-mode' and ;; then re-enable it to read the updated key bindings. (defvar hsys-flymake-mode-control-l-prefix-map (let ((map (make-sparse-keymap))) @@ -155,9 +153,9 @@ Issue is inserted into the buffer after the current visible line." (define-key map "w" 'hsys-flymake-toggle-wraparound) map)) -;; Use repeat-mode for appropriate flymake commands so can repeat them -;; with their last keystroke, e.g. repeat {C-c C-l n} by pressing {n} -;; repeatedly. +;; Use `repeat-map' property for appropriate flymake commands so can +;; repeat them with their last keystroke, e.g. repeat {C-c C-l n} by +;; pressing {n} repeatedly. (defvar hsys-flymake-repeat-map (let ((map (make-sparse-keymap))) (mapc (lambda (cmd) @@ -181,7 +179,9 @@ Issue is inserted into the buffer after the current visible line." (lambda () (when flymake-mode (define-key flymake-mode-map "\C-c" hsys-flymake-mode-control-c-prefix-map) - (repeat-mode 1)))) + ;; probably Emacs 28 or greater + (when (fboundp 'repeat-mode) + (repeat-mode 1))))) ;; If flymake-mode is already enabled, re-enable it to ensure ;; repeat-mode gets enabled. (when (and (featurep 'flymake) flymake-mode) diff --git a/hsys-org.el b/hsys-org.el index 2d7bf681bb..910b0682d9 100644 --- a/hsys-org.el +++ b/hsys-org.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 2-Jul-16 at 14:54:14 -;; Last-Mod: 26-Dec-23 at 12:05:46 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 19:50:40 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -68,12 +68,12 @@ ;;;###autoload (defcustom hsys-org-enable-smart-keys 'unset "This applies in Org major/minor modes only when `hyperbole-mode' is active. -If set to \\='unset prior to loading Hyperbole, then Hyperbole -initialization will set its value. +If set to \\='unset prior to loading Hyperbole, then Hyperbole initialization +will set its value. -The following table shows what the Smart Keys do in various contexts -with different settings of this option. For example, a nil value makes -{M-RET} operate as it normally does within Org mode contexts. +The following table shows what the Smart Keys do in various contexts with +different settings of this option. For example, a nil value makes {M-RET} +operate as it normally does within Org mode contexts. |---------+-------------------+------------------+----------+------------------| | Setting | Smart Key Context | Hyperbole Button | Org Link | Fallback Command | @@ -100,6 +100,13 @@ with different settings of this option. For example, a nil value makes ;;; Public Action Types ;;; ************************************************************************ +(defcustom hsys-org-cycle-bob-file-list + '("${hyperb:dir}/DEMO" "${hyperb:dir}/FAST-DEMO" "${hyperb:dir}/MANIFEST" + "${hyperb:dir}/HY-ABOUT" "${hyperb:dir}/HY-NEWS") + "List of files to globally `org-cycle' when at the beginning of the buffer." + :type '(repeat file) + :group 'hyperbole) + (defact org-link (&optional link) "Follow an optional Org mode LINK to its target. If LINK is nil, follow any link at point. Otherwise, trigger an error." @@ -145,6 +152,68 @@ an error." ;;; Public functions ;;; ************************************************************************ +;;;###autoload +(defun hsys-org-fix-version () + "If multiple Org versions are loaded, use the one first on `load-path'. +Always ensure Org libraries have been required. +Return t if Org is reloaded, else nil." + ;; Not all versions of org include this variable, so set it + (setq org--inhibit-version-check nil + org-list-allow-alphabetical nil) + (let ((org-dir (ignore-errors (org-find-library-dir "org"))) + (org-install-dir + (ignore-errors (org-find-library-dir "org-loaddefs"))) + org-dir-version) + (cond ((and org-dir org-install-dir (string-equal org-dir org-install-dir) + ;; Still may have a situation where the Org version matches the + ;; builtin Org but the directories are for a newer Org + ;; package version. + (if (string-match "[\\/]org-\\([0-9.]+-?[a-z]*\\)" org-dir) + (string-equal (setq org-dir-version (match-string 1 org-dir)) + (remove ?- (org-release))) + t)) + ;; Just require these libraries used for testing to ensure + ;; they are loaded from the single Org version used. + (mapc (lambda (lib-sym) (require lib-sym nil t)) + '(org-version org-keys org-compat ol org-table org-macs org-id + org-element org-list org-element org-src org-fold org)) + nil) + (t + ;; Ensure using any local available packaged version of Org mode + ;; rather than built-in which may have been activated before + ;; load-path was set correctly. Avoids mixed version load of Org. + (mapc (lambda (lib-sym) (when (featurep lib-sym) (unload-feature lib-sym t))) + '(org org-version org-keys org-compat ol org-table org-macs org-id + org-element org-list org-element org-src org-fold)) + (package-initialize) + (let ((pkg-desc (car (cdr (assq 'org package-archive-contents))))) + (package-activate pkg-desc t)) + ;; Otherwise, `font-lock-ensure' make invoke an undefined matcher + ;; function, `org-fontify-inline-src-blocks'. + (load "org-src") + ;; Otherwise, `org-id-get-create' may call undefined + ;; `org-element-cache-active-p' + (load "org-element") + ;; Otherwise, {M-RET} may not be bound to a key + (load "org-keys") + ;; Otherwise, `org-file-name-concat' may be undefined + (load "org-compat") + ;; Otherwise, `org--inhibit-version-check' may be undefined + (load "org-macs") + ;; Otherwise, `org-list-allow-alphabetical' may be undefined + (load "org-list") + ;; Otherwise, `org-fold--advice-edit-commands' may be undefined + (load "org-fold") + ;; Otherwise, `org-link--description-folding-spec' may be undefined + (load "ol") + (cl-flet ((require (lambda (lib-sym &optional _filename _noerror) + (load (symbol-name lib-sym))))) + (require 'org)) + ;; Next setting may have been deleted with the library + ;; unloading, so restore it. + (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) + t)))) + ;;;###autoload (defun hsys-org-meta-return-shared-p () "Return non-nil if hyperbole-mode is active and shares the org-meta-return key." diff --git a/hsys-xref.el b/hsys-xref.el index 13b441e6af..e02fff0609 100644 --- a/hsys-xref.el +++ b/hsys-xref.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 24-Aug-91 -;; Last-Mod: 9-Jan-24 at 12:07:34 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 15:55:13 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -31,7 +31,7 @@ (let* ((elisp-flag (smart-emacs-lisp-mode-p)) (xref-backend (or (and elisp-flag (fboundp 'ert-test-boundp) - (ert-test-boundp identifier) + (ert-test-boundp (intern-soft identifier)) (boundp 'xref-etags-mode) 'etags) (xref-find-backend))) diff --git a/hui-mouse.el b/hui-mouse.el index 3c9affdb67..b1ffa16509 100644 --- a/hui-mouse.el +++ b/hui-mouse.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 04-Feb-89 -;; Last-Mod: 4-Jan-24 at 22:51:41 by Bob Weiner +;; Last-Mod: 10-Jan-24 at 21:26:33 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -40,7 +40,10 @@ ;;; ************************************************************************ (require 'ert-results nil t) ;; Action Key support in ERT result buffers -(require 'hsys-flymake) +;; Library in next line (for code optionally used in `smart-eol') uses +;; `repeat-map' which was not added to the "repeat.el" library in Emacs 27.1, +;; so don't use if it fails to load properly. +(ignore-errors (require 'hsys-flymake)) (require 'hload-path) (require 'hsys-org) (require 'hbut) @@ -292,6 +295,10 @@ Its default value is `smart-scroll-down'. To disable it, set it to (smart-helm-alive-p))) . ((funcall (key-binding (kbd "RET"))) . (funcall (key-binding (kbd "RET"))))) ;; + ;; If at the end of a line (eol), invoke the associated Smart Key handler EOL handler. + ((smart-eolp) + . ((funcall action-key-eol-function) . (funcall assist-key-eol-function))) + ;; ;; Handle any Org mode-specific contexts but give priority to Hyperbole ;; buttons prior to cycling Org headlines ((and (not (hyperb:stack-frame '(smart-org))) @@ -312,10 +319,6 @@ Its default value is `smart-scroll-down'. To disable it, set it to ((and (fboundp 'xref--item-at-point) (xref--item-at-point)) . ((xref-goto-xref) . (xref-show-location-at-point))) ;; - ;; If at the end of a line (eol), invoke the associated Smart Key handler EOL handler. - ((smart-eolp) - . ((funcall action-key-eol-function) . (funcall assist-key-eol-function))) - ;; ;; The Smart Menu system is an attractive in-buffer menu system ;; that works on any display system that supports Emacs. It ;; predates Emacs' menu systems; it is a part of InfoDock. @@ -1918,6 +1921,15 @@ handled by the separate implicit button type, `org-link-outside-org-mode'." ;; contexts nil))))) +(defun smart-org-bob-and-non-heading-p () + "Check whether {TAB} should globally `org-cycle' at point." + (and (bobp) + buffer-file-name + (derived-mode-p 'org-mode) + (not (org-at-heading-p)) + (member buffer-file-name + (hpath:expand-list hsys-org-cycle-bob-file-list)))) + ;;; ************************************************************************ ;;; smart-outline functions ;;; ************************************************************************ @@ -2090,12 +2102,16 @@ If key is pressed: "Return t if point is at the end of a visible line but not the end of the buffer." ;; smart-helm handles eol for helm buffers (unless (or (and (smart-helm-alive-p) (equal (helm-buffer-get) (buffer-name))) + ;; Allow for org global cycling at start of buffer on a + ;; non-heading line in Hyperbole doc files when + ;; displayed from Hyperbole menu items. + (smart-org-bob-and-non-heading-p) + ;; If there is a flymake diagnostic issue at eol, + ;; drop through this clause to handle it later. (and (featurep 'hsys-flymake) (boundp 'flymake-mode) flymake-mode (eolp) - ;; If there is a flymake diagnostic issue at eol, - ;; drop through this clause to handle it later. (hsys-flymake-get-issue-at-position))) (if (eq major-mode 'kotl-mode) (and (not (kotl-mode:eobp)) (kotl-mode:eolp t)) diff --git a/hui.el b/hui.el index a2d7db4bd5..3d64713b7a 100644 --- a/hui.el +++ b/hui.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 19-Sep-91 at 21:42:03 -;; Last-Mod: 3-Jan-24 at 23:42:18 by Mats Lidell +;; Last-Mod: 13-Jan-24 at 18:55:34 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -1522,10 +1522,12 @@ With a prefix argument, also delete the button text between the delimiters." (when (search-forward ebut:label-end nil t) (funcall form))) ;; Non-interactive invocation. (let (cur-flag) - (if (and (or (null key-src) (eq key-src buffer-file-name)) - (or (null directory) (eq directory default-directory))) - (setq cur-flag t) - (set-buffer (find-file-noselect (expand-file-name key-src directory)))) + (cond ((and (or (null key-src) (eq key-src buffer-file-name)) + (or (null directory) (eq directory default-directory))) + (setq cur-flag t)) + ((bufferp key-src) + (set-buffer key-src)) + (t (set-buffer (find-file-noselect (expand-file-name key-src directory))))) (unless (stringp but-key) (setq but-key (hbut:label-p)) (unless (stringp but-key) diff --git a/hypb.el b/hypb.el index 538107e289..4cd751a9ad 100644 --- a/hypb.el +++ b/hypb.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 6-Oct-91 at 03:42:38 -;; Last-Mod: 3-Jan-24 at 23:44:37 by Mats Lidell +;; Last-Mod: 12-Jan-24 at 08:20:56 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -1091,17 +1091,43 @@ If FILE is not an absolute path, expand it relative to `hyperb:dir'." (error "(hypb:display-file-with-logo): 'file' must be a string, not '%s'" file)) (unless (file-name-absolute-p file) (setq file (expand-file-name file hyperb:dir))) - (let ((existing-buf (when (stringp file) (get-file-buffer file)))) - ;; A stub for this function is defined in hversion.el when not running in InfoDock. - (id-browse-file file) + (let ((existing-buf (when (stringp file) (get-file-buffer file))) + (hsys-org-enable-smart-keys hsys-org-enable-smart-keys)) + + ;; Ensure Smart Keys do not defer to Org mode when running tests noninteractively + (when noninteractive + (setq sys-org-enable-smart-keys t)) + + (when (and existing-buf noninteractive) + ;; Likely are running tests when running non-interactively, so + ;; kill existing buffer, so each test run starts from scratch + ;; and is consistent. Trigger an error if buffer has been + ;; modified. + (when (buffer-modified-p existing-buf) + (error "(hypb:display-file-with-logo): Attempt to kill modified buffer: %s" existing-buf)) + (when (kill-buffer existing-buf) + (setq existing-buf nil))) + + ;; A stub for the `id-browse-file' function is defined in + ;; "hversion.el" when not running in InfoDock. + (if (eq (symbol-function #'id-browse-file) #'view-file) + (find-file file) + ;; Running under InfoDock + (id-browse-file file)) + (unless existing-buf (let ((buffer-read-only)) (hypb:insert-hyperbole-banner)) (goto-char (point-min)) - (skip-syntax-forward "-") (set-window-start (selected-window) 1) (set-buffer-modified-p nil) + (org-mode) + (setq-local org-cycle-global-at-bob t) (view-mode) + ;; Ensure no initial folding of the buffer, possibly from a hook + (if (fboundp 'org-fold-show-all) + (org-fold-show-all) + (org-show-all)) ;; On some versions of Emacs like Emacs28, need a slight delay ;; for file loading before searches will work properly. ;; Otherwise, "test/demo-tests.el" may fail. @@ -1146,7 +1172,7 @@ Without file, the banner is prepended to the current buffer." (insert "\n") (insert-image hyperbole-banner) (insert "\n") - (setq button (make-button (- (point) 3) (- (point) 2) :type 'hyperbole-banner)) + (setq button (make-button (- (point) 2) (- (point) 1) :type 'hyperbole-banner)) (button-put button 'help-echo (concat "Click to visit " hypb:home-page)) (button-put button 'action #'hypb:browse-home-page) (button-put button 'face 'default) diff --git a/hyperbole.el b/hyperbole.el index 6e7e7f8dc1..ee11cbf1bf 100644 --- a/hyperbole.el +++ b/hyperbole.el @@ -8,7 +8,7 @@ ;; Maintainer: Mats Lidell <ma...@gnu.org> ;; Maintainers: Robert Weiner <r...@gnu.org>, Mats Lidell <ma...@gnu.org> ;; Created: 06-Oct-92 at 11:52:51 -;; Last-Mod: 3-Jan-24 at 02:27:05 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 16:28:45 by Bob Weiner ;; Released: 03-Dec-23 ;; Version: 9.0.0 ;; Keywords: comm, convenience, files, frames, hypermedia, languages, mail, matching, mouse, multimedia, outlines, tools, wp @@ -496,6 +496,13 @@ frame, those functions by default still return the prior frame." 'buttons t))) ;; + ;; This next function call must be run before any tests involving Org + ;; in case the user has installed a new version of Org but Emacs has + ;; loaded parts of Org before his load path is finalized. It loads + ;; the newer version of Org, if any, assuming `load-path' is configured + ;; correctly. + (hsys-org-fix-version) + ;; ;; When vertico-mode is used, vertico-mouse-mode is needed for the ;; Action Key to properly select completions from the candidate ;; list, so force its usage when vertico-mode is invoked. @@ -505,9 +512,10 @@ frame, those functions by default still return the prior frame." ;; ;; Hyperbole initialization is complete. (message "Initializing Hyperbole...done")) + -;; This call loads the rest of the Hyperbole system. -(require 'hinit) + ;; This call loads the rest of the Hyperbole system. + (require 'hinit) (defun hyperbole--enable-mode () "Enable Hyperbole global minor mode." diff --git a/hyrolo.el b/hyrolo.el index b400dc575b..a199de2a88 100644 --- a/hyrolo.el +++ b/hyrolo.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 7-Jun-89 at 22:08:29 -;; Last-Mod: 6-Jan-24 at 10:02:10 by Mats Lidell +;; Last-Mod: 13-Jan-24 at 20:04:26 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -28,10 +28,11 @@ ;;; Other required Elisp libraries ;;; ************************************************************************ -(require 'custom) ;; For 'defface'. +(require 'custom) ;; For `defface' (require 'hversion) (require 'hmail) -(require 'hypb) ;; For 'hypb:mail-address-regexp'. +(require 'hsys-org) ;; For `hsys-org-cycle-bob-file-list' +(require 'hypb) ;; For `hypb:mail-address-regexp' (require 'outline) (require 'package) (require 'reveal) @@ -61,9 +62,12 @@ (defvar helm-org-rifle-show-level-stars) (defvar hproperty:but-emphasize-flag) (defvar markdown-regex-header) +(defvar org-fold-core-style) +(defvar org-link--link-folding-spec) (defvar org-roam-db-autosync-mode) (defvar org-roam-directory) (defvar plstore-cache-passphrase-for-symmetric-encryption) +(defvar reveal-auto-hide) (declare-function consult-grep "ext:consult") (declare-function consult-ripgrep "ext:consult") @@ -78,6 +82,8 @@ (declare-function helm-org-rifle-org-directory "ext:helm-org-rifle") (declare-function helm-org-rifle-show-full-contents "ext:helm-org-rifle") (declare-function kotl-mode:to-valid-position "kotl/kotl-mode") +(declare-function org-fold-initialize "org-fold") +(declare-function org-fold-core-set-folding-spec-property "org-fold") (declare-function org-roam-db-autosync-mode "ext:org-roam") (declare-function xml-node-child-string "ext:google-contacts") (declare-function xml-node-get-attribute-type "ext:google-contacts") @@ -1136,16 +1142,19 @@ matched entries." (hyrolo-show-levels 1)) (defun hyrolo-verify () - "Verify point is in a HyRolo or HyNote match buffer." - (when (not (member (buffer-name) (list hyrolo-display-buffer - (and (car (hyrolo-get-file-list)) - (file-name-nondirectory (car (hyrolo-get-file-list)))) - (when (boundp 'hynote-display-buffer) - hynote-display-buffer) - (when (boundp 'hynote-file-list) - (and (car hynote-file-list) - (file-name-nondirectory (car hynote-file-list))))))) - (error "(HyRolo): Use this command in HyRolo/HyNote match buffers or primary file buffers"))) + "Verify point is in a HyRolo match buffer." + (when (not (member (buffer-name) (nconc (list hyrolo-display-buffer + (and (car (hyrolo-get-file-list)) + (file-name-nondirectory (car (hyrolo-get-file-list))))) + (mapcar #'file-name-nondirectory + (hpath:expand-list hsys-org-cycle-bob-file-list)) + ;; (when (boundp 'hynote-display-buffer) + ;; hynote-display-buffer) + ;; (when (boundp 'hynote-file-list) + ;; (and (car hynote-file-list) + ;; (file-name-nondirectory (car hynote-file-list)))) + ))) + (error "(HyRolo): Use this command in HyRolo match buffers or primary file buffers"))) (defun hyrolo-widen () "Widen non-special HyRolo buffers mainly for adding entries or editing them." @@ -2015,7 +2024,7 @@ of the current heading, or to 1 if the current line is not a heading." "Move back to the start of current subtree and hide everything after the heading. If within a file header, hide the whole file after the end of the current line. -Necessary, since with reveal-mode active, outline-hide-subtree works +Necessary, since with reveal-mode active, `outline-hide-subtree' works only if on the heading line of the subtree." (interactive) (if (and (hyrolo-hdr-in-p) @@ -2411,37 +2420,41 @@ package is not installed." ;; 6. if not, display a buffer with the invalid file types and return t (when (or files-invalid-suffix-list files-no-mode-list) - (with-help-window "*HyRolo Errors*" - (princ "`hyrolo-file-list' gets its files from these patterns:\n") - (mapc (lambda (spec) (princ (format "\t%S\n" spec))) - hyrolo-file-list) - (terpri) - (princ "When expanded, it includes the following files that HyRolo cannot process:\n\n") - - (when files-invalid-suffix-list - (princ (format "Files with invalid or no suffixes:\n (valid suffixes: %S)\n" - hyrolo-file-suffix-regexp)) - (mapc (lambda (file) (princ (format "\t%S\n" file))) - files-invalid-suffix-list) + (unless (and (boundp 'hyrolo-boolean-only-flag) hyrolo-boolean-only-flag) + (with-help-window "*HyRolo Errors*" + (princ "`hyrolo-file-list' gets its files from these patterns:\n") + (mapc (lambda (spec) (princ (format "\t%S\n" spec))) + hyrolo-file-list) (terpri) - (princ "Please remove the above files from `hyrolo-file-list'.\n") - (terpri)) - - (when files-no-mode-list - (princ "Files with invalid modes (file suffixes not in `auto-mode-alist'):\n") - (mapc (lambda (file) (princ (format "\t%S\n" file))) - files-no-mode-list) - (terpri) - (princ "Please add appropriate entries for the above files to `auto-mode-alist'.\n") - (terpri)) - - (when (hyperb:stack-frame '(hyrolo-file-list-changed)) - ;; Errors occurred with a let of `hyrolo-file-list' so - ;; include backtrace of where this occurred. - (princ "Stack trace of where invalid files were referenced:\n") - (terpri) - ;; (setq backtrace-view (plist-put backtrace-view :show-locals t)) - (backtrace))) + (princ "When expanded, it includes the following files that HyRolo cannot process:\n\n") + + (when files-invalid-suffix-list + (princ (format "Files with invalid or no suffixes:\n (valid suffixes: %S)\n" + hyrolo-file-suffix-regexp)) + (mapc (lambda (file) (princ (format "\t%S\n" file))) + files-invalid-suffix-list) + (terpri) + (princ "Please remove the above files from `hyrolo-file-list'.\n") + (terpri)) + + (when files-no-mode-list + (princ "Files with invalid modes (file suffixes not in `auto-mode-alist'):\n") + (mapc (lambda (file) (princ (format "\t%S\n" file))) + files-no-mode-list) + (terpri) + (princ "Please add appropriate entries for the above files to `auto-mode-alist'.\n") + (terpri)) + + (when (hyperb:stack-frame '(hyrolo-file-list-changed)) + ;; Errors occurred with a let of `hyrolo-file-list' so + ;; include backtrace of where this occurred. + (princ "Stack trace of where invalid files were referenced:\n") + (terpri) + ;; (setq backtrace-view (plist-put backtrace-view :show-locals t)) + (backtrace)) + + (when noninteractive + (princ (buffer-string))))) t))) (defun hyrolo-buffer-exists-p (hyrolo-buf) @@ -2600,6 +2613,19 @@ Any non-nil value returned is a cons of (<entry-name> . <entry-source>)." ;; set its parent mode property to org-mode so can `derived-mode-p' ;; checks will pass. (put 'hyrolo-org-mode 'derived-mode-parent 'org-mode) + + (when (featurep 'org-fold) ;; newer Org versions + (when (and org-link-descriptive + (eq org-fold-core-style 'overlays)) + (add-to-invisibility-spec '(org-link))) + (org-fold-initialize (or (and (stringp org-ellipsis) (not (equal "" org-ellipsis)) org-ellipsis) + "...")) + (make-local-variable 'org-link-descriptive) + (when (eq org-fold-core-style 'overlays) (add-to-invisibility-spec '(org-hide-block . t))) + (if org-link-descriptive + (org-fold-core-set-folding-spec-property (car org-link--link-folding-spec) :visible nil) + (org-fold-core-set-folding-spec-property (car org-link--link-folding-spec) :visible t))) + (setq-local hyrolo-entry-regexp "^\\(\\*+\\)\\([ ]+\\)" hyrolo-hdr-and-entry-regexp (concat hyrolo-hdr-prefix-regexp hyrolo-entry-regexp) hyrolo-entry-group-number 1 diff --git a/test/demo-tests.el b/test/demo-tests.el index 0b1c328de8..8414396d6e 100644 --- a/test/demo-tests.el +++ b/test/demo-tests.el @@ -274,7 +274,6 @@ (should (not (org-check-for-hidden 'headlines))) (save-excursion (action-key)) -;;; (org-hide-entry) (should (org-check-for-hidden 'headlines))))) ;; Manifest diff --git a/test/hui-tests.el b/test/hui-tests.el index c059fc5fda..28e51208af 100644 --- a/test/hui-tests.el +++ b/test/hui-tests.el @@ -3,7 +3,7 @@ ;; Author: Mats Lidell <ma...@gnu.org> ;; ;; Orig-Date: 30-Jan-21 at 12:00:00 -;; Last-Mod: 30-Dec-23 at 00:00:18 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 16:30:08 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -935,11 +935,14 @@ With point on label suggest that ibut for rename." (ert-deftest hui--link-possible-types () "Verify right type is selected from referent buffer." + (hsys-org-fix-version) + ;; Org Roam or Org Id link-to-org-id (let ((file (make-temp-file "hypb" nil ".org"))) (unwind-protect (progn (find-file file) + (erase-buffer) (org-id-get-create nil) (re-search-forward ":ID:") (hy-test-helpers:ensure-link-possible-type 'link-to-org-id)) diff --git a/test/hy-test-dependencies.el b/test/hy-test-dependencies.el index ecf59675c7..7fc56087c5 100644 --- a/test/hy-test-dependencies.el +++ b/test/hy-test-dependencies.el @@ -3,11 +3,11 @@ ;; Author: Mats Lidell <ma...@gnu.org> ;; ;; Orig-Date: 20-Feb-21 at 23:16:00 -;; Last-Mod: 2-Oct-23 at 04:48:58 by Bob Weiner +;; Last-Mod: 13-Jan-24 at 20:08:39 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; -;; Copyright (C) 2021 Free Software Foundation, Inc. +;; Copyright (C) 2021-2024 Free Software Foundation, Inc. ;; See the "HY-COPY" file for license information. ;; ;; This file is part of GNU Hyperbole. @@ -18,12 +18,13 @@ ;;; Code: +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) +(package-initialize) + (require 'hload-path) +(require 'hyperbole) (add-to-list 'load-path (expand-file-name "test" hyperb:dir)) -(package-initialize) -(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) - (defun hy-test-ensure-package-installed (pkg-symbol) (unless (package-installed-p pkg-symbol) (package-refresh-contents) @@ -35,5 +36,17 @@ ;; Needed when `hypb:display-file-with-logo' uses `org-mode'. (setq hsys-org-enable-smart-keys t) +(require 'pp) +(terpri) +(print (format "org-directory = %S" (ignore-errors (org-find-library-dir "org")))) +(print (format "ord-load-dir = %S" (ignore-errors (org-find-library-dir "org-loaddefs")))) +(print (format "version = %S" (org-release))) +(terpri) + +(let ((org-reloaded (hsys-org-fix-version))) + (if org-reloaded + (message "Mixed Org versions fixed and reloaded; version is now %s" org-version) + (message "Correct, single version of Org is active %s" org-version))) + (provide 'hy-test-dependencies) ;;; hy-test-dependencies.el ends here diff --git a/test/hy-test-helpers.el b/test/hy-test-helpers.el index 80bd4814f3..1ac28dd1a4 100644 --- a/test/hy-test-helpers.el +++ b/test/hy-test-helpers.el @@ -3,7 +3,7 @@ ;; Author: Mats Lidell <ma...@gnu.org> ;; ;; Orig-Date: 30-Jan-21 at 12:00:00 -;; Last-Mod: 7-Jan-24 at 00:56:08 by Mats Lidell +;; Last-Mod: 13-Jan-24 at 16:21:45 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -19,7 +19,7 @@ ;;; Code: (require 'ert) -(require 'hmouse-drv) ;For `action-key'. +(require 'hmouse-drv) ; For `action-key' (eval-when-compile (require 'cl-lib)) (defun hy-test-helpers:consume-input-events () diff --git a/test/hyrolo-tests.el b/test/hyrolo-tests.el index e033a471da..4ede38fa42 100644 --- a/test/hyrolo-tests.el +++ b/test/hyrolo-tests.el @@ -3,7 +3,7 @@ ;; Author: Mats Lidell <ma...@gnu.org> ;; ;; Orig-Date: 19-Jun-21 at 22:42:00 -;; Last-Mod: 7-Jan-24 at 01:00:43 by Mats Lidell +;; Last-Mod: 13-Jan-24 at 20:05:16 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -464,7 +464,8 @@ Match a string in the second cell." (let ((tmp-file (make-temp-file "hypb" nil))) (unwind-protect (should-error - (let ((hyrolo-file-list (list tmp-file))) + (let* ((hyrolo-boolean-only-flag t) + (hyrolo-file-list (list tmp-file))) ())) (hy-delete-file-and-buffer tmp-file)))) @@ -773,7 +774,6 @@ Make cell start with HEADING and follow by next line BODY." (ert-deftest hyrolo-tests--outline-hide-show-heading () "Verify hiding and showing headings." - (skip-unless (version< org-version "9.6")) (let* ((org-file (make-temp-file "hypb" nil ".org" (hyrolo-tests--gen-outline ?* "heading" 1 "body" 2))) (hyrolo-file-list (list org-file))) @@ -815,7 +815,6 @@ Make cell start with HEADING and follow by next line BODY." (ert-deftest hyrolo-tests--outline-show-when-moving-out-of-hidden-line () "Verify region is shown after moving out of hidden area." - (skip-unless (version< org-version "9.6")) (let* ((org-file (make-temp-file "hypb" nil ".org" (hyrolo-tests--gen-outline ?* "heading" 1 "body" 2))) (hyrolo-file-list (list org-file)))