Feature: add set end pair length

It help to determine the length of end_pair string when it have a special
key like <left> <right> and it can help to move cursor to a middle
of end pair
This commit is contained in:
windwp 2021-08-08 10:29:28 +07:00
parent 50fec950de
commit f561472efb
3 changed files with 37 additions and 11 deletions

View File

@ -295,7 +295,8 @@ M.autopairs_map = function(bufnr, char)
and rule:can_pair(cond_opt)
then
local end_pair = rule:get_end_pair(cond_opt)
local move_text = utils.repeat_key(utils.key.join_left,#end_pair)
local end_pair_length = rule:get_end_pair_length(end_pair)
local move_text = utils.repeat_key(utils.key.join_left, end_pair_length)
if add_char == 0 then
move_text =""
char = ""
@ -352,7 +353,7 @@ M.autopairs_insert = function(bufnr, char)
local end_pair = rule:get_end_pair(cond_opt)
utils.set_vchar(char .. end_pair)
vim.schedule(function()
utils.feed(utils.key.left, #end_pair)
utils.feed(utils.key.left, rule:get_end_pair_length(end_pair))
end)
return
end

View File

@ -32,7 +32,10 @@ function Rule.new(...)
-- only use on end_wise
is_endwise = false,
-- use regex to compare
is_regex = false
is_regex = false,
-- some end_pair have key map like <left>.. then the length of string is
-- not correct
end_pair_length = nil,
},opt)
return setmetatable(opt, {__index = Rule})
end
@ -52,7 +55,17 @@ function Rule:get_end_pair(opts)
if self.end_pair_func then
return self.end_pair_func(opts)
end
return self.end_pair
return self.end_pair
end
function Rule:get_end_pair_length(opts)
if self.end_pair_length then
return self.end_pair_length
end
if type(opts) == 'string' then
return #opts
end
return self.get_end_pair(opts):length()
end
function Rule:replace_endpair(value,check_pair)
@ -67,6 +80,11 @@ function Rule:replace_endpair(value,check_pair)
return self
end
function Rule:set_end_pair_length(length)
self.end_pair_length = length
return self
end
function Rule:with_move(cond)
if self.move_cond == nil then self.move_cond = {}end
table.insert(self.move_cond, cond)

View File

@ -390,14 +390,20 @@ local data = {
},
{
setup_func = function()
npairs.add_rule(Rule("!", "!"):with_pair(cond.not_filetypes({"lua"})))
npairs.clear_rules()
npairs.add_rules({
Rule("%(.*%)%s*%=>", " { }", {"typescript", "typescriptreact","javascript"})
:use_regex(true)
:set_end_pair_length(2)
})
end,
name="enable pairs in html",
filetype="html",
key="!",
before = [[x| ]],
after = [[x!|! ]]
},
name="mapping regex with custom end_pair_length",
filetype="typescript",
key=">",
before = [[(o)=| ]],
after = [[(o)=> { | } ]]
}
}
local run_data = {}
@ -436,6 +442,7 @@ local function Test(test_data)
if value.key ~= '<cr>' then
eq(after, result , "\n\n text error: " .. value.name .. "\n")
eq(p_after, pos[3] + 1, "\n\n pos error: " .. value.name .. "\n")
else
local line2 = vim.fn.getline(line + 2)
eq(line + 1, pos[2], '\n\n breakline error:' .. value.name .. "\n")