diff --git a/lua/nvim-autopairs.lua b/lua/nvim-autopairs.lua index d3c2aa6..6f71be7 100644 --- a/lua/nvim-autopairs.lua +++ b/lua/nvim-autopairs.lua @@ -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 diff --git a/lua/nvim-autopairs/rule.lua b/lua/nvim-autopairs/rule.lua index 1355d5c..1fbc07c 100644 --- a/lua/nvim-autopairs/rule.lua +++ b/lua/nvim-autopairs/rule.lua @@ -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 .. 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) diff --git a/tests/nvim-autopairs_spec.lua b/tests/nvim-autopairs_spec.lua index 7bba1e1..33345db 100644 --- a/tests/nvim-autopairs_spec.lua +++ b/tests/nvim-autopairs_spec.lua @@ -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 ~= '' 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")