2019-08-31 16:20:32 +02:00
|
|
|
*textprop.txt* For Vim version 8.1. Last change: 2019 Aug 25
|
2018-12-13 22:20:09 +01:00
|
|
|
|
|
|
|
|
|
|
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
|
|
|
|
|
|
|
|
2019-05-09 19:16:22 +02:00
|
|
|
Displaying text with properties attached. *textprop* *text-properties*
|
2018-12-13 22:20:09 +01:00
|
|
|
|
|
|
|
THIS IS UNDER DEVELOPMENT - ANYTHING MAY STILL CHANGE *E967*
|
|
|
|
|
|
|
|
What is not working yet:
|
|
|
|
- Adjusting column/length when inserting text
|
|
|
|
- Text properties spanning more than one line
|
|
|
|
- prop_find()
|
|
|
|
|
|
|
|
|
|
|
|
1. Introduction |text-prop-intro|
|
|
|
|
2. Functions |text-prop-functions|
|
2019-01-17 16:07:22 +01:00
|
|
|
3. When text changes |text-prop-changes|
|
2018-12-13 22:20:09 +01:00
|
|
|
|
|
|
|
|
|
|
|
{not able to use text properties when the |+textprop| feature was
|
|
|
|
disabled at compile time}
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
1. Introduction *text-prop-intro*
|
|
|
|
|
|
|
|
Text properties can be attached to text in a buffer. They will move with the
|
|
|
|
text: If lines are deleted or inserted the properties move with the text they
|
|
|
|
are attached to. Also when inserting/deleting text in the line before the
|
|
|
|
text property. And when inserting/deleting text inside the text property, it
|
|
|
|
will increase/decrease in size.
|
|
|
|
|
|
|
|
The main use for text properties is to highlight text. This can be seen as a
|
|
|
|
replacement for syntax highlighting. Instead of defining patterns to match
|
|
|
|
the text, the highlighting is set by a script, possibly using the output of an
|
|
|
|
external parser. This only needs to be done once, not every time when
|
|
|
|
redrawing the screen, thus can be much faster, after the initial cost of
|
|
|
|
attaching the text properties.
|
|
|
|
|
|
|
|
Text properties can also be used for other purposes to identify text. For
|
|
|
|
example, add a text property on a function name, so that a search can be
|
|
|
|
defined to jump to the next/previous function.
|
|
|
|
|
|
|
|
A text property is attached at a specific line and column, and has a specified
|
|
|
|
length. The property can span multiple lines.
|
|
|
|
|
|
|
|
A text property has these fields:
|
|
|
|
"id" a number to be used as desired
|
|
|
|
"type" the name of a property type
|
|
|
|
|
|
|
|
|
|
|
|
Property Types ~
|
|
|
|
*E971*
|
|
|
|
A text property normally has the name of a property type, which defines
|
|
|
|
how to highlight the text. The property type can have these entries:
|
|
|
|
"highlight" name of the highlight group to use
|
2019-05-05 15:48:00 +02:00
|
|
|
"combine" when TRUE the text property highlighting is combined
|
2019-06-22 02:13:00 +02:00
|
|
|
with any syntax highlighting, when omitted or FALSE the
|
2019-05-05 15:48:00 +02:00
|
|
|
text property highlighting replaces the syntax
|
|
|
|
highlighting
|
2018-12-13 22:20:09 +01:00
|
|
|
"priority" when properties overlap, the one with the highest
|
|
|
|
priority will be used.
|
|
|
|
"start_incl" when TRUE inserts at the start position will be
|
|
|
|
included in the text property
|
|
|
|
"end_incl" when TRUE inserts at the end position will be
|
|
|
|
included in the text property
|
|
|
|
|
|
|
|
|
|
|
|
Example ~
|
|
|
|
|
|
|
|
Suppose line 11 in a buffer has this text (excluding the indent):
|
|
|
|
|
|
|
|
The number 123 is smaller than 4567.
|
|
|
|
|
2019-01-01 15:32:17 +01:00
|
|
|
To highlight the numbers in this text: >
|
2018-12-13 22:20:09 +01:00
|
|
|
call prop_type_add('number', {'highlight': 'Constant'})
|
2018-12-18 21:41:50 +01:00
|
|
|
call prop_add(11, 12, {'length': 3, 'type': 'number'})
|
|
|
|
call prop_add(11, 32, {'length': 4, 'type': 'number'})
|
2018-12-13 22:20:09 +01:00
|
|
|
|
2019-01-01 15:32:17 +01:00
|
|
|
Try inserting or deleting lines above the text, you will see that the text
|
|
|
|
properties stick to the text, thus the line number is adjusted as needed.
|
|
|
|
|
2018-12-13 22:20:09 +01:00
|
|
|
Setting "start_incl" and "end_incl" is useful when white space surrounds the
|
|
|
|
text, e.g. for a function name. Using false is useful when the text starts
|
|
|
|
and/or ends with a specific character, such as the quote surrounding a string.
|
|
|
|
|
|
|
|
func FuncName(arg) ~
|
|
|
|
^^^^^^^^ property with start_incl and end_incl set
|
|
|
|
|
|
|
|
var = "text"; ~
|
|
|
|
^^^^^^ property with start_incl and end_incl not set
|
|
|
|
|
|
|
|
Nevertheless, when text is inserted or deleted the text may need to be parsed
|
2018-12-18 21:41:50 +01:00
|
|
|
and the text properties updated. But this can be done asynchronously.
|
2018-12-13 22:20:09 +01:00
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
2. Functions *text-prop-functions*
|
|
|
|
|
|
|
|
Manipulating text property types:
|
|
|
|
|
|
|
|
prop_type_add({name}, {props}) define a new property type
|
|
|
|
prop_type_change({name}, {props}) change an existing property type
|
|
|
|
prop_type_delete({name} [, {props}]) delete a property type
|
|
|
|
prop_type_get([{name} [, {props}]) get property type values
|
|
|
|
prop_type_list([{props}]) get list of property types
|
|
|
|
|
|
|
|
|
|
|
|
Manipulating text properties:
|
|
|
|
|
|
|
|
prop_add({lnum}, {col}, {props}) add a text property
|
2018-12-27 23:59:26 +01:00
|
|
|
prop_clear({lnum} [, {lnum-end} [, {bufnr}]])
|
2018-12-13 22:20:09 +01:00
|
|
|
remove all text properties
|
|
|
|
prop_find({props} [, {direction}]) search for a text property
|
|
|
|
prop_list({lnum} [, {props}) text properties in {lnum}
|
2018-12-27 23:59:26 +01:00
|
|
|
prop_remove({props} [, {lnum} [, {lnum-end}]])
|
2018-12-13 22:20:09 +01:00
|
|
|
remove a text property
|
|
|
|
|
2019-07-21 16:42:00 +02:00
|
|
|
*prop_add()* *E965*
|
|
|
|
prop_add({lnum}, {col}, {props})
|
|
|
|
Attach a text property at position {lnum}, {col}. {col} is
|
|
|
|
counted in bytes, use one for the first column.
|
|
|
|
If {lnum} is invalid an error is given. *E966*
|
|
|
|
If {col} is invalid an error is given. *E964*
|
|
|
|
|
|
|
|
{props} is a dictionary with these fields:
|
|
|
|
length length of text in bytes, can only be used
|
|
|
|
for a property that does not continue in
|
|
|
|
another line; can be zero
|
|
|
|
end_lnum line number for the end of text
|
|
|
|
end_col column just after the text; not used when
|
|
|
|
"length" is present; when {col} and "end_col"
|
|
|
|
are equal, and "end_lnum" is omitted or equal
|
|
|
|
to {lnum}, this is a zero-width text property
|
|
|
|
bufnr buffer to add the property to; when omitted
|
|
|
|
the current buffer is used
|
|
|
|
id user defined ID for the property; when omitted
|
|
|
|
zero is used
|
|
|
|
type name of the text property type
|
|
|
|
All fields except "type" are optional.
|
|
|
|
|
|
|
|
It is an error when both "length" and "end_lnum" or "end_col"
|
|
|
|
are given. Either use "length" or "end_col" for a property
|
|
|
|
within one line, or use "end_lnum" and "end_col" for a
|
|
|
|
property that spans more than one line.
|
|
|
|
When neither "length" nor "end_col" are given the property
|
|
|
|
will be zero-width. That means it will not be highlighted but
|
|
|
|
will move with the text, as a kind of mark.
|
|
|
|
The property can end exactly at the last character of the
|
|
|
|
text, or just after it. In the last case, if text is appended
|
|
|
|
to the line, the text property size will increase, also when
|
|
|
|
the property type does not have "end_incl" set.
|
|
|
|
|
|
|
|
"type" will first be looked up in the buffer the property is
|
|
|
|
added to. When not found, the global property types are used.
|
|
|
|
If not found an error is given.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_clear({lnum} [, {lnum-end} [, {props}]]) *prop_clear()*
|
|
|
|
Remove all text properties from line {lnum}.
|
|
|
|
When {lnum-end} is given, remove all text properties from line
|
|
|
|
{lnum} to {lnum-end} (inclusive).
|
|
|
|
|
|
|
|
When {props} contains a "bufnr" item use this buffer,
|
|
|
|
otherwise use the current buffer.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
*prop_find()*
|
|
|
|
prop_find({props} [, {direction}])
|
2019-08-31 16:20:32 +02:00
|
|
|
{not implemented yet}
|
2019-07-21 16:42:00 +02:00
|
|
|
Search for a text property as specified with {props}:
|
|
|
|
id property with this ID
|
|
|
|
type property with this type name
|
|
|
|
bufnr buffer to search in; when present a
|
|
|
|
start position with "lnum" and "col"
|
|
|
|
must be given; when omitted the
|
|
|
|
current buffer is used
|
|
|
|
lnum start in this line (when omitted start
|
|
|
|
at the cursor)
|
|
|
|
col start at this column (when omitted
|
|
|
|
and "lnum" is given: use column 1,
|
|
|
|
otherwise start at the cursor)
|
|
|
|
skipstart do not look for a match at the start
|
|
|
|
position
|
|
|
|
|
|
|
|
{direction} can be "f" for forward and "b" for backward. When
|
|
|
|
omitted forward search is performed.
|
|
|
|
|
|
|
|
If a match is found then a Dict is returned with the entries
|
|
|
|
as with prop_list(), and additionally an "lnum" entry.
|
|
|
|
If no match is found then an empty Dict is returned.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_list({lnum} [, {props}]) *prop_list()*
|
|
|
|
Return a List with all text properties in line {lnum}.
|
|
|
|
|
|
|
|
When {props} contains a "bufnr" item, use this buffer instead
|
|
|
|
of the current buffer.
|
|
|
|
|
|
|
|
The properties are ordered by starting column and priority.
|
|
|
|
Each property is a Dict with these entries:
|
|
|
|
col starting column
|
|
|
|
length length in bytes, one more if line break is
|
|
|
|
included
|
|
|
|
id property ID
|
|
|
|
type name of the property type, omitted if
|
|
|
|
the type was deleted
|
|
|
|
start when TRUE property starts in this line
|
|
|
|
end when TRUE property ends in this line
|
|
|
|
|
|
|
|
When "start" is zero the property started in a previous line,
|
|
|
|
the current one is a continuation.
|
|
|
|
When "end" is zero the property continues in the next line.
|
|
|
|
The line break after this line is included.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
*prop_remove()* *E968*
|
|
|
|
prop_remove({props} [, {lnum} [, {lnum-end}]])
|
|
|
|
Remove a matching text property from line {lnum}. When
|
|
|
|
{lnum-end} is given, remove matching text properties from line
|
|
|
|
{lnum} to {lnum-end} (inclusive).
|
|
|
|
When {lnum} is omitted remove matching text properties from
|
|
|
|
all lines.
|
|
|
|
|
|
|
|
{props} is a dictionary with these fields:
|
|
|
|
id remove text properties with this ID
|
|
|
|
type remove text properties with this type name
|
|
|
|
bufnr use this buffer instead of the current one
|
|
|
|
all when TRUE remove all matching text properties,
|
|
|
|
not just the first one
|
|
|
|
A property matches when either "id" or "type" matches.
|
|
|
|
If buffer "bufnr" does not exist you get an error message.
|
|
|
|
If buffer "bufnr" is not loaded then nothing happens.
|
|
|
|
|
|
|
|
Returns the number of properties that were removed.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_type_add({name}, {props}) *prop_type_add()* *E969* *E970*
|
|
|
|
Add a text property type {name}. If a property type with this
|
2019-08-31 16:20:32 +02:00
|
|
|
name already exists an error is given. Nothing is returned.
|
2019-07-21 16:42:00 +02:00
|
|
|
{props} is a dictionary with these optional fields:
|
|
|
|
bufnr define the property only for this buffer; this
|
|
|
|
avoids name collisions and automatically
|
|
|
|
clears the property types when the buffer is
|
|
|
|
deleted.
|
|
|
|
highlight name of highlight group to use
|
|
|
|
priority when a character has multiple text
|
|
|
|
properties the one with the highest priority
|
|
|
|
will be used; negative values can be used, the
|
|
|
|
default priority is zero
|
|
|
|
combine when TRUE combine the highlight with any
|
|
|
|
syntax highlight; when omitted or FALSE syntax
|
|
|
|
highlight will not be used
|
|
|
|
start_incl when TRUE inserts at the start position will
|
|
|
|
be included in the text property
|
|
|
|
end_incl when TRUE inserts at the end position will be
|
|
|
|
included in the text property
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_type_change({name}, {props}) *prop_type_change()*
|
|
|
|
Change properties of an existing text property type. If a
|
|
|
|
property with this name does not exist an error is given.
|
|
|
|
The {props} argument is just like |prop_type_add()|.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_type_delete({name} [, {props}]) *prop_type_delete()*
|
|
|
|
Remove the text property type {name}. When text properties
|
|
|
|
using the type {name} are still in place, they will not have
|
|
|
|
an effect and can no longer be removed by name.
|
|
|
|
|
|
|
|
{props} can contain a "bufnr" item. When it is given, delete
|
|
|
|
a property type from this buffer instead of from the global
|
|
|
|
property types.
|
|
|
|
|
|
|
|
When text property type {name} is not found there is no error.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_type_get([{name} [, {props}]) *prop_type_get()*
|
|
|
|
Returns the properties of property type {name}. This is a
|
|
|
|
dictionary with the same fields as was given to
|
|
|
|
prop_type_add().
|
|
|
|
When the property type {name} does not exist, an empty
|
|
|
|
dictionary is returned.
|
|
|
|
|
|
|
|
{props} can contain a "bufnr" item. When it is given, use
|
|
|
|
this buffer instead of the global property types.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
|
|
|
prop_type_list([{props}]) *prop_type_list()*
|
|
|
|
Returns a list with all property type names.
|
|
|
|
|
|
|
|
{props} can contain a "bufnr" item. When it is given, use
|
|
|
|
this buffer instead of the global property types.
|
|
|
|
|
|
|
|
See |text-properties| for information about text properties.
|
|
|
|
|
|
|
|
|
2019-01-17 16:07:22 +01:00
|
|
|
==============================================================================
|
|
|
|
3. When text changes *text-prop-changes*
|
|
|
|
|
|
|
|
Vim will do its best to keep the text properties on the text where it was
|
|
|
|
attached. When inserting or deleting text the properties after the change
|
|
|
|
will move accordingly.
|
|
|
|
|
|
|
|
When text is deleted and a text property no longer includes any text, it is
|
|
|
|
deleted. However, a text property that was defined as zero-width will remain,
|
|
|
|
unless the whole line is deleted.
|
2019-08-13 22:27:32 +02:00
|
|
|
` *E275*
|
|
|
|
When a buffer is unloaded, all the text properties are gone. There is no way
|
|
|
|
to store the properties in a file. You can only re-create them. When a
|
|
|
|
buffer is hidden the text is preserved and so are the text properties. It is
|
|
|
|
not possible to add text properties to an unloaded buffer.
|
2019-01-17 16:07:22 +01:00
|
|
|
|
|
|
|
When using replace mode, the text properties stay on the same character
|
|
|
|
positions, even though the characters themselves change.
|
|
|
|
|
2019-05-26 21:33:31 +02:00
|
|
|
To update text properties after the text was changed, install a callback with
|
|
|
|
`listener_add()`. E.g, if your plugin does spell checking, you can have the
|
|
|
|
callback update spelling mistakes in the changed text. Vim will move the
|
|
|
|
properties below the changed text, so that they still highlight the same text,
|
|
|
|
thus you don't need to update these.
|
|
|
|
|
2019-01-17 16:07:22 +01:00
|
|
|
|
2019-05-09 19:16:22 +02:00
|
|
|
Text property columns are not updated: ~
|
2019-01-17 16:07:22 +01:00
|
|
|
|
|
|
|
- When setting the line with |setline()| or through an interface, such as Lua,
|
2019-05-09 19:16:22 +02:00
|
|
|
Tcl or Python. Vim does not know what text got inserted or deleted.
|
2019-01-17 16:07:22 +01:00
|
|
|
|
2018-12-13 22:20:09 +01:00
|
|
|
|
|
|
|
vim:tw=78:ts=8:noet:ft=help:norl:
|