Elisp: Find Matching Bracket Character
Given a bracket character, how to find the character that matches it?
- [ matches ]
- ( matches )
- 「 matches 」
(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. 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.
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.
Writing Major Mode
- How to Write a Emacs Major Mode for Syntax Coloring
- Elisp: html6-mode
- Elisp: Font Lock Mode Basics
- Elisp: How to Define Face
- Elisp: How to Color Comment in Major Mode
- Elisp: How to Write Comment Command in Major Mode
- Elisp: How to Write Your Own Comment Command from Scratch
- Elisp: How to Write Keyword Completion Command
- Elisp: How to Create Keymap for Major Mode
- Elisp: Create Abbrev and Templates for Major Mode
- Elisp: Text Properties
- Elisp: Overlay Highlighting
- Emacs: Lookup Google, Dictionary, Documentation
- Elisp: Syntax Table Tutorial