X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=runtime%2Fplugins%2Fautoclose%2Fautoclose.lua;h=531b7601962d0a0881d773ccccc05587be47c30a;hb=54c23cae72d7237bc898a59f79aad0acffdf0ffe;hp=ff143516d39ece0eb4192b6cf3ac9482e30f5609;hpb=ddcebe49467fdbca5ae8351c15eabbcdec96b9ee;p=micro.git diff --git a/runtime/plugins/autoclose/autoclose.lua b/runtime/plugins/autoclose/autoclose.lua index ff143516..531b7601 100644 --- a/runtime/plugins/autoclose/autoclose.lua +++ b/runtime/plugins/autoclose/autoclose.lua @@ -1,80 +1,73 @@ -function charAt(str, i) - return string.sub(str, i, i) -end - -if GetOption("autoclose") == nil then - AddOption("autoclose", true) -end +VERSION = "1.0.0" -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() - v:CursorRight() + 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 == uutil.CharacterCountInString(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 onInsertEnter() - if not GetOption("autoclose") then - return - end - - local v = CurView() - local curLine = v.Buf:Line(v.Cursor.Y) - local lastLine = v.Buf:Line(v.Cursor.Y-1) - local curRune = charAt(lastLine, #lastLine) - local nextRune = charAt(curLine, 1) +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:InsertTab() - v.Buf:Insert(-v.Cursor.Loc, "\n") + bp:InsertNewline() + bp:InsertTab() + bp.Buf:Insert(-bp.Cursor.Loc, "\n" .. ws) + bp:StartOfLine() + bp:CursorLeft() + return false end end end -end -function preBackspace() - if not GetOption("autoclose") then - return - end - - local v = CurView() + return true +end +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() + 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