🥅

nvim_create_user_commandの補完候補をフィルターする

2022/07/16に公開

Neovimでは、luaファイル内でvim.api.nvim_create_user_command()を使ってEXコマンドを定義することができます。

このとき、completeオプションとして、コマンド引数候補のリストを返すlua関数を設定することができます。
このリストは-complete=customlistのように扱われるので、ユーザーの入力でフィルターされません。常にリストすべてが候補として出力されます。

nvim_create_user_command.lua
local complete_list = {
  'matter', 'milk', 'mother', 'motion', 'mountain', 'mouse', 'mouth'
}

vim.api.nvim_create_user_command(
  'MyCommand',
  function(opts)
    print(opts.fargs[1])
  end,
  {
    nargs = 1,
    complete = function(_, _, _)
      return complete_list
    end
  }
)


'mou'まで入力しても、'matter'などが候補に出てしまう

ユーザーの入力に応じて表示する候補を絞るには、以下のように手動でフィルター処理を行う必要があります。

nvim_create_user_command.lua
local complete_list = {
  'matter', 'milk', 'mother', 'motion', 'mountain', 'mouse', 'mouth'
}

vim.api.nvim_create_user_command(
  'MyCommand',
  function(opts)
    print(opts.fargs[1])
  end,
  {
    nargs = 1,
    complete = function(arg_lead, _, _)
      local out = {}
      for _, c in ipairs(complete_list) do
        if vim.startswith(c, arg_lead) then
          table.insert(out, c)
        end
      end
      return out
    end
  }
)


入力内容によって候補が絞られる

参考

nvim_create_user_commandの解説
https://github.com/willelz/nvim-lua-guide-ja/blob/master/README.ja.md#ユーザーコマンドを定義する

GIF画像のカラースキームはbase16のayu-mirage
https://github.com/base16-project/base16-vim

Discussion