Skip to content

Commit

Permalink
org-compat: Use define-advice' instead of defadvice'
Browse files Browse the repository at this point in the history
* lisp/org-compat.el (outline-flag-region):
(outline-next-visible-heading):
(outline-back-to-heading):
(outline-on-heading-p):
(outline-hide-sublevels):
(outline-toggle-children): Use `define-advice', remove redundant
interactive specs, and use `derived-mode-p' instead of `eq'
`major-mode'.

Suggested by Stefan Monnier.
  • Loading branch information
yantar92 committed Sep 3, 2022
1 parent 710b6ca commit ea66579
Showing 1 changed file with 43 additions and 54 deletions.
97 changes: 43 additions & 54 deletions lisp/org-compat.el
Original file line number Diff line number Diff line change
Expand Up @@ -1456,69 +1456,58 @@ key."
;; Folding in outline-mode is not compatible with org-mode folding
;; anymore. Working around to avoid breakage of external packages
;; assuming the compatibility.
(defadvice outline-flag-region (around outline-flag-region@fix-for-org-fold (from to flag) activate)
(define-advice outline-flag-region (:around (oldfun from to flag) fix-for-org-fold)
"Run `org-fold-region' when in org-mode."
(if (eq major-mode 'org-mode)
(setq ad-return-value (org-fold-region (max from (point-min)) (min to (point-max)) flag 'headline))
ad-do-it))
(if (derived-mode-p 'org-mode)
(org-fold-region (max from (point-min)) (min to (point-max)) flag 'headline)
(apply oldfun from to flag)))

(defadvice outline-next-visible-heading (around outline-next-visible-heading@fix-for-org-fold (arg) activate)
(define-advice outline-next-visible-heading (:around (oldfun arg) fix-for-org-fold)
"Run `org-next-visible-heading' when in org-mode."
(interactive "p")
(if (eq major-mode 'org-mode)
(setq ad-return-value (org-next-visible-heading arg))
ad-do-it))
(if (derived-mode-p 'org-mode)
(org-next-visible-heading arg)
(apply oldfun arg)))

(defadvice outline-back-to-heading (around outline-back-to-heading@fix-for-org-fold (&optional invisible-ok) activate)
(define-advice outline-back-to-heading (:around (oldfun &optional invisible-ok) fix-for-org-fold)
"Run `org-back-to-heading' when in org-mode."
(if (eq major-mode 'org-mode)
(setq ad-return-value
(progn
(beginning-of-line)
(or (org-at-heading-p (not invisible-ok))
(let (found)
(save-excursion
(while (not found)
(or (re-search-backward (concat "^\\(?:" outline-regexp "\\)")
nil t)
(signal 'outline-before-first-heading nil))
(setq found (and (or invisible-ok (not (org-fold-folded-p)))
(point)))))
(goto-char found)
found))))
ad-do-it))

(defadvice outline-on-heading-p (around outline-on-heading-p@fix-for-org-fold (&optional invisible-ok) activate)
(if (derived-mode-p 'org-mode)
(progn
(beginning-of-line)
(or (org-at-heading-p (not invisible-ok))
(let (found)
(save-excursion
(while (not found)
(or (re-search-backward (concat "^\\(?:" outline-regexp "\\)")
nil t)
(signal 'outline-before-first-heading nil))
(setq found (and (or invisible-ok (not (org-fold-folded-p)))
(point)))))
(goto-char found)
found)))
(apply oldfun invisible-ok)))

(define-advice outline-on-heading-p (:around (oldfun &optional invisible-ok) fix-for-org-fold)
"Run `org-at-heading-p' when in org-mode."
(if (eq major-mode 'org-mode)
(setq ad-return-value (org-at-heading-p (not invisible-ok)))
ad-do-it))
(if (derived-mode-p 'org-mode)
(org-at-heading-p (not invisible-ok))
(apply oldfun invisible-ok)))

(defadvice outline-hide-sublevels (around outline-hide-sublevels@fix-for-org-fold (levels) activate)
(define-advice outline-hide-sublevels (:around (oldfun levels) fix-for-org-fold)
"Run `org-fold-hide-sublevels' when in org-mode."
(interactive (list
(cond
(current-prefix-arg (prefix-numeric-value current-prefix-arg))
((save-excursion (beginning-of-line)
(looking-at outline-regexp))
(funcall outline-level))
(t 1))))
(if (eq major-mode 'org-mode)
(setq ad-return-value (org-fold-hide-sublevels levels))
ad-do-it))

(defadvice outline-toggle-children (around outline-toggle-children@fix-for-org-fold () activate)
(if (derived-mode-p 'org-mode)
(org-fold-hide-sublevels levels)
(apply oldfun levels)))

(define-advice outline-toggle-children (:around (oldfun) fix-for-org-fold)
"Run `org-fold-hide-sublevels' when in org-mode."
(interactive)
(if (eq major-mode 'org-mode)
(setq ad-return-value
(save-excursion
(org-back-to-heading)
(if (not (org-fold-folded-p (line-end-position)))
(org-fold-hide-subtree)
(org-fold-show-children)
(org-fold-show-entry 'hide-drawers))))
ad-do-it))
(if (derived-mode-p 'org-mode)
(save-excursion
(org-back-to-heading)
(if (not (org-fold-folded-p (line-end-position)))
(org-fold-hide-subtree)
(org-fold-show-children)
(org-fold-show-entry 'hide-drawers)))
(apply oldfun)))

;; TODO: outline-headers-as-kill

Expand Down

0 comments on commit ea66579

Please sign in to comment.