目前我的 Tab 按键绑定如下,使用了 Neovim 的原生 snippet 功能,逻辑是:
- 如果有 snippet 区块能跳转的话,那么就直接跳出括号
- 否则,判断是否是括号的另外一边,如果是,直接跳出
- 否则,直接按照原来 tab 的逻辑执行
-- Keymap for snippet
local function is_pair()
local col = vim.fn.col('.') - 1
local next_char = vim.fn.getline('.'):sub(col + 1, col + 1)
return next_char:match("[%)%]}>\"';`]") ~= nil
end
vim.keymap.set({ 'i', 's' }, '<Tab>', function()
if vim.snippet.active({ direction = 1 }) then
return '<cmd>lua vim.snippet.jump(1)<cr>'
elseif is_pair() then -- Tabout
vim.api.nvim_input('<Right>')
else
return '<Tab>'
end
end, { expr = true })
vim.keymap.set({ 'i', 's' }, '<S-Tab>', function()
if vim.snippet.active({ direction = -1 }) then
return '<cmd>lua vim.snippet.jump(-1)<cr>'
end
end, { expr = true })