I've found a function for checking parenthesis/brackets balance.
Full code is in the bottom.
I wanted to use it to check LaTeX
commands like \left(
/\right)
, \[
/\]
etc.
How can I modify this function to accept such constructs?
(defun xah-check-parens-balance ()
"Check if there are unbalanced parentheses/brackets/quotes in current bufffer or selection.
If so, place cursor there, print error to message buffer.
URL `http://ergoemacs.org/emacs/emacs_check_parens_balance.html'
Version 2018-07-03"
(interactive)
(let* (
($bracket-alist
'( (?“ . ?”) (?‹ . ?›) (?« . ?») (?【 . ?】) (?〖 . ?〗) (?〈 . ?〉) (?《 . ?》) (?「 . ?」) (?『 . ?』) (?{ . ?}) (?\[ . ?\]) (?\( . ?\))))
;; regex string of all pairs to search.
($bregex
(let (($tempList nil))
(mapc
(lambda (x)
(push (char-to-string (car x)) $tempList)
(push (char-to-string (cdr x)) $tempList))
$bracket-alist)
(regexp-opt $tempList )))
$p1
$p2
;; each entry is a vector [char position]
($stack '())
($char nil)
$pos
$is-closing-char-p
$matched-open-char
)
(if (region-active-p)
(setq $p1 (region-beginning) $p2 (region-end))
(setq $p1 (point-min) $p2 (point-max)))
(save-excursion
(save-restriction
(narrow-to-region $p1 $p2)
(progn
(goto-char 1)
(while (re-search-forward $bregex nil "move")
(setq $pos (point))
(setq $char (char-before))
(progn
(setq $is-closing-char-p (rassoc $char $bracket-alist))
(if $is-closing-char-p
(progn
(setq $matched-open-char
(if $is-closing-char-p
(car $is-closing-char-p)
(error "logic error 64823. The char %s has no matching pair."
(char-to-string $char))))
(if $stack
(if (eq (aref (car $stack) 0) $matched-open-char )
(pop $stack)
(push (vector $char $pos) $stack ))
(progn
(goto-char $pos)
(error "First mismtach found. the char %s has no matching pair."
(char-to-string $char)))))
(push (vector $char $pos) $stack ))))
(if $stack
(progn
(goto-char (aref (car $stack) 1))
(message "Mismtach found. The char %s has no matching pair." $stack))
(print "All brackets/quotes match.")))))))