diff --git a/lisp/ol.el b/lisp/ol.el index 21bd854e9..1837bf37c 100644 --- a/lisp/ol.el +++ b/lisp/ol.el @@ -605,6 +605,22 @@ (defvar org-link--insert-history nil (defvar org-link--search-failed nil "Non-nil when last link search failed.") + +(defvar-local org-link--link-folding-spec '(org-link + (:global t) + (:ellipsis . nil) + (:isearch-open . t) + (:fragile . org-link--reveal-maybe)) + "Folding spec used to hide invisible parts of links.") + +(defvar-local org-link--description-folding-spec '(org-link-description + (:global t) + (:ellipsis . nil) + (:visible . t) + (:isearch-open . nil) + (:fragile . org-link--reveal-maybe)) + "Folding spec used to reveal link description.") + ;;; Internal Functions @@ -762,6 +778,13 @@ (defun org-link--normalize-string (string &optional context) (t nil)))) string)) +(defun org-link--reveal-maybe (region _) + "Reveal folded link in REGION when needed. +This function is intended to be used as :fragile property of a folding +spec." + (org-with-point-at (car region) + (not (org-in-regexp org-link-any-re)))) + ;;; Public API @@ -1444,14 +1467,31 @@ (defun org-previous-link () (interactive) (org-next-link t)) +(defun org-link-descriptive-ensure () + "Toggle the literal or descriptive display of links in current buffer if needed." + (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))) + ;;;###autoload -(defun org-toggle-link-display () +(defun org-toggle-link-display--overlays () "Toggle the literal or descriptive display of links." (interactive) (if org-link-descriptive (remove-from-invisibility-spec '(org-link)) (add-to-invisibility-spec '(org-link))) (org-restart-font-lock) (setq org-link-descriptive (not org-link-descriptive))) +(defun org-toggle-link-display--text-properties () + "Toggle the literal or descriptive display of links in current buffer." + (interactive) + (setq org-link-descriptive (not org-link-descriptive)) + (org-link-descriptive-ensure)) +(defsubst org-toggle-link-display () + "Toggle the literal or descriptive display of links." + (interactive) + (if (eq org-fold-core-style 'text-properties) + (org-toggle-link-display--text-properties) + (org-toggle-link-display--overlays))) ;;;###autoload (defun org-store-link (arg &optional interactive?) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 2802e8636..063da6566 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -2325,7 +2325,8 @@ (defun org-agenda-mode () org-agenda-show-log org-agenda-start-with-log-mode org-agenda-clockreport-mode org-agenda-start-with-clockreport-mode)) (add-to-invisibility-spec '(org-filtered)) - (add-to-invisibility-spec '(org-link)) + (org-fold-core-initialize `(,org-link--description-folding-spec + ,org-link--link-folding-spec)) (easy-menu-change '("Agenda") "Agenda Files" (append diff --git a/lisp/org.el b/lisp/org.el index ebc9d81db..5465ed3ea 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -4562,9 +4562,16 @@ (define-derived-mode org-mode outline-mode "Org" (setq-local org-mode-loading t) (org-load-modules-maybe) (org-install-agenda-files-menu) - (when org-link-descriptive (add-to-invisibility-spec '(org-link))) + (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) - (add-to-invisibility-spec '(org-hide-block . t)) + (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 outline-regexp org-outline-regexp) (setq-local outline-level 'org-outline-level) (setq bidi-paragraph-direction 'left-to-right)