X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=runtime%2Fplugins%2Fcomment%2Fcomment.lua;h=ce49dcaabb7becbadda52f0e5727dfa38f6319f6;hb=54c23cae72d7237bc898a59f79aad0acffdf0ffe;hp=68bbc01cc2083ffa210713bb63c1d7fe608ef899;hpb=5bfc892a74497d7a83da3af20cf2791b7146ee3a;p=micro.git diff --git a/runtime/plugins/comment/comment.lua b/runtime/plugins/comment/comment.lua index 68bbc01c..ce49dcaa 100644 --- a/runtime/plugins/comment/comment.lua +++ b/runtime/plugins/comment/comment.lua @@ -35,6 +35,7 @@ ft["markdown"] = "" ft["nginx"] = "# %s" ft["nim"] = "# %s" ft["objc"] = "// %s" +ft["ocaml"] = "(* %s *)" ft["pascal"] = "{ %s }" ft["perl"] = "# %s" ft["php"] = "// %s" @@ -69,10 +70,38 @@ function onBufferOpen(buf) end end +function isCommented(bp, lineN, commentRegex) + local line = bp.Buf:Line(lineN) + if string.match(line, commentRegex) then + return true + end + return false +end + function commentLine(bp, lineN) local line = bp.Buf:Line(lineN) local commentType = bp.Buf.Settings["commenttype"] - local commentRegex = "^%s*" .. commentType:gsub("%%","%%%%"):gsub("%$","%$"):gsub("%)","%)"):gsub("%(","%("):gsub("%?","%?"):gsub("%*", "%*"):gsub("%-", "%-"):gsub("%.", "%."):gsub("%+", "%+"):gsub("%]", "%]"):gsub("%[", "%["):gsub("%%%%s", "(.*)") + local sel = -bp.Cursor.CurSelection + local curpos = -bp.Cursor.Loc + local index = string.find(commentType, "%%s") - 1 + local commentedLine = commentType:gsub("%%s", trim(line)) + bp.Buf:Replace(buffer.Loc(0, lineN), buffer.Loc(#line, lineN), util.GetLeadingWhitespace(line) .. commentedLine) + if bp.Cursor:HasSelection() then + bp.Cursor.CurSelection[1].Y = sel[1].Y + bp.Cursor.CurSelection[2].Y = sel[2].Y + bp.Cursor.CurSelection[1].X = sel[1].X + bp.Cursor.CurSelection[2].X = sel[2].X + else + bp.Cursor.X = curpos.X + index + bp.Cursor.Y = curpos.Y + end + bp.Cursor:Relocate() + bp.Cursor.LastVisualX = bp.Cursor:GetVisualX() +end + +function uncommentLine(bp, lineN, commentRegex) + local line = bp.Buf:Line(lineN) + local commentType = bp.Buf.Settings["commenttype"] local sel = -bp.Cursor.CurSelection local curpos = -bp.Cursor.Loc local index = string.find(commentType, "%%s") - 1 @@ -88,46 +117,57 @@ function commentLine(bp, lineN) bp.Cursor.X = curpos.X - index bp.Cursor.Y = curpos.Y end - else - local commentedLine = commentType:gsub("%%s", trim(line)) - bp.Buf:Replace(buffer.Loc(0, lineN), buffer.Loc(#line, lineN), util.GetLeadingWhitespace(line) .. commentedLine) - if bp.Cursor:HasSelection() then - bp.Cursor.CurSelection[1].Y = sel[1].Y - bp.Cursor.CurSelection[2].Y = sel[2].Y - bp.Cursor.CurSelection[1].X = sel[1].X - bp.Cursor.CurSelection[2].X = sel[2].X - else - bp.Cursor.X = curpos.X + index - bp.Cursor.Y = curpos.Y - end end bp.Cursor:Relocate() bp.Cursor.LastVisualX = bp.Cursor:GetVisualX() end -function commentSelection(bp, startLine, endLine) +function toggleCommentLine(bp, lineN, commentRegex) + if isCommented(bp, lineN, commentRegex) then + uncommentLine(bp, lineN, commentRegex) + else + commentLine(bp, lineN) + end +end + +function toggleCommentSelection(bp, startLine, endLine, commentRegex) + local allComments = true for line = startLine, endLine do - commentLine(bp, line) + if not isCommented(bp, line, commentRegex) then + allComments = false + break + end + end + + for line = startLine, endLine do + if allComments then + uncommentLine(bp, line, commentRegex) + else + commentLine(bp, line) + end end end function comment(bp, args) + local commentType = bp.Buf.Settings["commenttype"] + local commentRegex = "^%s*" .. commentType:gsub("%%","%%%%"):gsub("%$","%$"):gsub("%)","%)"):gsub("%(","%("):gsub("%?","%?"):gsub("%*", "%*"):gsub("%-", "%-"):gsub("%.", "%."):gsub("%+", "%+"):gsub("%]", "%]"):gsub("%[", "%["):gsub("%%%%s", "(.*)"):gsub("%s+", "%s*") + if bp.Cursor:HasSelection() then if bp.Cursor.CurSelection[1]:GreaterThan(-bp.Cursor.CurSelection[2]) then local endLine = bp.Cursor.CurSelection[1].Y if bp.Cursor.CurSelection[1].X == 0 then endLine = endLine - 1 end - commentSelection(bp, bp.Cursor.CurSelection[2].Y, endLine) + toggleCommentSelection(bp, bp.Cursor.CurSelection[2].Y, endLine, commentRegex) else local endLine = bp.Cursor.CurSelection[2].Y if bp.Cursor.CurSelection[2].X == 0 then endLine = endLine - 1 end - commentSelection(bp, bp.Cursor.CurSelection[1].Y, endLine) + toggleCommentSelection(bp, bp.Cursor.CurSelection[1].Y, endLine, commentRegex) end else - commentLine(bp, bp.Cursor.Y) + toggleCommentLine(bp, bp.Cursor.Y, commentRegex) end end @@ -143,5 +183,6 @@ end function init() config.MakeCommand("comment", comment, config.NoComplete) config.TryBindKey("Alt-/", "lua:comment.comment", false) + config.TryBindKey("CtrlUnderscore", "lua:comment.comment", false) config.AddRuntimeFile("comment", config.RTHelp, "help/comment.md") end