X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=runtime%2Fplugins%2Fautoclose%2Fautoclose.lua;h=add8842d1cf9903dad7854d30d6e882ca001ffb6;hb=60eec0eccd0d1bd9b8aaebcd17b02d6bfbc7b20a;hp=2480ffe01ce510321f39360210c92c7e67da96b3;hpb=d409c3a031321d57acc99e4fce3aa9d2f5b91a4a;p=micro.git diff --git a/runtime/plugins/autoclose/autoclose.lua b/runtime/plugins/autoclose/autoclose.lua index 2480ffe0..add8842d 100644 --- a/runtime/plugins/autoclose/autoclose.lua +++ b/runtime/plugins/autoclose/autoclose.lua @@ -1,66 +1,58 @@ -function charAt(str, i) - return string.sub(str, i, i) -end - -if GetOption("autoclose") == nil then - AddOption("autoclose", true) -end - -local autoclosePairs = {"\"\"", "''", "()", "{}", "[]"} +local uutil = import("micro/util") +local utf8 = import("utf8") +local autoclosePairs = {"\"\"", "''", "``", "()", "{}", "[]"} local autoNewlinePairs = {"()", "{}", "[]"} -function onRune(r) - if not GetOption("autoclose") then - return - end +function charAt(str, i) + -- lua indexing is one off from go + return uutil.RuneAt(str, i-1) +end - local v = CurView() +function onRune(bp, r) for i = 1, #autoclosePairs do if r == charAt(autoclosePairs[i], 2) then - local curLine = v.Buf:Line(v.Cursor.Y) + local curLine = bp.Buf:Line(bp.Cursor.Y) - if charAt(curLine, v.Cursor.X+1) == charAt(autoclosePairs[i], 2) then - v:Backspace(false) - v:CursorRight(false) + if charAt(curLine, bp.Cursor.X+1) == charAt(autoclosePairs[i], 2) then + bp:Backspace() + bp:CursorRight() break end - if v.Cursor.X > 1 and (IsWordChar(charAt(curLine, v.Cursor.X-1)) or charAt(curLine, v.Cursor.X-1) == charAt(autoclosePairs[i], 1)) then + if bp.Cursor.X > 1 and (uutil.IsWordChar(charAt(curLine, bp.Cursor.X-1)) or charAt(curLine, bp.Cursor.X-1) == charAt(autoclosePairs[i], 1)) then break end end if r == charAt(autoclosePairs[i], 1) then - local curLine = v.Buf:Line(v.Cursor.Y) + local curLine = bp.Buf:Line(bp.Cursor.Y) - if v.Cursor.X == #curLine or not IsWordChar(charAt(curLine, v.Cursor.X+1)) then - -- the '-' here is to derefence the pointer to v.Cursor.Loc which is automatically made + if bp.Cursor.X == utf8.RuneCountInString(curLine) or not uutil.IsWordChar(charAt(curLine, bp.Cursor.X+1)) then + -- the '-' here is to derefence the pointer to bp.Cursor.Loc which is automatically made -- when converting go structs to lua -- It needs to be dereferenced because the function expects a non pointer struct - v.Buf:Insert(-v.Cursor.Loc, charAt(autoclosePairs[i], 2)) + bp.Buf:Insert(-bp.Cursor.Loc, charAt(autoclosePairs[i], 2)) + bp:CursorLeft() break end end end + return true end -function preInsertNewline() - if not GetOption("autoclose") then - return - end - - local v = CurView() - local curLine = v.Buf:Line(v.Cursor.Y) - local curRune = charAt(curLine, v.Cursor.X) - local nextRune = charAt(curLine, v.Cursor.X+1) - local ws = GetLeadingWhitespace(curLine) - messenger:Message(curRune, " ", nextRune) +function preInsertNewline(bp) + local curLine = bp.Buf:Line(bp.Cursor.Y) + local curRune = charAt(curLine, bp.Cursor.X) + local nextRune = charAt(curLine, bp.Cursor.X+1) + local ws = uutil.GetLeadingWhitespace(curLine) for i = 1, #autoNewlinePairs do if curRune == charAt(autoNewlinePairs[i], 1) then if nextRune == charAt(autoNewlinePairs[i], 2) then - v:InsertNewline(false) - v:InsertTab(false) - v.Buf:Insert(-v.Cursor.Loc, "\n" .. ws) + bp:InsertNewline() + bp:InsertTab() + bp.Buf:Insert(-bp.Cursor.Loc, "\n" .. ws) + bp:StartOfLine() + bp:CursorLeft() return false end end @@ -69,17 +61,11 @@ function preInsertNewline() return true end -function preBackspace() - if not GetOption("autoclose") then - return - end - - local v = CurView() - +function preBackspace(bp) for i = 1, #autoclosePairs do - local curLine = v.Buf:Line(v.Cursor.Y) - if charAt(curLine, v.Cursor.X+1) == charAt(autoclosePairs[i], 2) and charAt(curLine, v.Cursor.X) == charAt(autoclosePairs[i], 1) then - v:Delete(false) + local curLine = bp.Buf:Line(bp.Cursor.Y) + if charAt(curLine, bp.Cursor.X+1) == charAt(autoclosePairs[i], 2) and charAt(curLine, bp.Cursor.X) == charAt(autoclosePairs[i], 1) then + bp:Delete() end end