Emacs Lisp: 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 xyz-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
xyz-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 xyz-keymap (make-sparse-keymap)) (define-key xyz-keymap (kbd "RET") (lambda () (find-file (thing-at-point 'filename) ))) (defun xyz-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 xyz-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
xyz-add-prop
. The region will be colored blue, and pressing Enter key on it will callxyz-open-me
What is Text Property
Text Property is a Property List attached to text.
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 Emacs Lisp: 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 Emacs Lisp: 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 Emacs Lisp: 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 Emacs Lisp: 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")