Function: show-paren-function
show-paren-function is a byte-compiled function defined in
paren.el.gz.
Signature
(show-paren-function)
Documentation
Highlight the parentheses until the next input arrives.
Source Code
;; Defined in /usr/src/emacs/lisp/paren.el.gz
(defun show-paren-function ()
"Highlight the parentheses until the next input arrives."
(let ((data (and (show-paren--enabled-p)
(funcall show-paren-data-function))))
(if (not data)
(progn
;; If show-paren-mode is nil in this buffer or if not at a paren that
;; has a match, turn off any previous paren highlighting.
(delete-overlay show-paren--overlay)
(delete-overlay show-paren--overlay-1)
(setq show-paren--last-pos (point)))
;; Found something to highlight.
(catch 'sp-exit
(let* ((here-beg (nth 0 data))
(here-end (nth 1 data))
(there-beg (nth 2 data))
(there-end (nth 3 data))
(mismatch (nth 4 data))
(highlight-expression
(or (eq show-paren-style 'expression)
(and there-beg
(eq show-paren-style 'mixed)
(let ((closest (if (< there-beg here-beg)
(1- there-end) (1+ there-beg))))
(not (pos-visible-in-window-p closest))))))
(face
(cond
(mismatch
(if (and (eq show-paren-not-in-comments-or-strings 'on-mismatch)
(save-excursion
(syntax-ppss-context (syntax-ppss here-beg))))
(throw 'sp-exit nil))
(if show-paren-ring-bell-on-mismatch
(beep))
'show-paren-mismatch)
(highlight-expression 'show-paren-match-expression)
(t 'show-paren-match))))
(if (and (eq show-paren-not-in-comments-or-strings 'all)
(save-excursion
(syntax-ppss-context (syntax-ppss here-beg))))
(throw 'sp-exit nil))
;;
;; If matching backwards, highlight the closeparen
;; before point as well as its matching open.
;; If matching forward, and the openparen is unbalanced,
;; highlight the paren at point to indicate misbalance.
;; Otherwise, turn off any such highlighting.
(if (or (not here-beg)
(and (not show-paren-highlight-openparen)
(> here-end (point))
(<= here-beg (point))
(integerp there-beg)))
(delete-overlay show-paren--overlay-1)
(move-overlay show-paren--overlay-1
here-beg here-end (current-buffer))
;; Always set the overlay face, since it varies.
(overlay-put show-paren--overlay-1 'priority show-paren-priority)
(overlay-put show-paren--overlay-1 'face face))
;;
;; Turn on highlighting for the matching paren, if found.
;; If it's an unmatched paren, turn off any such highlighting.
(if (not there-beg)
(delete-overlay show-paren--overlay)
(if highlight-expression
(move-overlay show-paren--overlay
(if (< there-beg here-beg) here-end here-beg)
(if (< there-beg here-beg) there-beg there-end)
(current-buffer))
(move-overlay show-paren--overlay
there-beg there-end (current-buffer)))
;; If `show-paren-context-when-offscreen' is non-nil and
;; point is at a closing paren, show the context around the
;; opening paren.
(let ((openparen (min here-beg there-beg)))
(when (and show-paren-context-when-offscreen
(not (eql show-paren--last-pos (point)))
(< there-beg here-beg)
;; Either OPENPAREN position is fully visible...
(not (or (pos-visible-in-window-p openparen)
(let ((dfh4 (* 0.25 (default-font-height)))
(part
(pos-visible-in-window-p openparen
nil t)))
;; ...or partially visible, and the
;; invisible part is less than 1/4th
;; of the default font height
(and (>= (length part) 4)
(< (nth 2 part) dfh4)
(< (nth 3 part) dfh4))))))
(let ((context (blink-paren-open-paren-line-string
openparen))
(message-log-max nil))
(cond
((eq show-paren-context-when-offscreen 'child-frame)
(show-paren--show-context-in-child-frame context))
((eq show-paren-context-when-offscreen 'overlay)
(show-paren--show-context-in-overlay context))
(show-paren-context-when-offscreen
(minibuffer-message "Matches %s" context))))))
(setq show-paren--last-pos (point))
;; Always set the overlay face, since it varies.
(overlay-put show-paren--overlay 'priority show-paren-priority)
(overlay-put show-paren--overlay 'face face)))))))