Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2026-02-15 Bob Weiner <rsw@gnu.org>

* hywiki.el (hywiki-word-highlight-in-current-buffer): Fix bug that added
highlighting hooks to buffers where HyWikiWords are not highlighted.
Previously, this function filtered out only minibuffers. Now it filters
out buffers where hywiki-mode is not active.
(hywiki-mode-normalize): Add to normalize 'hywiki-mode' args and
handle mode toggling.
(hywiki-default-mode): Add this customization which determines
the state HyWiki is initialized to when Hyperbole is activated.

2026-02-14 Bob Weiner <rsw@gnu.org>

* hsys-org.el (hsys-org-fix-version): Ensure 'org-install-dir' is a dir and
Expand Down
7 changes: 4 additions & 3 deletions hyperbole.el
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
;; Maintainer: Robert Weiner <rsw@gnu.org>
;; Maintainers: Robert Weiner <rsw@gnu.org>, Mats Lidell <matsl@gnu.org>
;; Created: 06-Oct-92 at 11:52:51
;; Last-Mod: 18-Jan-26 at 08:29:42 by Bob Weiner
;; Last-Mod: 15-Feb-26 at 20:18:18 by Bob Weiner
;; Released: 10-Mar-24
;; Version: 9.0.2pre
;; Keywords: comm, convenience, files, frames, hypermedia, languages, mail, matching, mouse, multimedia, outlines, tools, wp
Expand Down Expand Up @@ -510,8 +510,9 @@ frame, those functions by default still return the prior frame."
(when (fboundp #'vertico-mouse-mode)
(add-hook 'vertico-mode-hook (lambda () (vertico-mouse-mode 1))))
;;
;; Set HyWiki page auto-HyWikiWord highlighting and `yank-handled-properties'
(hywiki-mode :pages)
;; Initialize HyWiki page auto-HyWikiWord highlighting and `yank-handled-properties'
;; based on the `hywiki-default-mode'.
(hywiki-mode hywiki-default-mode)
;;
;; Hyperbole initialization is complete.
(message "Initializing Hyperbole...done"))
Expand Down
173 changes: 106 additions & 67 deletions hywiki.el
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
;; Author: Bob Weiner
;;
;; Orig-Date: 21-Apr-24 at 22:41:13
;; Last-Mod: 14-Feb-26 at 23:07:37 by Bob Weiner
;; Last-Mod: 15-Feb-26 at 20:39:33 by Bob Weiner
;;
;; SPDX-License-Identifier: GPL-3.0-or-later
;;
Expand Down Expand Up @@ -786,11 +786,71 @@ since the command may have moved it off a HyWikiWord."
;; Not inside a comment or a string
(not (or (nth 4 (syntax-ppss)) (hypb:in-string-p))))))

(defcustom hywiki-default-mode :pages
"Customizable initial mode setting for HyWiki minor mode.
HyWiki mode has three states, any one of which can be set as the default:
- :pages - highlight HyWikiWords in HyWiki pages only (Org files in
`hywiki-directory')
- :all - highlight HyWikiWords in all editable buffers except those
with a major mode in `hywiki-exclude-major-modes'.
- nil - no highlighting, the mode is disabled."
:type 'string
:group 'hyperbole-hywiki)

(defvar hywiki-mode nil
"Non-nil when the global hywiki minor mode is enabled.
Don't set this directly, instead call the function `hywiki-mode'
with the value you want as its argument. See the docstring for
that function for valid values.")
with the value you want as its argument. See the documentation for the
customization, `hywiki-default-mode', for valid values.")

(defun hywiki-mode-normalize (to-mode)
"Normalize `hywiki-mode' and TO-MODE values for `hywiki-mode' function.
See the documentation for the customization, `hywiki-default-mode', for
valid values."
;; Normalize `hywiki-default-mode' setting
(cond
((or (and (integerp hywiki-default-mode) (= hywiki-default-mode 1))
(memq hywiki-default-mode '(:all all t)))
(setq hywiki-default-mode :all))
((or (null hywiki-default-mode)
(and (integerp hywiki-default-mode) (<= hywiki-default-mode 0)))
(setq hywiki-default-mode nil))
(t ;; (> hywiki-default-mode 1)
(setq hywiki-default-mode :pages)))

;; Normalize `hywiki-mode' setting
(cond
((or (and (integerp hywiki-mode) (= hywiki-mode 1))
(memq hywiki-mode '(:all all t)))
;; Enable across all editable buffers
(setq hywiki-mode :all))
((or (null hywiki-mode)
(and (integerp hywiki-mode) (<= hywiki-mode 0)))
;; Disable mode flag
(setq hywiki-mode nil))
(t ;; (> hywiki-mode 1)
;; Enable in HyWiki page buffers only
(setq hywiki-mode :pages)))

;; Normalize `to-mode' and set mode
(when (eq to-mode 'toggle)
;; Toggle across all editable buffers
(setq to-mode (if hywiki-mode
nil
(or hywiki--prior-mode hywiki-default-mode :pages))))

(cond
((or (and (integerp to-mode) (= to-mode 1))
(memq to-mode '(:all all t)))
;; Enable across all editable buffers
(setq to-mode :all))
((or (null to-mode)
(and (integerp to-mode) (<= to-mode 0)))
;; Disable across all editable buffers
(setq to-mode nil))
(t ;; (> to-mode 1)
;; Enable in HyWiki page buffers only
(setq to-mode :pages))))

;;;###autoload
(define-minor-mode hywiki-mode
Expand All @@ -800,13 +860,9 @@ HyWiki minor mode automatically highlights and turns HyWikiWord
references into implicit buttons that either link to HyWiki pages
or activate typed referents such as bookmarks.

HyWiki minor mode has three states as tracked by the following values
of the `hywiki-mode' variable:
- :pages - highlight HyWikiWords in HyWiki pages only (Org files in
`hywiki-directory')
- :all - highlight HyWikiWords in all editable buffers except those
with a major mode in `hywiki-exclude-major-modes'.
- nil - no highlighting, the mode is disabled.
HyWiki minor mode has three states as tracked by the `hywiki-mode'
variable. See the documentation for the customization, `hywiki-default-mode',
for valid values.

HyWikiWord references may also include optional suffixes:

Expand All @@ -830,59 +886,38 @@ See the Info documentation at \"(hyperbole)HyWiki\".
;; customize this variable.
:variable hywiki-mode
(progn
(unless hywiki-mode-map
(setq hywiki-mode-map (make-sparse-keymap)))
;; Normalize `hywiki-mode' setting
(cond
((or (and (integerp hywiki-mode) (= hywiki-mode 1))
(memq hywiki-mode '(:all t)))
;; Enable across all editable buffers
(setq hywiki-mode :all))
((or (and (integerp hywiki-mode) (<= hywiki-mode 0))
(null hywiki-mode))
;; Disable mode flag
(setq hywiki-mode nil))
(t ;; (> hywiki-mode 1)
;; Enable in HyWiki page buffers only
(setq hywiki-mode :pages)))

;; Normalize `arg' and set mode
(when (eq arg 'toggle)
;; Toggle across all editable buffers
(setq arg hywiki-mode))
(cond
((or (and (integerp arg) (= arg 1))
(memq arg '(:all t)))
;; Enable across all editable buffers
(setq arg :all)
;; Need hyperbole-mode
(unless hyperbole-mode
(hyperbole-mode 1))
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg))
((or (and (integerp arg) (<= arg 0))
(null arg))
;; Disable across all editable buffers.
(setq arg nil)
;; Dehighlight HyWikiWords in this buffer when 'hywiki-mode' is
;; disabled and this is not a HyWiki page buffer. If this is a
;; HyWiki page buffer, then dehighlight when `hywiki-mode' is nil.
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg))
(t ;; (> arg 1)
;; Enable in HyWiki page buffers only
(setq arg :pages)
;; Need hyperbole-mode
(unless hyperbole-mode
(hyperbole-mode 1))
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg)))))

(defun hywiki-mode-around-advice (hywiki-mode-fn &optional arg)
(setq hywiki--prior-mode hywiki-mode)
(funcall hywiki-mode-fn arg))

(advice-add 'hywiki-mode :around #'hywiki-mode-around-advice)
;; Set mode and highlighting
(pcase arg
(:all (progn
;; Enable across all editable buffers
;; Need hyperbole-mode
(unless hyperbole-mode
(hyperbole-mode 1))
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg)))
('nil (progn
;; Disable across all editable buffers.
;; Dehighlight HyWikiWords in this buffer when 'hywiki-mode' is
;; disabled and this is not a HyWiki page buffer. If this is a
;; HyWiki page buffer, then dehighlight when `hywiki-mode' is nil.
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg)))
(:pages (progn
;; Enable in HyWiki page buffers only
;; Need hyperbole-mode
(unless hyperbole-mode
(hyperbole-mode 1))
(hywiki-word-set-auto-highlighting hywiki--prior-mode arg)
(setq hywiki-mode arg))))))

(defun hywiki-mode-around-advice (hywiki-mode-fn &optional to-mode)
(setq to-mode (hywiki-mode-normalize to-mode))
(unless (eq hywiki-mode to-mode)
(setq hywiki--prior-mode hywiki-mode))
(funcall hywiki-mode-fn to-mode))

(unless (advice-member-p #'hywiki-mode-around-advice #'hywiki-mode)
(advice-add 'hywiki-mode :around #'hywiki-mode-around-advice))

;;; ************************************************************************
;;; Public Implicit Button and Action Types
Expand Down Expand Up @@ -1066,8 +1101,10 @@ Exclude the minibuffer if selected and return nil."

(defun hywiki-potential-buffer-p ()
"Return non-nil if the current buffer can support HyWikiWords.
This does not mean `hywiki-mode' is presently active in that buffer.
Always exclude minibuffers."
Always exclude minibuffers.
This does not mean `hywiki-mode' is presently active in that buffer;
use 'hywiki-active-in-current-buffer-p' for that."

(and (not (minibufferp))
;; (not (and (boundp 'edebug-active) edebug-active))
(not (apply #'derived-mode-p hywiki-exclude-major-modes))
Expand Down Expand Up @@ -3779,8 +3816,10 @@ occurs with one of these hooks, the problematic hook is removed."
(hywiki-get-buffers-in-windows frame))))))

(defun hywiki-word-highlight-in-current-buffer ()
(unless (minibufferp)
(hywiki-word-highlight-in-buffers (list (current-buffer)))))
"Auto-highlight HyWikiWords in the current buffer."
(and (not (minibufferp))
(hywiki-active-in-current-buffer-p)
(hywiki-word-highlight-in-buffers (list (current-buffer)))))

(defun hywiki-word-highlight-in-buffers (buffers)
"Auto-highlight HyWikiWords in BUFFERS."
Expand Down