feat(nvim): added new rules to nvim-autopairs

This commit is contained in:
Sergio Laín 2023-11-28 13:23:09 +01:00
parent f75ab5f560
commit 01d7f996d8
No known key found for this signature in database
GPG key ID: 14C9B8080681777B

View file

@ -8,15 +8,107 @@ return {
opts = function() opts = function()
local cmp = require("cmp") local cmp = require("cmp")
local cmp_autopairs = require("nvim-autopairs.completion.cmp") local cmp_autopairs = require("nvim-autopairs.completion.cmp")
local Rule = require("nvim-autopairs.rule") local ts_utils = require("nvim-treesitter.ts_utils")
local ts_node_func_parens_disabled = {
-- ecma
named_imports = true,
-- rust
use_declaration = true,
}
local npairs = require("nvim-autopairs") local npairs = require("nvim-autopairs")
local Rule = require("nvim-autopairs.rule")
local cond = require("nvim-autopairs.conds") local cond = require("nvim-autopairs.conds")
local brackets = { { "(", ")" }, { "[", "]" }, { "{", "}" } }
local get_closing_for_line = function(line)
local i = -1
local clo = ""
while true do
i, _ = string.find(line, "[%(%)%{%}%[%]]", i + 1)
if i == nil then
break
end
local ch = string.sub(line, i, i)
local st = string.sub(clo, 1, 1)
if ch == "{" then
clo = "}" .. clo
elseif ch == "}" then
if st ~= "}" then
return ""
end
clo = string.sub(clo, 2)
elseif ch == "(" then
clo = ")" .. clo
elseif ch == ")" then
if st ~= ")" then
return ""
end
clo = string.sub(clo, 2)
elseif ch == "[" then
clo = "]" .. clo
elseif ch == "]" then
if st ~= "]" then
return ""
end
clo = string.sub(clo, 2)
end
end
return clo
end
local default_handler = cmp_autopairs.filetypes["*"]["("].handler
cmp_autopairs.filetypes["*"]["("].handler = function(char, item, bufnr, rules, commit_character)
local node_type = ts_utils.get_node_at_cursor():type()
if ts_node_func_parens_disabled[node_type] then
if item.data then
item.data.funcParensDisabled = true
else
char = ""
end
end
default_handler(char, item, bufnr, rules, commit_character)
end
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())
npairs.add_rules({ npairs.add_rules({
-- Rule for a pair with left-side ' ' and right side ' '
Rule(" ", " ")
-- Pair will only occur if the conditional function returns true
:with_pair(function(opts)
-- We are checking if we are inserting a space in (), [], or {}
local pair = opts.line:sub(opts.col - 1, opts.col)
return vim.tbl_contains({
brackets[1][1] .. brackets[1][2],
brackets[2][1] .. brackets[2][2],
brackets[3][1] .. brackets[3][2],
}, pair)
end)
:with_move(cond.none())
:with_cr(cond.none())
-- We only want to delete the pair of spaces when the cursor is as such: ( | )
:with_del(
function(opts)
local col = vim.api.nvim_win_get_cursor(0)[2]
local context = opts.line:sub(col - 1, col + 2)
return vim.tbl_contains({
brackets[1][1] .. " " .. brackets[1][2],
brackets[2][1] .. " " .. brackets[2][2],
brackets[3][1] .. " " .. brackets[3][2],
}, context)
end
),
-- Javascript arrow key
Rule("%(.*%)%s*%=>$", " { }", { "typescript", "typescriptreact", "javascript" }) Rule("%(.*%)%s*%=>$", " { }", { "typescript", "typescriptreact", "javascript" })
:use_regex(true) :use_regex(true)
:set_end_pair_length(2), :set_end_pair_length(2),
-- Auto addspace on =
Rule("=", "") Rule("=", "")
:with_pair(cond.not_inside_quote()) :with_pair(cond.not_inside_quote())
:with_pair(function(opts) :with_pair(function(opts)
@ -45,7 +137,28 @@ return {
:with_move(cond.none()) :with_move(cond.none())
:with_del(cond.none()), :with_del(cond.none()),
}) })
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())
-- For each pair of brackets we will add another rule
for _, bracket in pairs(brackets) do
npairs.add_rules({
-- Each of these rules is for a pair with left-side '( ' and right-side ' )' for each bracket type
Rule(bracket[1] .. " ", " " .. bracket[2])
:with_pair(cond.none())
:with_move(function(opts)
return opts.char == bracket[2]
end)
:with_del(cond.none())
:use_key(bracket[2])
-- Removes the trailing whitespace that can occur without this
:replace_map_cr(function(_)
return "<C-c>2xi<CR><C-c>O"
end),
})
end
end, end,
}, },
{
"echasnovski/mini.pairs",
enabled = false,
},
} }