Elisp: Find Matching Bracket Character

By Xah Lee. Date: . Last updated: .

Given a bracket character, how to find the character that matches it?

For example:

[see Unicode: Brackets, Quotes «»「」【】《》]

Solution

(defun xah-get-matching-bracket (@bracket-char-string)
  "Returns a char in string form matching @bracket-char-string.
 For example, if input is \"[\" returns \"]\".
This works with any unicode bracket, such as 「」【】〈〉etc.
This function uses the current syntax table to determine what's brackets and the matching char.
If the input is not a bracket, returns nil.

URL `http://ergoemacs.org/emacs/elisp_find_matching_bracket_char.html'
Version 2017-01-16"
  (interactive)
  (let (($syntableValue (aref (syntax-table) (string-to-char @bracket-char-string))))
    (if (or
         (eq (car $syntableValue ) 4) ; syntax table, code 4 is open bracket
         (eq (car $syntableValue ) 5) ; syntax table, code 5 is close bracket
         )
        (char-to-string (cdr $syntableValue))
      nil
      )))

;; test
(xah-get-matching-bracket "(" ) ; ")"
(xah-get-matching-bracket ")" ) ; "("
(xah-get-matching-bracket "[" ) ; "]"
(xah-get-matching-bracket "]" ) ; "["
(xah-get-matching-bracket "「" ) ; "」"
(xah-get-matching-bracket "」" ) ; "「"
(xah-get-matching-bracket "【" ) ; "】"
(xah-get-matching-bracket "】" ) ; "【"

How does it work?

For bracket characters, the matching character is stored in emacs syntax table. So, we just need to extract that info.

[see Elisp: Syntax Table]

Syntax table is implemented as a character table, which is implemented as a elisp vector type, but instead of integer for index, it uses character for index. (in elisp, character type is just integer too, of the character's Unicode codepoint in decimal.)

[see Elisp: Vector]

Each element of the syntax table is a cons pair (syntax-code . matching-char).

The syntax-code is a integer that represents the syntax class. The matching-char, if not nil, is the matching character.

(info "(elisp) Syntax Table Internals")

If you have a question, put $5 at patreon and message me on xah discord.
Or support me by Buy Xah Emacs Tutorial

Emacs Tutorial

Emacs Init

Emacs Keys

ELisp

ELisp Examples

ELisp Write Major Mode


ELisp Write Major Mode

Basics

Package Name/Load

Syntax Table