Function: org-fold--hide-wrapper-toggle

org-fold--hide-wrapper-toggle is a byte-compiled function defined in org-fold.el.gz.

Signature

(org-fold--hide-wrapper-toggle ELEMENT CATEGORY FORCE NO-ERROR)

Documentation

Toggle visibility for ELEMENT.

ELEMENT is a block or drawer type parsed element. CATEGORY is either block or drawer. When FORCE is off, show the block or drawer. If it is non-nil, hide it unconditionally. Throw an error when not at a block or drawer, unless NO-ERROR is non-nil.

Return a non-nil value when toggling is successful.

Aliases

org--hide-wrapper-toggle (obsolete since 9.6)

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-fold.el.gz
;;;;; Blocks and drawers visibility

(defun org-fold--hide-wrapper-toggle (element category force no-error)
  "Toggle visibility for ELEMENT.

ELEMENT is a block or drawer type parsed element.  CATEGORY is
either `block' or `drawer'.  When FORCE is `off', show the block
or drawer.  If it is non-nil, hide it unconditionally.  Throw an
error when not at a block or drawer, unless NO-ERROR is non-nil.

Return a non-nil value when toggling is successful."
  (let ((type (org-element-type element)))
    (cond
     ((memq type
            (pcase category
              (`drawer '(drawer property-drawer))
              (`block '(center-block
                        comment-block dynamic-block example-block export-block
                        quote-block special-block src-block verse-block))
              (_ (error "Unknown category: %S" category))))
      (let* ((post (org-element-post-affiliated element))
             (start (save-excursion
                      (goto-char post)
                      (line-end-position)))
             (end (save-excursion
                    (goto-char (org-element-end element))
                    (skip-chars-backward " \t\n")
                    (line-end-position))))
        ;; Do nothing when not before or at the block opening line or
        ;; at the block closing line.
        (unless (let ((eol (line-end-position)))
                  (and (> eol start) (/= eol end)))
          (org-fold-region start end
                   (cond ((eq force 'off) nil)
                         (force t)
                         ((org-fold-folded-p start category) nil)
                         (t t))
                   category)
          ;; When the block is hidden away, make sure point is left in
          ;; a visible part of the buffer.
          (when (invisible-p (max (1- (point)) (point-min)))
            (goto-char post))
          ;; Signal success.
          t)))
     (no-error nil)
     (t
      (user-error (format "%s@%s: %s"
                          (buffer-file-name (buffer-base-buffer))
                          (point)
                          (if (eq category 'drawer)
                              "Not at a drawer"
                            "Not at a block")))))))