mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
feat(api): deprecate nvim_buf_add_highlight()
This was kept for a while as it was a useful short hand and initially matched what highlights what actually properly implemented. But now |vim.hl.range()| is a better high-level shorthand with full support for native multi-line ranges.
This commit is contained in:
parent
71507281fb
commit
19b25f3fea
@ -406,18 +406,9 @@ Another use case are plugins that show output in an append-only buffer, and
|
|||||||
want to add highlights to the outputs. Highlight data cannot be preserved
|
want to add highlights to the outputs. Highlight data cannot be preserved
|
||||||
on writing and loading a buffer to file, nor in undo/redo cycles.
|
on writing and loading a buffer to file, nor in undo/redo cycles.
|
||||||
|
|
||||||
Highlights are registered using the |nvim_buf_add_highlight()| function. If an
|
Highlights are registered using the |nvim_buf_set_extmark()| function, which
|
||||||
external highlighter plugin wants to add many highlights in a batch,
|
adds highlights as |extmarks|. If highlights need to be tracked or manipulated
|
||||||
performance can be improved by calling |nvim_buf_add_highlight()| as an
|
after adding them, the returned |extmark| id can be used. >lua
|
||||||
asynchronous notification, after first (synchronously) requesting a source id.
|
|
||||||
|
|
||||||
|nvim_buf_add_highlight()| adds highlights as |extmarks|. If highlights need to
|
|
||||||
be tracked or manipulated after adding them, it is better to use
|
|
||||||
|nvim_buf_set_extmark()| directly, as this function returns the placed |extmark|
|
|
||||||
id. Thus, instead of >lua
|
|
||||||
vim.api.nvim_buf_add_highlight(buf, ns_id, hl_group, line, col_start, col_end)
|
|
||||||
<
|
|
||||||
use >lua
|
|
||||||
-- create the highlight through an extmark
|
-- create the highlight through an extmark
|
||||||
extid = vim.api.nvim_buf_set_extmark(buf, ns_id, line, col_start, {end_col = col_end, hl_group = hl_group})
|
extid = vim.api.nvim_buf_set_extmark(buf, ns_id, line, col_start, {end_col = col_end, hl_group = hl_group})
|
||||||
|
|
||||||
@ -428,29 +419,7 @@ use >lua
|
|||||||
vim.api.nvim_buf_set_extmark(buf, ns_id, NEW_LINE, col_start, {end_col = col_end, hl_group = NEW_HL_GROUP, id = extid})
|
vim.api.nvim_buf_set_extmark(buf, ns_id, NEW_LINE, col_start, {end_col = col_end, hl_group = NEW_HL_GROUP, id = extid})
|
||||||
<
|
<
|
||||||
|
|
||||||
Example using the Python API client (|pynvim|):
|
See also |vim.hl.range()|.
|
||||||
>python
|
|
||||||
src = vim.new_highlight_source()
|
|
||||||
buf = vim.current.buffer
|
|
||||||
for i in range(5):
|
|
||||||
buf.add_highlight("String",i,0,-1,src_id=src)
|
|
||||||
# some time later ...
|
|
||||||
buf.clear_namespace(src)
|
|
||||||
<
|
|
||||||
If the highlights don't need to be deleted or updated, just pass -1 as
|
|
||||||
src_id (this is the default in python). Use |nvim_buf_clear_namespace()| to
|
|
||||||
clear highlights from a specific source, in a specific line range or the
|
|
||||||
entire buffer by passing in the line range 0, -1 (the latter is the default in
|
|
||||||
python as used above).
|
|
||||||
|
|
||||||
Example using the API from Vimscript: >vim
|
|
||||||
|
|
||||||
call nvim_buf_set_lines(0, 0, 0, v:true, ["test text"])
|
|
||||||
let src = nvim_buf_add_highlight(0, 0, "String", 1, 0, 4)
|
|
||||||
call nvim_buf_add_highlight(0, src, "Identifier", 0, 5, -1)
|
|
||||||
" some time later ...
|
|
||||||
call nvim_buf_clear_namespace(0, src, 0, -1)
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Floating windows *api-floatwin*
|
Floating windows *api-floatwin*
|
||||||
@ -2491,42 +2460,6 @@ nvim_buf_set_var({buffer}, {name}, {value}) *nvim_buf_set_var()*
|
|||||||
==============================================================================
|
==============================================================================
|
||||||
Extmark Functions *api-extmark*
|
Extmark Functions *api-extmark*
|
||||||
|
|
||||||
*nvim_buf_add_highlight()*
|
|
||||||
nvim_buf_add_highlight({buffer}, {ns_id}, {hl_group}, {line}, {col_start},
|
|
||||||
{col_end})
|
|
||||||
Adds a highlight to buffer.
|
|
||||||
|
|
||||||
Useful for plugins that dynamically generate highlights to a buffer (like
|
|
||||||
a semantic highlighter or linter). The function adds a single highlight to
|
|
||||||
a buffer. Unlike |matchaddpos()| highlights follow changes to line
|
|
||||||
numbering (as lines are inserted/removed above the highlighted line), like
|
|
||||||
signs and marks do.
|
|
||||||
|
|
||||||
Namespaces are used for batch deletion/updating of a set of highlights. To
|
|
||||||
create a namespace, use |nvim_create_namespace()| which returns a
|
|
||||||
namespace id. Pass it in to this function as `ns_id` to add highlights to
|
|
||||||
the namespace. All highlights in the same namespace can then be cleared
|
|
||||||
with single call to |nvim_buf_clear_namespace()|. If the highlight never
|
|
||||||
will be deleted by an API call, pass `ns_id = -1`.
|
|
||||||
|
|
||||||
As a shorthand, `ns_id = 0` can be used to create a new namespace for the
|
|
||||||
highlight, the allocated id is then returned. If `hl_group` is the empty
|
|
||||||
string no highlight is added, but a new `ns_id` is still returned. This is
|
|
||||||
supported for backwards compatibility, new code should use
|
|
||||||
|nvim_create_namespace()| to create a new empty namespace.
|
|
||||||
|
|
||||||
Parameters: ~
|
|
||||||
• {buffer} Buffer handle, or 0 for current buffer
|
|
||||||
• {ns_id} namespace to use or -1 for ungrouped highlight
|
|
||||||
• {hl_group} Name of the highlight group to use
|
|
||||||
• {line} Line to highlight (zero-indexed)
|
|
||||||
• {col_start} Start of (byte-indexed) column range to highlight
|
|
||||||
• {col_end} End of (byte-indexed) column range to highlight, or -1 to
|
|
||||||
highlight to end of line
|
|
||||||
|
|
||||||
Return: ~
|
|
||||||
The ns_id that was used
|
|
||||||
|
|
||||||
*nvim_buf_clear_namespace()*
|
*nvim_buf_clear_namespace()*
|
||||||
nvim_buf_clear_namespace({buffer}, {ns_id}, {line_start}, {line_end})
|
nvim_buf_clear_namespace({buffer}, {ns_id}, {line_start}, {line_end})
|
||||||
Clears |namespace|d objects (highlights, |extmarks|, virtual text) from a
|
Clears |namespace|d objects (highlights, |extmarks|, virtual text) from a
|
||||||
@ -2764,7 +2697,7 @@ nvim_create_namespace({name}) *nvim_create_namespace()*
|
|||||||
Creates a new namespace or gets an existing one. *namespace*
|
Creates a new namespace or gets an existing one. *namespace*
|
||||||
|
|
||||||
Namespaces are used for buffer highlights and virtual text, see
|
Namespaces are used for buffer highlights and virtual text, see
|
||||||
|nvim_buf_add_highlight()| and |nvim_buf_set_extmark()|.
|
|nvim_buf_set_extmark()|.
|
||||||
|
|
||||||
Namespaces can be named or anonymous. If `name` matches an existing
|
Namespaces can be named or anonymous. If `name` matches an existing
|
||||||
namespace, the associated id is returned. If `name` is an empty string a
|
namespace, the associated id is returned. If `name` is an empty string a
|
||||||
|
@ -22,6 +22,7 @@ API
|
|||||||
• nvim_out_write() Use |nvim_echo()|.
|
• nvim_out_write() Use |nvim_echo()|.
|
||||||
• nvim_err_write() Use |nvim_echo()| with `{err=true}`.
|
• nvim_err_write() Use |nvim_echo()| with `{err=true}`.
|
||||||
• nvim_err_writeln() Use |nvim_echo()| with `{err=true}`.
|
• nvim_err_writeln() Use |nvim_echo()| with `{err=true}`.
|
||||||
|
• nvim_buf_add_highlight() Use |vim.hl.range()| or |nvim_buf_set_extmark()|
|
||||||
|
|
||||||
DIAGNOSTICS
|
DIAGNOSTICS
|
||||||
• *vim.diagnostic.goto_next()* Use |vim.diagnostic.jump()| with `{count=1, float=true}` instead.
|
• *vim.diagnostic.goto_next()* Use |vim.diagnostic.jump()| with `{count=1, float=true}` instead.
|
||||||
|
@ -1545,7 +1545,7 @@ Your command preview routine must implement this protocol:
|
|||||||
3. Add required highlights to the target buffers. If preview buffer is
|
3. Add required highlights to the target buffers. If preview buffer is
|
||||||
provided, add required highlights to the preview buffer as well. All
|
provided, add required highlights to the preview buffer as well. All
|
||||||
highlights must be added to the preview namespace which is provided as an
|
highlights must be added to the preview namespace which is provided as an
|
||||||
argument to the preview callback (see |nvim_buf_add_highlight()| and
|
argument to the preview callback (see |vim.hl.range()| and
|
||||||
|nvim_buf_set_extmark()| for help on how to add highlights to a namespace).
|
|nvim_buf_set_extmark()| for help on how to add highlights to a namespace).
|
||||||
4. Return an integer (0, 1, 2) which controls how Nvim behaves as follows:
|
4. Return an integer (0, 1, 2) which controls how Nvim behaves as follows:
|
||||||
0: No preview is shown.
|
0: No preview is shown.
|
||||||
@ -1574,13 +1574,12 @@ supports incremental command preview:
|
|||||||
|
|
||||||
if start_idx then
|
if start_idx then
|
||||||
-- Highlight the match
|
-- Highlight the match
|
||||||
vim.api.nvim_buf_add_highlight(
|
vim.hl.range(
|
||||||
buf,
|
buf,
|
||||||
preview_ns,
|
preview_ns,
|
||||||
'Substitute',
|
'Substitute',
|
||||||
line1 + i - 2,
|
{line1 + i - 2, start_idx - 1},
|
||||||
start_idx - 1,
|
{line1 + i - 2, end_idx},
|
||||||
end_idx
|
|
||||||
)
|
)
|
||||||
|
|
||||||
-- Add lines and set highlights in the preview buffer
|
-- Add lines and set highlights in the preview buffer
|
||||||
@ -1595,13 +1594,12 @@ supports incremental command preview:
|
|||||||
false,
|
false,
|
||||||
{ prefix .. line }
|
{ prefix .. line }
|
||||||
)
|
)
|
||||||
vim.api.nvim_buf_add_highlight(
|
vim.hl.range(
|
||||||
preview_buf,
|
preview_buf,
|
||||||
preview_ns,
|
preview_ns,
|
||||||
'Substitute',
|
'Substitute',
|
||||||
preview_buf_line,
|
{preview_buf_line, #prefix + start_idx - 1},
|
||||||
#prefix + start_idx - 1,
|
{preview_buf_line, #prefix + end_idx},
|
||||||
#prefix + end_idx
|
|
||||||
)
|
)
|
||||||
preview_buf_line = preview_buf_line + 1
|
preview_buf_line = preview_buf_line + 1
|
||||||
end
|
end
|
||||||
|
@ -562,7 +562,7 @@ with the following possible keys:
|
|||||||
"ui": Builtin UI highlight. |highlight-groups|
|
"ui": Builtin UI highlight. |highlight-groups|
|
||||||
"syntax": Highlight applied to a buffer by a syntax declaration or
|
"syntax": Highlight applied to a buffer by a syntax declaration or
|
||||||
other runtime/plugin functionality such as
|
other runtime/plugin functionality such as
|
||||||
|nvim_buf_add_highlight()|
|
|nvim_buf_set_extmark()|
|
||||||
"terminal": highlight from a process running in a |terminal-emulator|.
|
"terminal": highlight from a process running in a |terminal-emulator|.
|
||||||
Contains no further semantic information.
|
Contains no further semantic information.
|
||||||
`ui_name`: Highlight name from |highlight-groups|. Only for "ui" kind.
|
`ui_name`: Highlight name from |highlight-groups|. Only for "ui" kind.
|
||||||
|
39
runtime/lua/vim/_meta/api.lua
generated
39
runtime/lua/vim/_meta/api.lua
generated
@ -163,35 +163,14 @@ function vim.api.nvim__stats() end
|
|||||||
--- @return any
|
--- @return any
|
||||||
function vim.api.nvim__unpack(str) end
|
function vim.api.nvim__unpack(str) end
|
||||||
|
|
||||||
--- Adds a highlight to buffer.
|
--- @deprecated
|
||||||
---
|
--- @param buffer integer
|
||||||
--- Useful for plugins that dynamically generate highlights to a buffer
|
--- @param ns_id integer
|
||||||
--- (like a semantic highlighter or linter). The function adds a single
|
--- @param hl_group string
|
||||||
--- highlight to a buffer. Unlike `matchaddpos()` highlights follow changes to
|
--- @param line integer
|
||||||
--- line numbering (as lines are inserted/removed above the highlighted line),
|
--- @param col_start integer
|
||||||
--- like signs and marks do.
|
--- @param col_end integer
|
||||||
---
|
--- @return integer
|
||||||
--- Namespaces are used for batch deletion/updating of a set of highlights. To
|
|
||||||
--- create a namespace, use `nvim_create_namespace()` which returns a namespace
|
|
||||||
--- id. Pass it in to this function as `ns_id` to add highlights to the
|
|
||||||
--- namespace. All highlights in the same namespace can then be cleared with
|
|
||||||
--- single call to `nvim_buf_clear_namespace()`. If the highlight never will be
|
|
||||||
--- deleted by an API call, pass `ns_id = -1`.
|
|
||||||
---
|
|
||||||
--- As a shorthand, `ns_id = 0` can be used to create a new namespace for the
|
|
||||||
--- highlight, the allocated id is then returned. If `hl_group` is the empty
|
|
||||||
--- string no highlight is added, but a new `ns_id` is still returned. This is
|
|
||||||
--- supported for backwards compatibility, new code should use
|
|
||||||
--- `nvim_create_namespace()` to create a new empty namespace.
|
|
||||||
---
|
|
||||||
--- @param buffer integer Buffer handle, or 0 for current buffer
|
|
||||||
--- @param ns_id integer namespace to use or -1 for ungrouped highlight
|
|
||||||
--- @param hl_group string Name of the highlight group to use
|
|
||||||
--- @param line integer Line to highlight (zero-indexed)
|
|
||||||
--- @param col_start integer Start of (byte-indexed) column range to highlight
|
|
||||||
--- @param col_end integer End of (byte-indexed) column range to highlight,
|
|
||||||
--- or -1 to highlight to end of line
|
|
||||||
--- @return integer # The ns_id that was used
|
|
||||||
function vim.api.nvim_buf_add_highlight(buffer, ns_id, hl_group, line, col_start, col_end) end
|
function vim.api.nvim_buf_add_highlight(buffer, ns_id, hl_group, line, col_start, col_end) end
|
||||||
|
|
||||||
--- Activates buffer-update events on a channel, or as Lua callbacks.
|
--- Activates buffer-update events on a channel, or as Lua callbacks.
|
||||||
@ -987,7 +966,7 @@ function vim.api.nvim_create_buf(listed, scratch) end
|
|||||||
--- Creates a new namespace or gets an existing one. [namespace]()
|
--- Creates a new namespace or gets an existing one. [namespace]()
|
||||||
---
|
---
|
||||||
--- Namespaces are used for buffer highlights and virtual text, see
|
--- Namespaces are used for buffer highlights and virtual text, see
|
||||||
--- `nvim_buf_add_highlight()` and `nvim_buf_set_extmark()`.
|
--- `nvim_buf_set_extmark()`.
|
||||||
---
|
---
|
||||||
--- Namespaces can be named or anonymous. If `name` matches an existing
|
--- Namespaces can be named or anonymous. If `name` matches an existing
|
||||||
--- namespace, the associated id is returned. If `name` is an empty string
|
--- namespace, the associated id is returned. If `name` is an empty string
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "nvim/highlight.h"
|
#include "nvim/highlight.h"
|
||||||
#include "nvim/highlight_group.h"
|
#include "nvim/highlight_group.h"
|
||||||
#include "nvim/lua/executor.h"
|
#include "nvim/lua/executor.h"
|
||||||
|
#include "nvim/marktree.h"
|
||||||
#include "nvim/memory.h"
|
#include "nvim/memory.h"
|
||||||
#include "nvim/memory_defs.h"
|
#include "nvim/memory_defs.h"
|
||||||
#include "nvim/message.h"
|
#include "nvim/message.h"
|
||||||
@ -84,6 +85,17 @@ Integer nvim_buf_get_number(Buffer buffer, Error *err)
|
|||||||
return buf->b_fnum;
|
return buf->b_fnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t src2ns(Integer *src_id)
|
||||||
|
{
|
||||||
|
if (*src_id == 0) {
|
||||||
|
*src_id = nvim_create_namespace((String)STRING_INIT);
|
||||||
|
}
|
||||||
|
if (*src_id < 0) {
|
||||||
|
return (((uint32_t)1) << 31) - 1;
|
||||||
|
}
|
||||||
|
return (uint32_t)(*src_id);
|
||||||
|
}
|
||||||
|
|
||||||
/// Clears highlights and virtual text from namespace and range of lines
|
/// Clears highlights and virtual text from namespace and range of lines
|
||||||
///
|
///
|
||||||
/// @deprecated use |nvim_buf_clear_namespace()|.
|
/// @deprecated use |nvim_buf_clear_namespace()|.
|
||||||
@ -102,6 +114,80 @@ void nvim_buf_clear_highlight(Buffer buffer, Integer ns_id, Integer line_start,
|
|||||||
nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
|
nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Adds a highlight to buffer.
|
||||||
|
///
|
||||||
|
/// @deprecated use |nvim_buf_set_extmark()| or |vim.hl.range()|
|
||||||
|
///
|
||||||
|
/// Namespaces are used for batch deletion/updating of a set of highlights. To
|
||||||
|
/// create a namespace, use |nvim_create_namespace()| which returns a namespace
|
||||||
|
/// id. Pass it in to this function as `ns_id` to add highlights to the
|
||||||
|
/// namespace. All highlights in the same namespace can then be cleared with
|
||||||
|
/// single call to |nvim_buf_clear_namespace()|. If the highlight never will be
|
||||||
|
/// deleted by an API call, pass `ns_id = -1`.
|
||||||
|
///
|
||||||
|
/// As a shorthand, `ns_id = 0` can be used to create a new namespace for the
|
||||||
|
/// highlight, the allocated id is then returned. If `hl_group` is the empty
|
||||||
|
/// string no highlight is added, but a new `ns_id` is still returned. This is
|
||||||
|
/// supported for backwards compatibility, new code should use
|
||||||
|
/// |nvim_create_namespace()| to create a new empty namespace.
|
||||||
|
///
|
||||||
|
/// @param buffer Buffer handle, or 0 for current buffer
|
||||||
|
/// @param ns_id namespace to use or -1 for ungrouped highlight
|
||||||
|
/// @param hl_group Name of the highlight group to use
|
||||||
|
/// @param line Line to highlight (zero-indexed)
|
||||||
|
/// @param col_start Start of (byte-indexed) column range to highlight
|
||||||
|
/// @param col_end End of (byte-indexed) column range to highlight,
|
||||||
|
/// or -1 to highlight to end of line
|
||||||
|
/// @param[out] err Error details, if any
|
||||||
|
/// @return The ns_id that was used
|
||||||
|
Integer nvim_buf_add_highlight(Buffer buffer, Integer ns_id, String hl_group, Integer line,
|
||||||
|
Integer col_start, Integer col_end, Error *err)
|
||||||
|
FUNC_API_SINCE(1)
|
||||||
|
FUNC_API_DEPRECATED_SINCE(13)
|
||||||
|
{
|
||||||
|
buf_T *buf = find_buffer_by_handle(buffer, err);
|
||||||
|
if (!buf) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VALIDATE_RANGE((line >= 0 && line < MAXLNUM), "line number", {
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
VALIDATE_RANGE((col_start >= 0 && col_start <= MAXCOL), "column", {
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (col_end < 0 || col_end > MAXCOL) {
|
||||||
|
col_end = MAXCOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t ns = src2ns(&ns_id);
|
||||||
|
|
||||||
|
if (!(line < buf->b_ml.ml_line_count)) {
|
||||||
|
// safety check, we can't add marks outside the range
|
||||||
|
return ns_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hl_id = 0;
|
||||||
|
if (hl_group.size > 0) {
|
||||||
|
hl_id = syn_check_group(hl_group.data, hl_group.size);
|
||||||
|
} else {
|
||||||
|
return ns_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int end_line = (int)line;
|
||||||
|
if (col_end == MAXCOL) {
|
||||||
|
col_end = 0;
|
||||||
|
end_line++;
|
||||||
|
}
|
||||||
|
|
||||||
|
DecorInline decor = DECOR_INLINE_INIT;
|
||||||
|
decor.data.hl.hl_id = hl_id;
|
||||||
|
|
||||||
|
extmark_set(buf, ns, NULL, (int)line, (colnr_T)col_start, end_line, (colnr_T)col_end,
|
||||||
|
decor, MT_FLAG_DECOR_HL, true, false, false, false, NULL);
|
||||||
|
return ns_id;
|
||||||
|
}
|
||||||
/// Set the virtual text (annotation) for a buffer line.
|
/// Set the virtual text (annotation) for a buffer line.
|
||||||
///
|
///
|
||||||
/// @deprecated use nvim_buf_set_extmark to use full virtual text functionality.
|
/// @deprecated use nvim_buf_set_extmark to use full virtual text functionality.
|
||||||
|
@ -49,7 +49,7 @@ void api_extmark_free_all_mem(void)
|
|||||||
/// Creates a new namespace or gets an existing one. [namespace]()
|
/// Creates a new namespace or gets an existing one. [namespace]()
|
||||||
///
|
///
|
||||||
/// Namespaces are used for buffer highlights and virtual text, see
|
/// Namespaces are used for buffer highlights and virtual text, see
|
||||||
/// |nvim_buf_add_highlight()| and |nvim_buf_set_extmark()|.
|
/// |nvim_buf_set_extmark()|.
|
||||||
///
|
///
|
||||||
/// Namespaces can be named or anonymous. If `name` matches an existing
|
/// Namespaces can be named or anonymous. If `name` matches an existing
|
||||||
/// namespace, the associated id is returned. If `name` is an empty string
|
/// namespace, the associated id is returned. If `name` is an empty string
|
||||||
@ -857,95 +857,6 @@ Boolean nvim_buf_del_extmark(Buffer buffer, Integer ns_id, Integer id, Error *er
|
|||||||
return extmark_del_id(buf, (uint32_t)ns_id, (uint32_t)id);
|
return extmark_del_id(buf, (uint32_t)ns_id, (uint32_t)id);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t src2ns(Integer *src_id)
|
|
||||||
{
|
|
||||||
if (*src_id == 0) {
|
|
||||||
*src_id = nvim_create_namespace((String)STRING_INIT);
|
|
||||||
}
|
|
||||||
if (*src_id < 0) {
|
|
||||||
return (((uint32_t)1) << 31) - 1;
|
|
||||||
}
|
|
||||||
return (uint32_t)(*src_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Adds a highlight to buffer.
|
|
||||||
///
|
|
||||||
/// Useful for plugins that dynamically generate highlights to a buffer
|
|
||||||
/// (like a semantic highlighter or linter). The function adds a single
|
|
||||||
/// highlight to a buffer. Unlike |matchaddpos()| highlights follow changes to
|
|
||||||
/// line numbering (as lines are inserted/removed above the highlighted line),
|
|
||||||
/// like signs and marks do.
|
|
||||||
///
|
|
||||||
/// Namespaces are used for batch deletion/updating of a set of highlights. To
|
|
||||||
/// create a namespace, use |nvim_create_namespace()| which returns a namespace
|
|
||||||
/// id. Pass it in to this function as `ns_id` to add highlights to the
|
|
||||||
/// namespace. All highlights in the same namespace can then be cleared with
|
|
||||||
/// single call to |nvim_buf_clear_namespace()|. If the highlight never will be
|
|
||||||
/// deleted by an API call, pass `ns_id = -1`.
|
|
||||||
///
|
|
||||||
/// As a shorthand, `ns_id = 0` can be used to create a new namespace for the
|
|
||||||
/// highlight, the allocated id is then returned. If `hl_group` is the empty
|
|
||||||
/// string no highlight is added, but a new `ns_id` is still returned. This is
|
|
||||||
/// supported for backwards compatibility, new code should use
|
|
||||||
/// |nvim_create_namespace()| to create a new empty namespace.
|
|
||||||
///
|
|
||||||
/// @param buffer Buffer handle, or 0 for current buffer
|
|
||||||
/// @param ns_id namespace to use or -1 for ungrouped highlight
|
|
||||||
/// @param hl_group Name of the highlight group to use
|
|
||||||
/// @param line Line to highlight (zero-indexed)
|
|
||||||
/// @param col_start Start of (byte-indexed) column range to highlight
|
|
||||||
/// @param col_end End of (byte-indexed) column range to highlight,
|
|
||||||
/// or -1 to highlight to end of line
|
|
||||||
/// @param[out] err Error details, if any
|
|
||||||
/// @return The ns_id that was used
|
|
||||||
Integer nvim_buf_add_highlight(Buffer buffer, Integer ns_id, String hl_group, Integer line,
|
|
||||||
Integer col_start, Integer col_end, Error *err)
|
|
||||||
FUNC_API_SINCE(1)
|
|
||||||
{
|
|
||||||
buf_T *buf = find_buffer_by_handle(buffer, err);
|
|
||||||
if (!buf) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
VALIDATE_RANGE((line >= 0 && line < MAXLNUM), "line number", {
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
VALIDATE_RANGE((col_start >= 0 && col_start <= MAXCOL), "column", {
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (col_end < 0 || col_end > MAXCOL) {
|
|
||||||
col_end = MAXCOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t ns = src2ns(&ns_id);
|
|
||||||
|
|
||||||
if (!(line < buf->b_ml.ml_line_count)) {
|
|
||||||
// safety check, we can't add marks outside the range
|
|
||||||
return ns_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int hl_id = 0;
|
|
||||||
if (hl_group.size > 0) {
|
|
||||||
hl_id = syn_check_group(hl_group.data, hl_group.size);
|
|
||||||
} else {
|
|
||||||
return ns_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
int end_line = (int)line;
|
|
||||||
if (col_end == MAXCOL) {
|
|
||||||
col_end = 0;
|
|
||||||
end_line++;
|
|
||||||
}
|
|
||||||
|
|
||||||
DecorInline decor = DECOR_INLINE_INIT;
|
|
||||||
decor.data.hl.hl_id = hl_id;
|
|
||||||
|
|
||||||
extmark_set(buf, ns, NULL, (int)line, (colnr_T)col_start, end_line, (colnr_T)col_end,
|
|
||||||
decor, MT_FLAG_DECOR_HL, true, false, false, false, NULL);
|
|
||||||
return ns_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clears |namespace|d objects (highlights, |extmarks|, virtual text) from
|
/// Clears |namespace|d objects (highlights, |extmarks|, virtual text) from
|
||||||
/// a region.
|
/// a region.
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user