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 return.), 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 "r") (put-text-property begin end 'font-lock-face '(:foreground "red")))
Select a region, then
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.
(defun x-open-me () "open a file, using current line as file name/path" (interactive) (find-file (buffer-substring-no-properties (line-beginning-position) (line-end-position)))) (defvar x-keymap nil "sample keymap") (setq x-keymap (make-sparse-keymap)) (define-key x-keymap (kbd "RET") 'x-open-me) (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))
To try the above code:
- Open a new file, with some lines being 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 call
What's 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 Emacs Lisp: 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:
'face→ for syntax coloring. Value is a face. This property is automatically updated/managed by
font-lock-mode. 〔►see Emacs Lisp: Font Lock Mode Basics〕
'font-lock-face→ for syntax coloring, but overrides the
'faceproperty. Value is a face. 〔►see Emacs Lisp: How to Define Face〕
'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 Tutorial〕
'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
Writing Major Mode Topics
- How to Write a Emacs Major Mode for Syntax Coloring
- Emacs Lisp: html6-mode
- Emacs Lisp: Font Lock Mode Basics
- Emacs Lisp: How to Define Face
- Emacs Lisp: How to Color Comment in Major Mode
- Emacs Lisp: How to Write Comment Command in Major Mode
- Emacs Lisp: How to Write Your Own Comment Command from Scratch
- Emacs Lisp: How to Write Keyword Completion Command
- Emacs Lisp: How to Create Keymap for Major Mode
- Emacs Lisp: Create Abbrev and Templates for Major Mode
- Emacs Lisp: Text Properties
- Emacs Lisp: Overlay Highlighting
- Emacs: Lookup Google, Dictionary, Documentation
- Emacs Lisp: How to Name Your Major Mode
- Emacs Lisp: What's “feature”?
- Emacs Lisp: require, load, load-file, autoload, feature, Explained