ronantakizawa/codereview-bench huggingface dataset:
Repository: neovim/neovim
File: test/functional/options/num_options_spec.lua (Lua)

Code before:
    should_fail('foldcolumn', '13', 'E474')
    should_fail('conceallevel', 4, 'E474')
    should_fail('numberwidth', 21, 'E474')
    should_fail('numberwidth', 0, 'E487')

    -- If smaller than 1 this one is set to 'lines'-1
    command('setglobal window=-10')
    api.nvim_set_option_value('window', -10, {})
    eq(23, api.nvim_get_option_value('window', {}))
    eq('', eval('v:errmsg'))

    -- 'scrolloff' and 'sidescrolloff' can have a -1 value when
    -- set for the current window, but not globally
    matches('E487', pcall_err(command, 'setglobal scrolloff=-1'))
    matches('E487', pcall_err(command, 'setglobal sidescrolloff=-1'))

    eq(true, pcall(command, 'setlocal scrolloff=-1'))
    eq(true, pcall(command, 'setlocal sidescrolloff=-1'))
  end)

  it('set wmh/wh wmw/wiw checks', function()
    command('set winheight=2')
    matches('E591', pcall_err(command, 'set winminheight=3'))

    command('set winwidth=2')
    matches('E592', pcall_err(command, 'set winminwidth=3'))
  end)

  it('set maxcombine resets to 6', function()
    local function setto(value)
      command('setglobal maxcombine=' .. value)
      command('setlocal maxcombine=' .. value)
      api.nvim_set_option_value('maxcombine', value, {})
      eq(6, api.nvim_get_option_value('maxcombine', {}))
      eq('', eval('v:errmsg'))
    end
    setto(0)
    setto(1)
    setto(6)
    setto(7)
  end)
end)


Review comment (suggestion):
```suggestion
    matches('E592:', pcall_err(command, 'set winminwidth=3'))
```

Code after:
    should_fail('foldcolumn', '13', 'E474')
    should_fail('conceallevel', 4, 'E474')
    should_fail('numberwidth', 21, 'E474')
    should_fail('numberwidth', 0, 'E487')

    -- If smaller than 1 this one is set to 'lines'-1
    command('setglobal window=-10')
    api.nvim_set_option_value('window', -10, {})
    eq(23, api.nvim_get_option_value('window', {}))
    eq('', eval('v:errmsg'))

    -- 'scrolloff' and 'sidescrolloff' can have a -1 value when
    -- set for the current window, but not globally
    matches('E487:', pcall_err(command, 'setglobal scrolloff=-1'))
    matches('E487:', pcall_err(command, 'setglobal sidescrolloff=-1'))

    eq(true, pcall(command, 'setlocal scrolloff=-1'))
    eq(true, pcall(command, 'setlocal sidescrolloff=-1'))
  end)

  it('set wmh/wh wmw/wiw checks', function()
    command('set winheight=2')
    matches('E591:', pcall_err(command, 'set winminheight=3'))

    command('set winwidth=2')
    matches('E592:', pcall_err(command, 'set winminwidth=3'))
  end)

  it('set maxcombine resets to 6', function()
    local function setto(value)
      command('setglobal maxcombine=' .. value)
      command('setlocal maxcombine=' .. value)
      api.nvim_set_option_value('maxcombine', value, {})
      eq(6, api.nvim_get_option_value('maxcombine', {}))
      eq('', eval('v:errmsg'))
    end
    setto(0)
    setto(1)
    setto(6)
    setto(7)
  end)
end)
Repository: neovim/neovim
File: test/functional/options/num_options_spec.lua (Lua)

Code before:
-- Tests for :setlocal and :setglobal

local t = require('test.testutil')
local n = require('test.functional.testnvim')()

local clear, command, eval, eq, api = n.clear, n.command, n.eval, t.eq, n.api
local matches, pcall_err = t.matches, t.pcall_err

local function should_fail(opt, value, errmsg)
  matches(errmsg, pcall_err(command, 'setglobal ' .. opt .. '=' .. value))
  matches(errmsg, pcall_err(command, 'setlocal ' .. opt .. '=' .. value))
  matches(errmsg, pcall_err(api.nvim_set_option_value, opt, value, {}))
end

local function should_succeed(opt, value)
  command('setglobal ' .. opt .. '=' .. value)
  command('setlocal ' .. opt .. '=' .. value)
  api.nvim_set_option_value(opt, value, {})
  eq(value, api.nvim_get_option_value(opt, {}))
end

describe(':setlocal', function()
  before_each(clear)

  it('setlocal sets only local value', function()
    eq(0, api.nvim_get_option_value('iminsert', { scope = 'global' }))
    command('setlocal iminsert=1')
    eq(0, api.nvim_get_option_value('iminsert', { scope = 'global' }))
    eq(-1, api.nvim_get_option_value('imsearch', { scope = 'global' }))
    command('setlocal imsearch=1')
    eq(-1, api.nvim_get_option_value('imsearch', { scope = 'global' }))
  end)
end)

describe(':set validation', function()
  before_each(clear)


Review comment (suggestion):
```suggestion
  matches(errmsg .. ':', pcall_err(command, 'setglobal ' .. opt .. '=' .. value))
  matches(errmsg .. ':', pcall_err(command, 'setlocal ' .. opt .. '=' .. value))
  matches(errmsg .. ':', pcall_err(api.nvim_set_option_value, opt, value, {}))
```

Code after:
-- Tests for :setlocal and :setglobal

local t = require('test.testutil')
local n = require('test.functional.testnvim')()

local clear, command, eval, eq, api = n.clear, n.command, n.eval, t.eq, n.api
local matches, pcall_err = t.matches, t.pcall_err

local function should_fail(opt, value, errmsg)
  matches(errmsg .. ':', pcall_err(command, 'setglobal ' .. opt .. '=' .. value))
  matches(errmsg .. ':', pcall_err(command, 'setlocal ' .. opt .. '=' .. value))
  matches(errmsg .. ':', pcall_err(api.nvim_set_option_value, opt, value, {}))
end

local function should_succeed(opt, value)
  command('setglobal ' .. opt .. '=' .. value)
  command('setlocal ' .. opt .. '=' .. value)
  api.nvim_set_option_value(opt, value, {})
  eq(value, api.nvim_get_option_value(opt, {}))
end

describe(':setlocal', function()
  before_each(clear)

  it('setlocal sets only local value', function()
    eq(0, api.nvim_get_option_value('iminsert', { scope = 'global' }))
    command('setlocal iminsert=1')
    eq(0, api.nvim_get_option_value('iminsert', { scope = 'global' }))
    eq(-1, api.nvim_get_option_value('imsearch', { scope = 'global' }))
    command('setlocal imsearch=1')
    eq(-1, api.nvim_get_option_value('imsearch', { scope = 'global' }))
  end)
end)

describe(':set validation', function()
  before_each(clear)
Repository: neovim/neovim
File: src/nvim/ex_docmd.c (C)

Code before:
        // zero means not set, one is verbose == 0, etc.
        cmod->cmod_verbose = atoi(eap->cmd) + 1;
      } else {
        cmod->cmod_verbose = 2;  // default: verbose == 1
      }
      eap->cmd = p;
      continue;
    }
    break;
  }

  if (has_visual_range) {
    if (eap->cmd > cmd_start) {
      // Move the '<,'> range to after the modifiers and insert a colon.
      // Since the modifiers have been parsed put the colon on top of the
      // space: "'<,'>mod cmd" -> "mod:'<,'>cmd
      // Put eap->cmd after the colon.
      if (use_plus_cmd) {
        size_t len = strlen(cmd_start);

        // Special case: empty command uses "+":
        //  "'<,'>mods" -> "mods *+
        //  Use "*" instead of "'<,'>" to avoid the command getting
        //  longer, in case is was allocated.
        memmove(orig_cmd, cmd_start, len);
        xmemcpyz(orig_cmd + len, " *+", 3);
      } else {
        memmove(cmd_start - 5, cmd_start, (size_t)(eap->cmd - cmd_start));
        eap->cmd -= 5;
        memmove(eap->cmd - 1, ":'<,'>", 6);
      }
    } else {
      // No modifiers, move the pointer back.
      // Special case: change empty command to "+".
      if (use_plus_cmd) {
        eap->cmd = "'<,'>+";
      } else {
        eap->cmd = orig_cmd;
      }
    }
  } else if (use_plus_cmd) {
    eap->cmd = exmode_plus;
  }

  return OK;
}

/// Apply the command modifiers.  Saves current state in "cmdmod", call
/// undo_cmdmod() later.
void apply_cmdmod(cmdmod_T *cmod)
{

Review comment (suggestion):
```suggestion
        xmemcpyz(orig_cmd + len, S_LEN(" *+"));
```

Code after:
        // zero means not set, one is verbose == 0, etc.
        cmod->cmod_verbose = atoi(eap->cmd) + 1;
      } else {
        cmod->cmod_verbose = 2;  // default: verbose == 1
      }
      eap->cmd = p;
      continue;
    }
    break;
  }

  if (has_visual_range) {
    if (eap->cmd > cmd_start) {
      // Move the '<,'> range to after the modifiers and insert a colon.
      // Since the modifiers have been parsed put the colon on top of the
      // space: "'<,'>mod cmd" -> "mod:'<,'>cmd
      // Put eap->cmd after the colon.
      if (use_plus_cmd) {
        size_t len = strlen(cmd_start);

        // Special case: empty command uses "+":
        //  "'<,'>mods" -> "mods *+
        //  Use "*" instead of "'<,'>" to avoid the command getting
        //  longer, in case is was allocated.
        memmove(orig_cmd, cmd_start, len);
        xmemcpyz(orig_cmd + len, S_LEN(" *+"));
      } else {
        memmove(cmd_start - 5, cmd_start, (size_t)(eap->cmd - cmd_start));
        eap->cmd -= 5;
        memmove(eap->cmd - 1, ":'<,'>", 6);
      }
    } else {
      // No modifiers, move the pointer back.
      // Special case: change empty command to "+".
      if (use_plus_cmd) {
        eap->cmd = "'<,'>+";
      } else {
        eap->cmd = orig_cmd;
      }
    }
  } else if (use_plus_cmd) {
    eap->cmd = exmode_plus;
  }

  return OK;
}

/// Apply the command modifiers.  Saves current state in "cmdmod", call
/// undo_cmdmod() later.
void apply_cmdmod(cmdmod_T *cmod)
{
Repository: neovim/neovim
File: test/functional/editor/undo_spec.lua (Lua)

Code before:
local t = require('test.testutil')
local n = require('test.functional.testnvim')()

local clear = n.clear
local command = n.command
local eval = n.eval
local expect = n.expect
local eq = t.eq
local feed = n.feed
local insert = n.insert
local fn = n.fn
local exec = n.exec
local exec_lua = n.exec_lua

local function lastmessage()
  local messages = fn.split(fn.execute('messages'), '\n')
  return messages[#messages]
end

local feed_undo = function(level)
  feed(':undo!' .. (level and (' ' .. level) or '') .. '<CR>')
end

describe('u CTRL-R g- g+', function()
  before_each(clear)

  local function create_history(num_steps)
    if num_steps == 0 then
      return
    end
    insert('1')
    if num_steps == 1 then
      return
    end
    feed('o2<esc>')
    feed('o3<esc>')
    feed('u')
    if num_steps == 2 then
      return
    end
    feed('o4<esc>')
    if num_steps == 3 then
      return
    end
    feed('u')
  end

Review comment (suggestion):
If possible, `n.command` is preferred (that's why `feed_command` is deprecated). Can that be used? `feed()` is only needed for cases where asynchronous behavior is wanted.

Maybe *some* of these tests need async, but the others should use `n.command`.

Code after:
local t = require('test.testutil')
local n = require('test.functional.testnvim')()

local clear = n.clear
local command = n.command
local expect = n.expect
local eq = t.eq
local feed = n.feed
local insert = n.insert
local fn = n.fn
local exec = n.exec
local exec_lua = n.exec_lua
local pcall_err = t.pcall_err

local function lastmessage()
  local messages = fn.split(fn.execute('messages'), '\n')
  return messages[#messages]
end

describe('u CTRL-R g- g+', function()
  before_each(clear)

  local function create_history(num_steps)
    if num_steps == 0 then
      return
    end
    insert('1')
    if num_steps == 1 then
      return
    end
    feed('o2<esc>')
    feed('o3<esc>')
    feed('u')
    if num_steps == 2 then
      return
    end
    feed('o4<esc>')
    if num_steps == 3 then
      return
    end
    feed('u')
  end

  local function undo_and_redo(hist_pos, undo, redo, expect_str)
    command('enew!')
    create_history(hist_pos)
Repository: neovim/neovim
File: src/nvim/message.c (C)

Code before:
  msg_hist_off = !hist;

  // Don't want a hit-enter prompt here.
  no_wait_return++;

  set_vim_var_string(VV_WARNINGMSG, message, -1);
  XFREE_CLEAR(keep_msg);
  if (hl) {
    keep_msg_hl_id = HLF_W;
  } else {
    keep_msg_hl_id = 0;
  }

  if (msg_ext_kind == NULL) {
    msg_ext_set_kind("wmsg");
  }

  if (msg(message, keep_msg_hl_id) && msg_scrolled == 0) {
    set_keep_msg(message, keep_msg_hl_id);
  }
  msg_didout = false;  // Overwrite this message.
  msg_nowait = true;   // Don't wait for this message.
  msg_col = 0;

  no_wait_return--;
  msg_hist_off = false;
}

/// Shows a warning, with optional highlighting.
///
/// @param hl enable highlighting
/// @param fmt printf-style format message
///
/// @see smsg
/// @see semsg
void swmsg(bool hl, const char *const fmt, ...)
  FUNC_ATTR_PRINTF(2, 3)
{
  va_list args;

  va_start(args, fmt);
  vim_vsnprintf(IObuff, IOSIZE, fmt, args);
  va_end(args);

  give_warning(IObuff, hl, true);
}

/// Advance msg cursor to column "col".
void msg_advance(int col)
{
  if (msg_silent != 0) {        // nothing to advance to

Review comment (suggestion):
Just to be safe let's do the usual `save_x` dance? Although, other things are set indiscriminately in here so maybe doesn't matter.

```suggestion
  msg_hist_off = save_msg_hist_off;
```

Code after:
  bool save_msg_hist_off = msg_hist_off;
  msg_hist_off = !hist;

  // Don't want a hit-enter prompt here.
  no_wait_return++;

  set_vim_var_string(VV_WARNINGMSG, message, -1);
  XFREE_CLEAR(keep_msg);
  if (hl) {
    keep_msg_hl_id = HLF_W;
  } else {
    keep_msg_hl_id = 0;
  }

  if (msg_ext_kind == NULL) {
    msg_ext_set_kind("wmsg");
  }

  if (msg(message, keep_msg_hl_id) && msg_scrolled == 0) {
    set_keep_msg(message, keep_msg_hl_id);
  }
  msg_didout = false;  // Overwrite this message.
  msg_nowait = true;   // Don't wait for this message.
  msg_col = 0;

  no_wait_return--;
  msg_hist_off = save_msg_hist_off;
}

/// Shows a warning, with optional highlighting.
///
/// @param hl enable highlighting
/// @param fmt printf-style format message
///
/// @see smsg
/// @see semsg
void swmsg(bool hl, const char *const fmt, ...)
  FUNC_ATTR_PRINTF(2, 3)
{
  va_list args;

  va_start(args, fmt);
  vim_vsnprintf(IObuff, IOSIZE, fmt, args);
  va_end(args);

  give_warning(IObuff, hl, true);
}

/// Advance msg cursor to column "col".
void msg_advance(int col)
{
Repository: neovim/neovim
File: runtime/lua/vim/treesitter/health.lua (Lua)

Code before:
      end
      table.insert(queries_by_lang[lang], {
        lang = lang,
        type = query_type,
        path = query_file,
        index = i,
      })
    end
  end
  if vim.tbl_isempty(queries_by_lang) then
    health.warn('No query files found')
  else
    for lang, queries in vim.spairs(queries_by_lang) do
      table.sort(queries, function(a, b)
        if a.type == b.type then
          return a.index < b.index
        else
          return a.type < b.type
        end
      end)

      for i, query in ipairs(queries) do
        local is_duplicate = i > 1 and queries[i - 1].type == query.type
        if is_duplicate then
          health.ok(
            string.format('Language: %-15s %s (not loaded): %s', lang, query.type, query.path)
          )
        else
          health.ok(string.format('Language: %-15s %s: %s', lang, query.type, query.path))
        end
      end
    end
  end
end

return M


Review comment (suggestion):
No, you cannot conclude that -- unlike parsers, multiple queries can be loaded at the same time (if one of them specifies `; extends` in their modeline).

You should list them all, but sort them -- per language -- in the order in which they appear on `runtimepath` (so you quickly see the "entrypoint", i.e., the query that is loaded _first_).

Code after:
      if not queries_by_lang[lang] then
        queries_by_lang[lang] = {}
      end
      table.insert(queries_by_lang[lang], {
        lang = lang,
        type = query_type,
        path = query_file,
        index = i,
      })
    end
  end

  if not vim.tbl_isempty(queries_by_lang) then
    for lang, queries in vim.spairs(queries_by_lang) do
      table.sort(queries, function(a, b)
        if a.type == b.type then
          return a.index < b.index
        else
          return a.type < b.type
        end
      end)

      for _, query in ipairs(queries) do
        local dir = vim.fn.fnamemodify(query.path, ':h')
        health.ok(string.format('%-15s %-15s %s', lang, query.type, dir))
      end
    end
  end
end

return M
Repository: neovim/neovim
File: runtime/lua/vim/treesitter/health.lua (Lua)

Code before:
    if lang and query_type then
      if not queries_by_lang[lang] then
        queries_by_lang[lang] = {}
      end
      table.insert(queries_by_lang[lang], {
        lang = lang,
        type = query_type,
        path = query_file,
        index = i,
      })
    end
  end

  if not vim.tbl_isempty(queries_by_lang) then
    for lang, queries in vim.spairs(queries_by_lang) do
      table.sort(queries, function(a, b)
        if a.type == b.type then
          return a.index < b.index
        else
          return a.type < b.type
        end
      end)

      for _, query in ipairs(queries) do
        local dir = vim.fn.fnamemodify(query.path, ':h')
        health.ok(string.format('Language: %-15s %s: %s', lang, query.type, dir))
      end
    end
  end
end

return M


Review comment (suggestion):
```suggestion
        health.ok(string.format('%-15s %s: %s', lang, query.type, dir))
```
to use as much space as possible for the (potentially very long) paths. (If you label one column, you should label all columns; see the parser check.)

I think these columns are self-explanatory, but if not, we should add a heading. (The same goes for the parser check, but that is out of scope for this PR.)

Code after:
    if lang and query_type then
      if not queries_by_lang[lang] then
        queries_by_lang[lang] = {}
      end
      table.insert(queries_by_lang[lang], {
        lang = lang,
        type = query_type,
        path = query_file,
        index = i,
      })
    end
  end

  if not vim.tbl_isempty(queries_by_lang) then
    for lang, queries in vim.spairs(queries_by_lang) do
      table.sort(queries, function(a, b)
        if a.type == b.type then
          return a.index < b.index
        else
          return a.type < b.type
        end
      end)

      for _, query in ipairs(queries) do
        local dir = vim.fn.fnamemodify(query.path, ':h')
        health.ok(string.format('%-15s %-15s %s', lang, query.type, dir))
      end
    end
  end
end

return M
Repository: neovim/neovim
File: runtime/lua/vim/health.lua (Lua)

Code before:
    -- remove empty line after header from report_start
    if s_output[1] == '' then
      local tmp = {} ---@type string[]
      for i = 2, #s_output do
        tmp[#tmp + 1] = s_output[i]
      end
      s_output = {}
      for _, v in ipairs(tmp) do
        s_output[#s_output + 1] = v
      end
    end
    s_output[#s_output + 1] = ''
    s_output = vim.list_extend(header, s_output)
    vim.fn.append(vim.fn.line('$'), s_output)
    vim.cmd.redraw()
  end

  -- Clear the 'Running healthchecks...' message.
  vim.cmd.redraw()
  vim.print('')

  -- Quit with 'q' inside healthcheck buffers.
  vim._with({ buf = bufnr }, function()
    if
      vim.fn.maparg('q', 'n', false, false) == ''
      or vim.tbl_get(vim.g, 'health', 'style') == 'float'
    then
      vim.keymap.set('n', 'q', function()
        if not pcall(vim.cmd.close) then
          vim.cmd.bdelete()
        end
      end, { buffer = bufnr, silent = true, noremap = true, nowait = true })
    end
  end)

  -- Once we're done writing checks, set nomodifiable.
  vim.bo[bufnr].modifiable = false
  vim.cmd.setfiletype('checkhealth')
end

return M


Review comment (suggestion):
```suggestion
      vim.tbl_get(vim.g, 'health', 'style') == 'float'
      or vim.fn.maparg('q', 'n', false, false) == ''
```

Code after:
    -- remove empty line after header from report_start
    if s_output[1] == '' then
      local tmp = {} ---@type string[]
      for i = 2, #s_output do
        tmp[#tmp + 1] = s_output[i]
      end
      s_output = {}
      for _, v in ipairs(tmp) do
        s_output[#s_output + 1] = v
      end
    end
    s_output[#s_output + 1] = ''
    s_output = vim.list_extend(header, s_output)
    vim.fn.append(vim.fn.line('$'), s_output)
    vim.cmd.redraw()
  end

  -- Clear the 'Running healthchecks...' message.
  vim.cmd.redraw()
  vim.print('')

  -- Quit with 'q' inside healthcheck buffers.
  vim._with({ buf = bufnr }, function()
    if
      vim.tbl_get(vim.g, 'health', 'style') == 'float'
      or vim.fn.maparg('q', 'n', false, false) == ''
    then
      vim.keymap.set('n', 'q', function()
        if not pcall(vim.cmd.close) then
          vim.cmd.bdelete()
        end
      end, { buffer = bufnr, silent = true, noremap = true, nowait = true })
    end
  end)

  -- Once we're done writing checks, set nomodifiable.
  vim.bo[bufnr].modifiable = false
  vim.cmd.setfiletype('checkhealth')
end

return M
Repository: neovim/neovim
File: test/functional/plugin/lsp/completion_spec.lua (Lua)

Code before:
        on_attach = function(client, bufnr0)
          vim.lsp.completion.enable(true, client.id, bufnr0, { autotrigger = true })
        end,
      })
    end)

    feed('ih')

    retry(100, nil, function()
      eq({ triggerKind = 2, triggerCharacter = 'h' }, exec_lua('return _G.params.context'))
    end)
  end)
end)

describe('vim.lsp.completion: integration', function()
  before_each(function()
    clear()
    exec_lua(create_server_definition)
    exec_lua(function()
      vim.fn.complete = vim.schedule_wrap(vim.fn.complete)
    end)
  end)

  it('puts cursor at the end of completed word', function()
    local completion_list = {
      isIncomplete = false,
      items = {
        {
          label = 'hello',
          insertText = '${1:hello} friends',
          insertTextFormat = 2,
        },
      },
    }
    exec_lua(function()
      vim.o.completeopt = 'menuone,noselect'
    end)
    create_server('dummy', completion_list)
    feed('i world<esc>0ih<c-x><c-o>')
    retry(nil, nil, function()
      eq(
        1,
        exec_lua(function()
          return vim.fn.pumvisible()
        end)
      )
    end)
    feed('<C-n><C-y>')
    eq(
      { true, { 'hello friends world' } },
      exec_lua(function()

Review comment (suggestion):
also need a positive confirmation that pum *does* appear (or some other way of confirming that the negative confirmation below is actually meaningful) before this.

currently, `assert_cleanup_after_detach` passes for 2/3 of the cases, even if `buf_detach_client` is not called.

Code after:
        on_attach = function(client, bufnr0)
          vim.lsp.completion.enable(true, client.id, bufnr0, { autotrigger = true })
        end,
      })
    end)

    feed('ih')

    retry(100, nil, function()
      eq({ triggerKind = 2, triggerCharacter = 'h' }, exec_lua('return _G.params.context'))
    end)
  end)
end)

describe('vim.lsp.completion: integration', function()
  before_each(function()
    clear()
    exec_lua(create_server_definition)
    exec_lua(function()
      vim.fn.complete = vim.schedule_wrap(vim.fn.complete)
    end)
  end)

  local assert_cleanup_after_detach = function(client_id)
    exec_lua(function()
      vim.lsp.buf_detach_client(0, client_id)
    end)
    -- After detach, trigger and verify this client no longer contributes
    exec_lua(function()
      vim.lsp.completion.get()
    end)
    retry(nil, nil, function()
      eq(
        0,
        exec_lua(function()
          return vim.fn.pumvisible()
        end)
      )
    end)
  end

  it('puts cursor at the end of completed word', function()
    local completion_list = {
      isIncomplete = false,
      items = {
        {
          label = 'hello',
          insertText = '${1:hello} friends',
          insertTextFormat = 2,
        },
      },