Elisp: Text Properties
Text in a buffer can have “text properties”.
Text properties is used to color text, or add keybinding to that text (for example, pressing Enter on a link in HTML opens the link instead of insert newline.), and other purposes.
Here's a command that makes a region red, by adding a text property of 'font-lock-face
to it.
(defun x-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
x-make-word-red
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 x-keymap (make-sparse-keymap)) (define-key x-keymap (kbd "RET") (lambda () (find-file (thing-at-point 'filename) ))) (defun x-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 x-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
x-add-prop
. The region will be colored blue, and pressing Enter key on it will callx-open-me
What is Text Property
Text Property is a property list attached to text.
A property list is a list but interpreted as key and value pairs. Like this:
'(key1 val1 key2 val2 …)
[see Elisp: Property List]
When a property list is attached to text, some keys have special meaning that are predefined by emacs.
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: How to Define 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 Basics] '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 SOLIDUS / to have string syntax, so regex string are colored as string. [see Elisp: Syntax Table]
'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: How to Create Keymap for Major Mode]
For a complete list, see (info "(elisp) Special Properties")
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
(info "(elisp) Text Properties")