mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	fix(api): validation, documentation of hl_group #31195
Problem:  Documentation for "hl_group" in nvim_buf_set_extmark() is
          unclear. "hl_group" in nvim_echo() does not accept
          highlight group id.
Solution: Move documentation for highlight group name/id to first
          mention of hl_group. Update nvim_echo() to accept highlight
          group id.
			
			
This commit is contained in:
		@@ -658,8 +658,8 @@ nvim_echo({chunks}, {history}, {opts})                           *nvim_echo()*
 | 
			
		||||
 | 
			
		||||
    Parameters: ~
 | 
			
		||||
      • {chunks}   A list of `[text, hl_group]` arrays, each representing a
 | 
			
		||||
                   text chunk with specified highlight. `hl_group` element can
 | 
			
		||||
                   be omitted for no highlight.
 | 
			
		||||
                   text chunk with specified highlight group name or ID.
 | 
			
		||||
                   `hl_group` element can be omitted for no highlight.
 | 
			
		||||
      • {history}  if true, add to |message-history|.
 | 
			
		||||
      • {opts}     Optional parameters.
 | 
			
		||||
                   • verbose: Message is printed as a result of 'verbose'
 | 
			
		||||
@@ -2672,8 +2672,10 @@ nvim_buf_set_extmark({buffer}, {ns_id}, {line}, {col}, {opts})
 | 
			
		||||
                  • id : id of the extmark to edit.
 | 
			
		||||
                  • end_row : ending line of the mark, 0-based inclusive.
 | 
			
		||||
                  • end_col : ending col of the mark, 0-based exclusive.
 | 
			
		||||
                  • hl_group : name of the highlight group used to highlight
 | 
			
		||||
                    this mark.
 | 
			
		||||
                  • hl_group : highlight group used for the text range. This
 | 
			
		||||
                    and below highlight groups can be supplied either as a
 | 
			
		||||
                    string or as an integer, the latter of which can be
 | 
			
		||||
                    obtained using |nvim_get_hl_id_by_name()|.
 | 
			
		||||
                  • hl_eol : when true, for a multiline highlight covering the
 | 
			
		||||
                    EOL of a line, continue the highlight for the rest of the
 | 
			
		||||
                    screen line (just like for diff and cursorline highlight).
 | 
			
		||||
@@ -2682,9 +2684,7 @@ nvim_buf_set_extmark({buffer}, {ns_id}, {line}, {col}, {opts})
 | 
			
		||||
                    with specified highlight. `highlight` element can either
 | 
			
		||||
                    be a single highlight group, or an array of multiple
 | 
			
		||||
                    highlight groups that will be stacked (highest priority
 | 
			
		||||
                    last). A highlight group can be supplied either as a
 | 
			
		||||
                    string or as an integer, the latter which can be obtained
 | 
			
		||||
                    using |nvim_get_hl_id_by_name()|.
 | 
			
		||||
                    last).
 | 
			
		||||
                  • virt_text_pos : position of virtual text. Possible values:
 | 
			
		||||
                    • "eol": right after eol character (default).
 | 
			
		||||
                    • "overlay": display over the specified column, without
 | 
			
		||||
@@ -2750,15 +2750,14 @@ nvim_buf_set_extmark({buffer}, {ns_id}, {line}, {col}, {opts})
 | 
			
		||||
                    buffer or end of the line respectively. Defaults to true.
 | 
			
		||||
                  • sign_text: string of length 1-2 used to display in the
 | 
			
		||||
                    sign column.
 | 
			
		||||
                  • sign_hl_group: name of the highlight group used to
 | 
			
		||||
                    highlight the sign column text.
 | 
			
		||||
                  • number_hl_group: name of the highlight group used to
 | 
			
		||||
                    highlight the number column.
 | 
			
		||||
                  • line_hl_group: name of the highlight group used to
 | 
			
		||||
                    highlight the whole line.
 | 
			
		||||
                  • cursorline_hl_group: name of the highlight group used to
 | 
			
		||||
                    highlight the sign column text when the cursor is on the
 | 
			
		||||
                    same line as the mark and 'cursorline' is enabled.
 | 
			
		||||
                  • sign_hl_group: highlight group used for the sign column
 | 
			
		||||
                    text.
 | 
			
		||||
                  • number_hl_group: highlight group used for the number
 | 
			
		||||
                    column.
 | 
			
		||||
                  • line_hl_group: highlight group used for the whole line.
 | 
			
		||||
                  • cursorline_hl_group: highlight group used for the sign
 | 
			
		||||
                    column text when the cursor is on the same line as the
 | 
			
		||||
                    mark and 'cursorline' is enabled.
 | 
			
		||||
                  • conceal: string which should be either empty or a single
 | 
			
		||||
                    character. Enable concealing similar to |:syn-conceal|.
 | 
			
		||||
                    When a character is supplied it is used as |:syn-cchar|.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								runtime/lua/vim/_meta/api.lua
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										28
									
								
								runtime/lua/vim/_meta/api.lua
									
									
									
										generated
									
									
									
								
							@@ -592,8 +592,9 @@ function vim.api.nvim_buf_line_count(buffer) end
 | 
			
		||||
--- - id : id of the extmark to edit.
 | 
			
		||||
--- - end_row : ending line of the mark, 0-based inclusive.
 | 
			
		||||
--- - end_col : ending col of the mark, 0-based exclusive.
 | 
			
		||||
--- - hl_group : name of the highlight group used to highlight
 | 
			
		||||
---     this mark.
 | 
			
		||||
--- - hl_group : highlight group used for the text range. This and below
 | 
			
		||||
---     highlight groups can be supplied either as a string or as an integer,
 | 
			
		||||
---     the latter of which can be obtained using `nvim_get_hl_id_by_name()`.
 | 
			
		||||
--- - hl_eol : when true, for a multiline highlight covering the
 | 
			
		||||
---            EOL of a line, continue the highlight for the rest
 | 
			
		||||
---            of the screen line (just like for diff and
 | 
			
		||||
@@ -603,9 +604,7 @@ function vim.api.nvim_buf_line_count(buffer) end
 | 
			
		||||
---     text chunk with specified highlight. `highlight` element
 | 
			
		||||
---     can either be a single highlight group, or an array of
 | 
			
		||||
---     multiple highlight groups that will be stacked
 | 
			
		||||
---     (highest priority last). A highlight group can be supplied
 | 
			
		||||
---     either as a string or as an integer, the latter which
 | 
			
		||||
---     can be obtained using `nvim_get_hl_id_by_name()`.
 | 
			
		||||
---     (highest priority last).
 | 
			
		||||
--- - virt_text_pos : position of virtual text. Possible values:
 | 
			
		||||
---   - "eol": right after eol character (default).
 | 
			
		||||
---   - "overlay": display over the specified column, without
 | 
			
		||||
@@ -676,15 +675,12 @@ function vim.api.nvim_buf_line_count(buffer) end
 | 
			
		||||
---     buffer or end of the line respectively. Defaults to true.
 | 
			
		||||
--- - sign_text: string of length 1-2 used to display in the
 | 
			
		||||
---     sign column.
 | 
			
		||||
--- - sign_hl_group: name of the highlight group used to
 | 
			
		||||
---     highlight the sign column text.
 | 
			
		||||
--- - number_hl_group: name of the highlight group used to
 | 
			
		||||
---     highlight the number column.
 | 
			
		||||
--- - line_hl_group: name of the highlight group used to
 | 
			
		||||
---     highlight the whole line.
 | 
			
		||||
--- - cursorline_hl_group: name of the highlight group used to
 | 
			
		||||
---     highlight the sign column text when the cursor is on
 | 
			
		||||
---     the same line as the mark and 'cursorline' is enabled.
 | 
			
		||||
--- - sign_hl_group: highlight group used for the sign column text.
 | 
			
		||||
--- - number_hl_group: highlight group used for the number column.
 | 
			
		||||
--- - line_hl_group: highlight group used for the whole line.
 | 
			
		||||
--- - cursorline_hl_group: highlight group used for the sign
 | 
			
		||||
---     column text when the cursor is on the same line as the
 | 
			
		||||
---     mark and 'cursorline' is enabled.
 | 
			
		||||
--- - conceal: string which should be either empty or a single
 | 
			
		||||
---     character. Enable concealing similar to `:syn-conceal`.
 | 
			
		||||
---     When a character is supplied it is used as `:syn-cchar`.
 | 
			
		||||
@@ -1106,8 +1102,8 @@ function vim.api.nvim_del_var(name) end
 | 
			
		||||
--- Echo a message.
 | 
			
		||||
---
 | 
			
		||||
--- @param chunks any[] A list of `[text, hl_group]` arrays, each representing a
 | 
			
		||||
--- text chunk with specified highlight. `hl_group` element
 | 
			
		||||
--- can be omitted for no highlight.
 | 
			
		||||
--- text chunk with specified highlight group name or ID.
 | 
			
		||||
--- `hl_group` element can be omitted for no highlight.
 | 
			
		||||
--- @param history boolean if true, add to `message-history`.
 | 
			
		||||
--- @param opts vim.api.keyset.echo_opts Optional parameters.
 | 
			
		||||
--- - verbose: Message is printed as a result of 'verbose' option.
 | 
			
		||||
 
 | 
			
		||||
@@ -381,8 +381,9 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, Object e
 | 
			
		||||
///               - id : id of the extmark to edit.
 | 
			
		||||
///               - end_row : ending line of the mark, 0-based inclusive.
 | 
			
		||||
///               - end_col : ending col of the mark, 0-based exclusive.
 | 
			
		||||
///               - hl_group : name of the highlight group used to highlight
 | 
			
		||||
///                   this mark.
 | 
			
		||||
///               - hl_group : highlight group used for the text range. This and below
 | 
			
		||||
///                   highlight groups can be supplied either as a string or as an integer,
 | 
			
		||||
///                   the latter of which can be obtained using |nvim_get_hl_id_by_name()|.
 | 
			
		||||
///               - hl_eol : when true, for a multiline highlight covering the
 | 
			
		||||
///                          EOL of a line, continue the highlight for the rest
 | 
			
		||||
///                          of the screen line (just like for diff and
 | 
			
		||||
@@ -392,9 +393,7 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, Object e
 | 
			
		||||
///                   text chunk with specified highlight. `highlight` element
 | 
			
		||||
///                   can either be a single highlight group, or an array of
 | 
			
		||||
///                   multiple highlight groups that will be stacked
 | 
			
		||||
///                   (highest priority last). A highlight group can be supplied
 | 
			
		||||
///                   either as a string or as an integer, the latter which
 | 
			
		||||
///                   can be obtained using |nvim_get_hl_id_by_name()|.
 | 
			
		||||
///                   (highest priority last).
 | 
			
		||||
///               - virt_text_pos : position of virtual text. Possible values:
 | 
			
		||||
///                 - "eol": right after eol character (default).
 | 
			
		||||
///                 - "overlay": display over the specified column, without
 | 
			
		||||
@@ -465,15 +464,12 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, Object e
 | 
			
		||||
///                   buffer or end of the line respectively. Defaults to true.
 | 
			
		||||
///               - sign_text: string of length 1-2 used to display in the
 | 
			
		||||
///                   sign column.
 | 
			
		||||
///               - sign_hl_group: name of the highlight group used to
 | 
			
		||||
///                   highlight the sign column text.
 | 
			
		||||
///               - number_hl_group: name of the highlight group used to
 | 
			
		||||
///                   highlight the number column.
 | 
			
		||||
///               - line_hl_group: name of the highlight group used to
 | 
			
		||||
///                   highlight the whole line.
 | 
			
		||||
///               - cursorline_hl_group: name of the highlight group used to
 | 
			
		||||
///                   highlight the sign column text when the cursor is on
 | 
			
		||||
///                   the same line as the mark and 'cursorline' is enabled.
 | 
			
		||||
///               - sign_hl_group: highlight group used for the sign column text.
 | 
			
		||||
///               - number_hl_group: highlight group used for the number column.
 | 
			
		||||
///               - line_hl_group: highlight group used for the whole line.
 | 
			
		||||
///               - cursorline_hl_group: highlight group used for the sign
 | 
			
		||||
///                   column text when the cursor is on the same line as the
 | 
			
		||||
///                   mark and 'cursorline' is enabled.
 | 
			
		||||
///               - conceal: string which should be either empty or a single
 | 
			
		||||
///                   character. Enable concealing similar to |:syn-conceal|.
 | 
			
		||||
///                   When a character is supplied it is used as |:syn-cchar|.
 | 
			
		||||
 
 | 
			
		||||
@@ -771,7 +771,7 @@ int object_to_hl_id(Object obj, const char *what, Error *err)
 | 
			
		||||
    int id = (int)obj.data.integer;
 | 
			
		||||
    return (1 <= id && id <= highlight_num_groups()) ? id : 0;
 | 
			
		||||
  } else {
 | 
			
		||||
    api_set_error(err, kErrorTypeValidation, "Invalid highlight: %s", what);
 | 
			
		||||
    api_set_error(err, kErrorTypeValidation, "Invalid hl_group: %s", what);
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -809,27 +809,22 @@ HlMessage parse_hl_msg(Array chunks, Error *err)
 | 
			
		||||
{
 | 
			
		||||
  HlMessage hl_msg = KV_INITIAL_VALUE;
 | 
			
		||||
  for (size_t i = 0; i < chunks.size; i++) {
 | 
			
		||||
    if (chunks.items[i].type != kObjectTypeArray) {
 | 
			
		||||
      api_set_error(err, kErrorTypeValidation, "Chunk is not an array");
 | 
			
		||||
    VALIDATE_T("chunk", kObjectTypeArray, chunks.items[i].type, {
 | 
			
		||||
      goto free_exit;
 | 
			
		||||
    }
 | 
			
		||||
    });
 | 
			
		||||
    Array chunk = chunks.items[i].data.array;
 | 
			
		||||
    if (chunk.size == 0 || chunk.size > 2
 | 
			
		||||
        || chunk.items[0].type != kObjectTypeString
 | 
			
		||||
        || (chunk.size == 2 && chunk.items[1].type != kObjectTypeString)) {
 | 
			
		||||
      api_set_error(err, kErrorTypeValidation,
 | 
			
		||||
                    "Chunk is not an array with one or two strings");
 | 
			
		||||
    VALIDATE((chunk.size > 0 && chunk.size <= 2 && chunk.items[0].type == kObjectTypeString),
 | 
			
		||||
             "%s", "Invalid chunk: expected Array with 1 or 2 Strings", {
 | 
			
		||||
      goto free_exit;
 | 
			
		||||
    }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    String str = copy_string(chunk.items[0].data.string, NULL);
 | 
			
		||||
 | 
			
		||||
    int hl_id = 0;
 | 
			
		||||
    if (chunk.size == 2) {
 | 
			
		||||
      String hl = chunk.items[1].data.string;
 | 
			
		||||
      if (hl.size > 0) {
 | 
			
		||||
        // TODO(bfredl): use object_to_hl_id and allow integer
 | 
			
		||||
        hl_id = syn_check_group(hl.data, hl.size);
 | 
			
		||||
      hl_id = object_to_hl_id(chunk.items[1], "text highlight", err);
 | 
			
		||||
      if (ERROR_SET(err)) {
 | 
			
		||||
        goto free_exit;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    kv_push(hl_msg, ((HlMessageChunk){ .text = str, .hl_id = hl_id }));
 | 
			
		||||
 
 | 
			
		||||
@@ -779,8 +779,8 @@ void nvim_set_vvar(String name, Object value, Error *err)
 | 
			
		||||
/// Echo a message.
 | 
			
		||||
///
 | 
			
		||||
/// @param chunks  A list of `[text, hl_group]` arrays, each representing a
 | 
			
		||||
///                text chunk with specified highlight. `hl_group` element
 | 
			
		||||
///                can be omitted for no highlight.
 | 
			
		||||
///                text chunk with specified highlight group name or ID.
 | 
			
		||||
///                `hl_group` element can be omitted for no highlight.
 | 
			
		||||
/// @param history  if true, add to |message-history|.
 | 
			
		||||
/// @param opts  Optional parameters.
 | 
			
		||||
///          - verbose: Message is printed as a result of 'verbose' option.
 | 
			
		||||
 
 | 
			
		||||
@@ -3582,6 +3582,15 @@ describe('API', function()
 | 
			
		||||
      command('highlight Special guifg=SlateBlue')
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('validation', function()
 | 
			
		||||
      eq("Invalid 'chunk': expected Array, got String", pcall_err(api.nvim_echo, { 'msg' }, 1, {}))
 | 
			
		||||
      eq(
 | 
			
		||||
        'Invalid chunk: expected Array with 1 or 2 Strings',
 | 
			
		||||
        pcall_err(api.nvim_echo, { { '', '', '' } }, 1, {})
 | 
			
		||||
      )
 | 
			
		||||
      eq('Invalid hl_group: text highlight', pcall_err(api.nvim_echo, { { '', false } }, 1, {}))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('should clear cmdline message before echo', function()
 | 
			
		||||
      feed(':call nvim_echo([["msg"]], v:false, {})<CR>')
 | 
			
		||||
      screen:expect {
 | 
			
		||||
@@ -3606,6 +3615,18 @@ describe('API', function()
 | 
			
		||||
        msg_a{15:msg_b}{16:msg_c}                         |
 | 
			
		||||
      ]],
 | 
			
		||||
      }
 | 
			
		||||
      async_meths.nvim_echo({
 | 
			
		||||
        { 'msg_d' },
 | 
			
		||||
        { 'msg_e', api.nvim_get_hl_id_by_name('Statement') },
 | 
			
		||||
        { 'msg_f', api.nvim_get_hl_id_by_name('Special') },
 | 
			
		||||
      }, true, {})
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^                                        |
 | 
			
		||||
        {1:~                                       }|*6
 | 
			
		||||
        msg_d{15:msg_e}{16:msg_f}                         |
 | 
			
		||||
      ]],
 | 
			
		||||
      }
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('can show highlighted multiline', function()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user