Elisp: Text Properties
What is Text Property
Text in a buffer can have “text properties”.
Text properties is used to color text, or add keybinding to that text (e.g. pressing Enter on a link in HTML opens the link instead of insert newline.), and other purposes.
Text Property is a Property List attached to text.
When a property list is attached to text, some property keys have special meaning that are predefined by emacs.
Important Text Property Keys
Here are some of the most useful property keys for writing a major/minor mode.
'font-lock-face
- For syntax coloring. Value is a face. 〔see Elisp: Font Face〕
'face
-
For syntax coloring. Value is a face. It overrides the
'font-lock-face
property. This property is automatically updated/managed byfont-lock-mode
. 〔see Elisp: Font Lock Mode〕 'syntax-table
-
Add syntax table to text.
Value is a Syntax Table.
This is useful for example, in a major mode for programing language, you want to make regex delimiter character such as slash / to have string syntax, so regex string are colored as string.
'keymap
- Add keybinding to text. Value is a keymap. When cursor is on the text, the keymap has priority in determining keystroke action. 〔see Elisp: Create Keymap (keybinding)〕
For a complete list, see Special Properties (ELISP Manual)
Functions for Working with Text Property
There are many functions to get values of text properties, add/change/delete them, or find out where a property begins, etc. See
Example: Text Properties, Make a Region Red
Here's a command that makes a region red, by adding a text property of 'font-lock-face
to it.
(defun xx-make-word-red (begin end) "make current region colored red, using text properties" (interactive (list (region-beginning) (region-end))) (put-text-property begin end 'font-lock-face '(:foreground "red")))
Select a region, then
Alt+x
xx-make-word-red
Example: Text Properties, Clickable Filepath to Open It
Here's example of adding a keymap to text, so that when Enter is pressed, it tries to open the file, taking current line as file name/path.
(setq xx-keymap (make-sparse-keymap)) (define-key xx-keymap (kbd "RET") (lambda () (find-file (thing-at-point 'filename)))) (defun xx-add-prop (begin end) "add text properties to a region." (interactive "r") (put-text-property begin end 'font-lock-face '(:foreground "blue")) (put-text-property begin end 'keymap xx-keymap))
try it:
- Open a new file, insert some text that contains file path.
- Go to a line that's a file path, select it, then Alt+x
xx-add-prop
. The region will be colored blue, and pressing Enter key on it will callxx-open-me