a291c8690a
GitOrigin-RevId: e6e19f3d81a982a62e1bba08f0b4f7fdc21b4ea0
61 lines
2.4 KiB
EmacsLisp
61 lines
2.4 KiB
EmacsLisp
;;; -*- lexical-binding: t; -*-
|
|
|
|
;;; https://with-emacs.com/posts/ui-hacks/show-matching-lines-when-parentheses-go-off-screen/
|
|
|
|
;; we will call `blink-matching-open` ourselves...
|
|
(remove-hook 'post-self-insert-hook
|
|
#'blink-paren-post-self-insert-function)
|
|
;; this still needs to be set for `blink-matching-open` to work
|
|
(setq blink-matching-paren 'show)
|
|
|
|
(let ((ov nil)) ; keep track of the overlay
|
|
(advice-add
|
|
#'show-paren-function
|
|
:after
|
|
(defun show-paren--off-screen+ (&rest _args)
|
|
"Display matching line for off-screen paren."
|
|
(when (overlayp ov)
|
|
(delete-overlay ov))
|
|
;; check if it's appropriate to show match info,
|
|
;; see `blink-paren-post-self-insert-function'
|
|
(when (and (overlay-buffer show-paren--overlay)
|
|
(not (or cursor-in-echo-area
|
|
executing-kbd-macro
|
|
noninteractive
|
|
(minibufferp)
|
|
this-command))
|
|
(and (not (bobp))
|
|
(memq (char-syntax (char-before)) '(?\) ?\$)))
|
|
(= 1 (logand 1 (- (point)
|
|
(save-excursion
|
|
(forward-char -1)
|
|
(skip-syntax-backward "/\\")
|
|
(point))))))
|
|
;; rebind `minibuffer-message' called by
|
|
;; `blink-matching-open' to handle the overlay display
|
|
(cl-letf (((symbol-function #'minibuffer-message)
|
|
(lambda (msg &rest args)
|
|
(let ((msg (apply #'format-message msg args)))
|
|
(setq ov (display-line-overlay+
|
|
(window-start) msg ))))))
|
|
(blink-matching-open))))))
|
|
|
|
(defun display-line-overlay+ (pos str &optional face)
|
|
"Display line at POS as STR with FACE.
|
|
|
|
FACE defaults to inheriting from default and highlight."
|
|
(let ((ol (save-excursion
|
|
(goto-char pos)
|
|
(make-overlay (line-beginning-position)
|
|
(line-end-position)))))
|
|
(overlay-put ol 'display str)
|
|
(overlay-put ol 'face
|
|
(or face '(:inherit default :inherit highlight)))
|
|
ol))
|
|
|
|
(setq show-paren-style 'paren
|
|
show-paren-delay 0.03
|
|
show-paren-highlight-openparen t
|
|
show-paren-when-point-inside-paren nil
|
|
show-paren-when-point-in-periphery t)
|
|
(show-paren-mode 1)
|