Elisp: Text Properties

By Xah Lee. Date: . Last updated: .

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:

  1. Open a new file, insert some text that contains file path.
  2. 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 x-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 by font-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")

Video Tutorial

XahTV 2020-08-21 emacs lisp, write command to highlight text

If you have a question, put $5 at patreon and message me on xah discord.
Or support me by Buy Xah Emacs Tutorial

Emacs Tutorial

Emacs Init

Emacs Keys

ELisp

ELisp Examples

ELisp Write Major Mode


ELisp Write Major Mode

Basics

Package Name/Load

Syntax Table