docs: extmark indexing #12742

Extmarks mostly use api-indexing, except for nvim_buf_get_extmarks(),
which uses api-indexing with inclusive ranges.

ref #11456
This commit is contained in:
Patrice Peterson 2021-09-10 17:41:51 -07:00 committed by Justin M. Keyes
parent 9697023a0b
commit 9b553ad28d
3 changed files with 63 additions and 21 deletions

View File

@ -127,6 +127,10 @@ Special types (msgpack EXT) ~
Most of the API uses 0-based indices, and ranges are end-exclusive. For the Most of the API uses 0-based indices, and ranges are end-exclusive. For the
end of a range, -1 denotes the last line/column. end of a range, -1 denotes the last line/column.
Exception: the following API functions use 0-based, end-inclusive indexing:
|nvim_buf_get_extmarks()|
Exception: the following API functions use "mark-like" indexing (1-based Exception: the following API functions use "mark-like" indexing (1-based
lines, 0-based columns): lines, 0-based columns):
@ -443,6 +447,41 @@ in the buffer. They could be used to represent cursors, folds, misspelled
words, and anything else that needs to track a logical location in the buffer words, and anything else that needs to track a logical location in the buffer
over time. over time.
Extmarks use |api-indexing|, and you can think of them as cursor positions.
For example, an extmark at position 1 exists between the first and second
character on a line, similar to a bar cursor. For that reason, the maximum
extmark index on a line is 1 larger than the character index: >
f o o b a r <-- line contents (with spaces for illustration purposes)
0 1 2 3 4 5 <-- character positions (0-based)
0 1 2 3 4 5 6 <-- extmark positions (0-based)
Note that extmarks have "forward gravity": If you place the cursor directly on
an extmark position and enter some text, the extmark gets pushed forward. >
f o o|b a r <-- line (| = cursor)
3 <-- extmark
(Now add "z" at cursor position):
f o o z|b a r <-- line (| = cursor)
4 <-- extmark
If your extmark is on the last possible index of a line (7 in the above
"foozbar" example) and you enter a newline at that point, the extmark will
accordingly be pushed to the next line: >
f o o z b a r| <-- line (| = cursor)
7 <-- extmark
(Now add <cr> at cursor position):
f o o z b a r <-- first line
<-- extmarks (none present)
| <-- second line (| = cursor)
0 <-- new extmark position
Example: Example:
We will set an extmark at the first row and third column. |api-indexing| is We will set an extmark at the first row and third column. |api-indexing| is
@ -779,10 +818,9 @@ nvim_feedkeys({keys}, {mode}, {escape_csi}) *nvim_feedkeys()*
On execution error: does not fail, but updates v:errmsg. On execution error: does not fail, but updates v:errmsg.
If you need to input sequences like <C-o> use To input sequences like <C-o> use |nvim_replace_termcodes()|
|nvim_replace_termcodes| to replace the termcodes and then (typically with escape_csi=true) to replace the keycodes. Then
pass the resulting string to nvim_feedkeys. You'll also want pass the result to nvim_feedkeys().
to enable escape_csi.
Example: > Example: >
:let key = nvim_replace_termcodes("<C-o>", v:true, v:false, v:true) :let key = nvim_replace_termcodes("<C-o>", v:true, v:false, v:true)
@ -2072,7 +2110,7 @@ nvim_buf_get_commands({buffer}, {opts}) *nvim_buf_get_commands()*
*nvim_buf_get_extmark_by_id()* *nvim_buf_get_extmark_by_id()*
nvim_buf_get_extmark_by_id({buffer}, {ns_id}, {id}, {opts}) nvim_buf_get_extmark_by_id({buffer}, {ns_id}, {id}, {opts})
Returns position for a given extmark id Gets the position (0-indexed) of an extmark {id}.
Parameters: ~ Parameters: ~
{buffer} Buffer handle, or 0 for current buffer {buffer} Buffer handle, or 0 for current buffer
@ -2082,7 +2120,8 @@ nvim_buf_get_extmark_by_id({buffer}, {ns_id}, {id}, {opts})
• details: Whether to include the details dict • details: Whether to include the details dict
Return: ~ Return: ~
(row, col) tuple or empty list () if extmark id was absent 0-indexed (row, col) tuple or empty list () if extmark id
was absent
*nvim_buf_get_extmarks()* *nvim_buf_get_extmarks()*
nvim_buf_get_extmarks({buffer}, {ns_id}, {start}, {end}, {opts}) nvim_buf_get_extmarks({buffer}, {ns_id}, {start}, {end}, {opts})
@ -2122,10 +2161,12 @@ nvim_buf_get_extmarks({buffer}, {ns_id}, {start}, {end}, {opts})
Parameters: ~ Parameters: ~
{buffer} Buffer handle, or 0 for current buffer {buffer} Buffer handle, or 0 for current buffer
{ns_id} Namespace id from |nvim_create_namespace()| {ns_id} Namespace id from |nvim_create_namespace()|
{start} Start of range, given as (row, col) or valid {start} Start of range, given as 0-indexed (row, col) or
extmark id (whose position defines the bound) valid extmark id (whose position defines the
{end} End of range, given as (row, col) or valid bound)
extmark id (whose position defines the bound) {end} End of range (inclusive), given as 0-indexed
(row, col) or valid extmark id (whose position
defines the bound)
{opts} Optional parameters. Keys: {opts} Optional parameters. Keys:
• limit: Maximum number of marks to return • limit: Maximum number of marks to return
• details Whether to include the details dict • details Whether to include the details dict

View File

@ -1232,7 +1232,7 @@ static Array extmark_to_array(ExtmarkInfo extmark, bool id, bool add_dict)
return rv; return rv;
} }
/// Returns position for a given extmark id /// Gets the position (0-indexed) of an extmark {id}.
/// ///
/// @param buffer Buffer handle, or 0 for current buffer /// @param buffer Buffer handle, or 0 for current buffer
/// @param ns_id Namespace id from |nvim_create_namespace()| /// @param ns_id Namespace id from |nvim_create_namespace()|
@ -1240,7 +1240,8 @@ static Array extmark_to_array(ExtmarkInfo extmark, bool id, bool add_dict)
/// @param opts Optional parameters. Keys: /// @param opts Optional parameters. Keys:
/// - details: Whether to include the details dict /// - details: Whether to include the details dict
/// @param[out] err Error details, if any /// @param[out] err Error details, if any
/// @return (row, col) tuple or empty list () if extmark id was absent /// @return 0-indexed (row, col) tuple or empty list () if extmark id was
/// absent
ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id, ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
Integer id, Dictionary opts, Integer id, Dictionary opts,
Error *err) Error *err)
@ -1320,10 +1321,10 @@ ArrayOf(Integer) nvim_buf_get_extmark_by_id(Buffer buffer, Integer ns_id,
/// ///
/// @param buffer Buffer handle, or 0 for current buffer /// @param buffer Buffer handle, or 0 for current buffer
/// @param ns_id Namespace id from |nvim_create_namespace()| /// @param ns_id Namespace id from |nvim_create_namespace()|
/// @param start Start of range, given as (row, col) or valid extmark id /// @param start Start of range, given as 0-indexed (row, col) or valid
/// (whose position defines the bound) /// extmark id (whose position defines the bound)
/// @param end End of range, given as (row, col) or valid extmark id /// @param end End of range (inclusive), given as 0-indexed (row, col) or
/// (whose position defines the bound) /// valid extmark id (whose position defines the bound)
/// @param opts Optional parameters. Keys: /// @param opts Optional parameters. Keys:
/// - limit: Maximum number of marks to return /// - limit: Maximum number of marks to return
/// - details Whether to include the details dict /// - details Whether to include the details dict
@ -1424,8 +1425,8 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id,
/// ///
/// @param buffer Buffer handle, or 0 for current buffer /// @param buffer Buffer handle, or 0 for current buffer
/// @param ns_id Namespace id from |nvim_create_namespace()| /// @param ns_id Namespace id from |nvim_create_namespace()|
/// @param line Line where to place the mark, 0-based /// @param line Line where to place the mark, 0-based. |api-indexing|
/// @param col Column where to place the mark, 0-based /// @param col Column where to place the mark, 0-based. |api-indexing|
/// @param opts Optional parameters. /// @param opts Optional parameters.
/// - id : id of the extmark to edit. /// - id : id of the extmark to edit.
/// - end_line : ending line of the mark, 0-based inclusive. /// - end_line : ending line of the mark, 0-based inclusive.

View File

@ -275,9 +275,9 @@ static void on_redraw_event(void **argv)
/// ///
/// On execution error: does not fail, but updates v:errmsg. /// On execution error: does not fail, but updates v:errmsg.
/// ///
/// If you need to input sequences like <C-o> use |nvim_replace_termcodes| to /// To input sequences like <C-o> use |nvim_replace_termcodes()| (typically
/// replace the termcodes and then pass the resulting string to nvim_feedkeys. /// with escape_csi=true) to replace |keycodes|, then pass the result to
/// You'll also want to enable escape_csi. /// nvim_feedkeys().
/// ///
/// Example: /// Example:
/// <pre> /// <pre>