branch: externals/hyperbole
commit 339c6a2a8d093c85cf813a84e82c5741c738ac3b
Author: bw <[email protected]>
Commit: bw <[email protected]>
Fixes for handling outline-regexp and hyrolo-entry-regexp
---
ChangeLog | 16 ++++++
DEMO-ROLO.otl | 4 +-
hyrolo.el | 146 ++++++++++++++++++++++++++++--------------------------
kotl/kotl-mode.el | 4 +-
4 files changed, 97 insertions(+), 73 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f1ebf9083d..8c16bfce06 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
+2023-12-12 Bob Weiner <[email protected]>
+
+* hyrolo.el (hyrolo-mode): Add trailing space to default `outline-regexp'.
+ (hyrolo-org-mode): Add quick enable of basic Org mode for use
+ in HyRolo display match searches and use in 'hyrolo-helm-org-rifle'.
+ (hyrolo-org-outline-level): Add to not widen the buffer when
+ computing the Org outline level when in the display match buffer.
+
+* kotl/kotl-mode.el (kotl-mode):
+ hyrolo.el (hyrolo-mode): Change 'run-hooks' to 'run-mode-hooks'.
+
2023-12-11 Bob Weiner <[email protected]>
+* hyrolo.el (hyrolo-mode): Add 'hbut:source-prefix' and 'hyrolo-hdr-regexp'
+ as level 1 outline entries in outline-heading-alist.
+ (hyrolo-mode-outline-level): Delete, use default
'hyrolo-outline-level'
+ or per matched file function in 'outline-level'.
+
* test/hibtypes-tests.el (ibtypes::text-toc-test): Regexp-quote * and allow
for preceding whitespace.
diff --git a/DEMO-ROLO.otl b/DEMO-ROLO.otl
index 05e401d1fe..95ca2aa4f7 100644
--- a/DEMO-ROLO.otl
+++ b/DEMO-ROLO.otl
@@ -3,14 +3,14 @@
==================================================================
* HiHo Industries
** Strong, Hugo <[email protected]> W708-555-9821
- Manager
+ Manager of Buttons
04/12/2017
*** Smith, John <[email protected]> W708-555-2001
Chief Ether Maintainer
05/24/2017
* Work Industries
** Hansen, Dan <[email protected]> W218-555-2311
- Manager
+ Manager of Clasps
02/18/2017
*** Dunn, John <[email protected]> W218-555-3233
Media Maker
diff --git a/hyrolo.el b/hyrolo.el
index cac25bc46f..1f2b1d9cf5 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: 11-Dec-23 at 02:14:52 by Bob Weiner
+;; Last-Mod: 12-Dec-23 at 03:34:06 by Bob Weiner
;;
;; SPDX-License-Identifier: GPL-3.0-or-later
;;
@@ -94,6 +94,10 @@
(declare-function org-outline-level "org")
(defvar org-directory) ; "org.el"
+(defvar org-mode-map) ; "org-keys.el"
+(defvar org-mode-syntax-table) ; "org.el"
+(defvar org-outline-regexp) ; "org.el"
+(defvar org-outline-regexp-bol) ; "org.el"
(defvar markdown-regex-header) ; "markdown-mode.el"
(defvar google-contacts-buffer-name) ; "ext:google-contacts.el"
@@ -641,9 +645,9 @@ select it."
;; Prevent matching to *word* at the beginning of
;; lines and hanging hyrolo search functions. Note this
;; change adds one to the default `outline-level' function,
- ;; so 'hyrolo-mode' overrides that as well to get the correct
- ;; calculation. -- rsw, 2023-11-17
- (setq-local outline-regexp "\\*+[ \t]\\|+"
+ ;; so `hyrolo-outline-level' overrides that as well
+ ;; to get the correct calculation. -- rsw, 2023-11-17
+ (setq-local outline-regexp "[*\^L]+[ \t\n\r]"
outline-level #'hyrolo-outline-level))
(setq buffer-read-only nil))))))))
@@ -654,7 +658,10 @@ It uses the setting of
`hyrolo-find-file-noselect-function'."
(let (enable-local-variables)
(if (string-match "\\.org$" file)
(let ((find-file-literally t))
- (hyrolo-find-file file hyrolo-find-file-noselect-function nil t))
+ (prog1 (hyrolo-find-file file hyrolo-find-file-noselect-function nil
t)
+ ;; Disable all Org mode initializations that slow down
+ ;; file loading and simply set needed outline variables.
+ (hyrolo-org-mode)))
(hyrolo-find-file file hyrolo-find-file-noselect-function))))
;; This wraps forward-visible-line, making its ARG optional, making
@@ -883,7 +890,7 @@ lines of entries only to that depth."
(<= levels-to-show 0))
(not (integerp levels-to-show))))
(setq levels-to-show 100))
- (hyrolo-outline-hide-subtree) ;; Ensure reveal-mode does not expand
current entry.
+ (outline-hide-subtree) ;; Ensure reveal-mode does not expand current
entry.
(hyrolo-show-levels levels-to-show))))
(defun hyrolo-previous-match ()
@@ -1084,7 +1091,7 @@ matched entries."
(hyrolo-verify)
(hyrolo-map-matches
(lambda ()
- (hyrolo-outline-hide-subtree)
+ (outline-hide-subtree)
(hyrolo-show-levels 1))))
(defun hyrolo-verify ()
@@ -1413,7 +1420,7 @@ a matching line, rather than entire entries."
(save-excursion
(mapc (lambda (file)
(set-buffer (hyrolo-find-file-noselect file))
- (org-mode))
+ (hyrolo-org-mode))
files))
(helm-org-rifle-files files)))
@@ -1779,10 +1786,22 @@ Calls the functions given by `hyrolo-mode-hook'.
\\{hyrolo-mode-map}"
(interactive)
(unless (eq major-mode 'hyrolo-mode)
+ (push (cons (substring hyrolo-hdr-regexp 1) 1) outline-heading-alist)
+ (push (cons (if (boundp 'hbut:source-prefix)
+ hbut:source-prefix
+ "@loc> ")
+ 1)
+ outline-heading-alist)
;; This next local value is dynamically overridden in `hyrolo-grep'.
- (setq-local outline-regexp (default-value 'outline-regexp)
- hyrolo-entry-regexp (default-value 'hyrolo-entry-regexp)
- outline-level #'hyrolo-mode-outline-level
+ (setq-local hyrolo-entry-regexp (default-value 'hyrolo-entry-regexp)
+ ;; In `outline-regexp', prevent matching to *word*
+ ;; at the beginning of lines and hanging hyrolo
+ ;; search functions by adding a whitespace char at
+ ;; the end of the match. Note this change adds one
+ ;; level to the level count, so `hyrolo-outline-level'
+ ;; decrements it by one. -- rsw, 2023-11-17
+ outline-regexp "[*\^L]+[ \t\n\r]"
+ outline-level #'hyrolo-outline-level
;; Can't cycle because {TAB} moves to next match
outline-minor-mode-cycle nil
;; For speed reasons, don't want to ever font-lock
@@ -1797,7 +1816,7 @@ Calls the functions given by `hyrolo-mode-hook'.
(set-syntax-table hyrolo-mode-syntax-table)
;;
(hyrolo-outline-minor-mode 1) ;; no keymap
- (run-hooks 'hyrolo-mode-hook))
+ (run-mode-hooks 'hyrolo-mode-hook))
(defun hyrolo-next-visible-heading (arg)
"Move to the next visible heading line.
@@ -2271,6 +2290,29 @@ Any non-nil value returned is a cons of (<entry-name> .
<entry-source>)."
(put-text-property 0 1 'hyrolo-line-entry t entry-name)
(cons entry-name entry-source)))))))))
+(define-derived-mode hyrolo-org-mode outline-mode "HyRoloOrg"
+ "Basic Org mode for use in HyRolo display match searches."
+ (require 'org)
+ (setq-local outline-regexp org-outline-regexp
+ outline-level #'hyrolo-org-outline-level)
+ (use-local-map org-mode-map)
+ ;; Modify a few syntax entries
+ (modify-syntax-entry ?\" "\"")
+ (modify-syntax-entry ?\\ "_")
+ (modify-syntax-entry ?~ "_")
+ (modify-syntax-entry ?< "(>")
+ (modify-syntax-entry ?> ")<"))
+
+(defun hyrolo-org-outline-level ()
+ "Compute the outline level of the heading at point.
+
+If this is called at a normal headline, the level is the number
+of stars."
+ (end-of-line)
+ (if (re-search-backward org-outline-regexp-bol nil t)
+ (1- (- (match-end 0) (match-beginning 0)))
+ 1))
+
(defun hyrolo-save-buffer (&optional hyrolo-buf)
"Save optional HYROLO-BUF if changed and `hyrolo-save-buffers-after-use' is
t.
Default is current buffer. Used, for example, after a rolo entry is killed."
@@ -2307,12 +2349,13 @@ a default of MM/DD/YYYY."
(insert "\n\t" (hyrolo-current-date)))))))
(defun hyrolo-min-matched-level ()
- "Return the minimum hyrolo level within a single file of matches."
- (goto-char (point-min))
- (let ((min-level (hyrolo-mode-outline-level)))
- (while (outline-next-heading)
- (setq min-level (min min-level (hyrolo-mode-outline-level))))
- min-level))
+ "Return the minimum HyRolo level within a single file of matches."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((min-level (funcall outline-level)))
+ (while (outline-next-heading)
+ (setq min-level (min min-level (funcall outline-level))))
+ min-level)))
(defun hyrolo-search-directories (search-cmd file-regexp &rest dirs)
"Search HyRolo over files matching FILE-REGEXP in rest of DIRS."
@@ -2322,11 +2365,14 @@ a default of MM/DD/YYYY."
(call-interactively search-cmd)))
(defun hyrolo-show-levels (num-levels)
- "Show only the first line of up to NUM-LEVELS of rolo matches.
+ "Show only the first line of up to NUM-LEVELS of HyRolo matches.
NUM-LEVELS must be 1 or greater and is relative to the first
level of matches, so if NUM-LEVELS is 2 and the first level
matched from an outline is level 3, then levels 3 and 4 will be
-shown."
+shown.
+
+Any call to this function should be wrapped in a call to
+`hyrolo-map-matches'."
(outline-show-all)
(save-excursion
(goto-char (point-min))
@@ -2406,47 +2452,6 @@ Return final point."
(looking-at hyrolo-hdr-regexp)))))))
(point))))
-(defun hyrolo-mode-outline-level ()
- "Heuristically determine `outline-level' function to use in HyRolo match
buffer."
- (cond ((looking-at hyrolo-hdr-regexp)
- 0)
-
- ;; Org entry (asterisk with a following space; handles some standard
- ;; HyRolo entries and some Emacs outline entries
- ((and (boundp 'org-outline-regexp)
- (fboundp #'org-outline-level)
- (looking-at org-outline-regexp))
- (org-outline-level))
-
- ;; Standard HyRolo entry (when Org is not loaded or with a
- ;; trailing tab character)
- ((looking-at hyrolo-entry-regexp)
- (hyrolo-outline-level))
-
- ;; Koutline entry
- ((and (featurep 'kview)
- (looking-at kview:outline-regexp))
- ;; Assume on an entry from an alpha or legal Koutline
- ;; with default outline settings
- (let ((lbl-sep-len (length kview:default-label-separator)))
- (floor (/ (- (or (kcell-view:indent nil lbl-sep-len)) lbl-sep-len)
- kview:default-level-indent))))
-
- ;; Markdown entry
- ((and (boundp 'markdown-regex-header)
- (fboundp #'markdown-outline-level)
- (looking-at markdown-regex-header))
- (markdown-outline-level))
-
- ;; Ignore Emacs outline entry matches without trailing
- ;; whitespace or of formfeeds, as these can cause a hang in
- ;; HyRolo search. -- rsw, 2023-11-17
- ;; ((looking-at (default-value 'outline-regexp))
- ;; (funcall (default-value #'outline-level)))
-
- ;; Just default to top-level if no other outline type is found
- (t 1)))
-
(defun hyrolo-outline-level ()
"Return the depth to which an entry is nested in the outline.
Point must be at the beginning of a header line.
@@ -2574,10 +2579,17 @@ Add `hyrolo-hdr-regexp' to `hyrolo-entry-regexp' and
`outline-regexp'."
(hyrolo--cache-get-major-mode-from-index
(nth (seq-position hyrolo--cache-loc-match-bounds pos (lambda (e pos) (<
pos e)))
hyrolo--cache-major-mode-indexes)))
- (unless (string-prefix-p hyrolo-hdr-regexp hyrolo-entry-regexp)
- (setq-local hyrolo-entry-regexp (concat hyrolo-hdr-regexp "\\|"
hyrolo-entry-regexp)))
- (unless (string-prefix-p hyrolo-hdr-regexp outline-regexp)
- (setq-local outline-regexp (concat hyrolo-hdr-regexp "\\|"
outline-regexp)))
+ (let ((source-prefix (if (boundp 'hbut:source-prefix) hbut:source-prefix
"@loc> ")))
+ (unless (or (string-prefix-p hyrolo-hdr-regexp hyrolo-entry-regexp)
+ (string-prefix-p source-prefix hyrolo-entry-regexp))
+ (setq-local hyrolo-entry-regexp (concat hyrolo-hdr-regexp "\\|"
+ "^" source-prefix "\\|"
+ hyrolo-entry-regexp)))
+ (unless (or (string-prefix-p hyrolo-hdr-regexp outline-regexp)
+ (string-prefix-p source-prefix outline-regexp))
+ (setq-local outline-regexp (concat hyrolo-hdr-regexp "\\|"
+ "^" source-prefix "\\|"
+ outline-regexp))))
(when (eq outline-level #'markdown-outline-level)
(setq-local outline-level #'hyrolo-markdown-outline-level)))
@@ -2599,8 +2611,6 @@ Call whenever `hyrolo--expanded-file-list' is changed."
hyrolo--cache-major-mode-indexes (list 0)
hyrolo--cache-major-mode-index 1))
-;; TODO: !! See if need 'hyrolo-outline-level' or
-;; 'hyrolo-mode-outline-level' any more?
;; TODO: !! Lookup hyrolo-entry-regexp like outline-regexp.
(defun hyrolo--cache-major-mode (matched-buf)
@@ -2610,8 +2620,6 @@ MATCHED-BUF must be a live buffer, not a buffer name.
Push (point-max) of `hyrolo-display-buffer' onto
`hyrolo--cache-loc-match-bounds'.
Push hash table's index key to `hyrolo--cache-major-mode-indexes'.
Ensure MATCHED-BUF's `major-mode' is stored in the hash table."
- (when (> (length hyrolo--cache-loc-match-bounds) 4)
- (debug))
(push (with-current-buffer hyrolo-display-buffer (point-max))
hyrolo--cache-loc-match-bounds)
(push hyrolo--cache-major-mode-index hyrolo--cache-major-mode-indexes)
diff --git a/kotl/kotl-mode.el b/kotl/kotl-mode.el
index 057647bbdf..58af34def4 100644
--- a/kotl/kotl-mode.el
+++ b/kotl/kotl-mode.el
@@ -3,7 +3,7 @@
;; Author: Bob Weiner
;;
;; Orig-Date: 6/30/93
-;; Last-Mod: 11-Dec-23 at 01:32:59 by Bob Weiner
+;; Last-Mod: 12-Dec-23 at 00:12:16 by Bob Weiner
;;
;; SPDX-License-Identifier: GPL-3.0-or-later
;;
@@ -220,7 +220,7 @@ It provides the following keys:
;; koutline.
(hyperb:with-suppressed-warnings ((free-vars kotl-previous-mode))
(setq kotl-previous-mode 'kotl-mode))
- (run-hooks 'kotl-mode-hook)
+ (run-mode-hooks 'kotl-mode-hook)
(add-hook 'change-major-mode-hook #'kotl-mode:show-all nil t)))
;;;###autoload