diff options
-rw-r--r-- | plugins/dragdropselected.lua | 240 | ||||
-rw-r--r-- | plugins/language_R.lua | 69 | ||||
-rw-r--r-- | plugins/language_powershell.lua | 141 | ||||
-rw-r--r-- | plugins/language_rivet.lua | 192 | ||||
-rw-r--r-- | plugins/language_ruby.lua | 2 | ||||
-rw-r--r-- | plugins/language_rust.lua | 122 | ||||
-rw-r--r-- | plugins/language_wren.lua | 4 | ||||
-rw-r--r-- | plugins/minimap.lua | 906 | ||||
-rw-r--r-- | plugins/regexreplacepreview.lua | 215 | ||||
-rw-r--r-- | plugins/select_colorscheme.lua | 16 | ||||
-rw-r--r-- | plugins/themeselect.lua | 5 |
11 files changed, 961 insertions, 951 deletions
diff --git a/plugins/dragdropselected.lua b/plugins/dragdropselected.lua index ec998aa..3c6583b 100644 --- a/plugins/dragdropselected.lua +++ b/plugins/dragdropselected.lua @@ -1,13 +1,13 @@ -- mod-version:3 --[[ - dragdropselected.lua - provides basic drag and drop of selected text (in same document) - version: 20200627_133351 - originally by SwissalpS - - TODO: use OS drag and drop events - TODO: change mouse cursor when duplicating - TODO: add dragging image + dragdropselected.lua + provides basic drag and drop of selected text (in same document) + version: 20200627_133351 + originally by SwissalpS + + TODO: use OS drag and drop events + TODO: change mouse cursor when duplicating + TODO: add dragging image --]] local DocView = require "core.docview" local core = require "core" @@ -22,16 +22,16 @@ local style = require "core.style" -- iSelLine2 is line number where selection ends -- iSelCol2 is column where selection ends local function isInSelection(iLine, iCol, iSelLine1, iSelCol1, iSelLine2, iSelCol2) - if iLine < iSelLine1 then return false end - if iLine > iSelLine2 then return false end - if (iLine == iSelLine1) and (iCol < iSelCol1) then return false end - if (iLine == iSelLine2) and (iCol > iSelCol2) then return false end - return true + if iLine < iSelLine1 then return false end + if iLine > iSelLine2 then return false end + if (iLine == iSelLine1) and (iCol < iSelCol1) then return false end + if (iLine == iSelLine2) and (iCol > iSelCol2) then return false end + return true end -- isInSelection -- distance between two points local function distance(x1, y1, x2, y2) - return math.sqrt(math.pow(x2-x1, 2)+math.pow(y2-y1, 2)) + return math.sqrt(math.pow(x2-x1, 2)+math.pow(y2-y1, 2)) end local min_drag = style.code_font:get_width(" ") @@ -40,126 +40,138 @@ local min_drag = style.code_font:get_width(" ") local on_mouse_moved = DocView.on_mouse_moved function DocView:on_mouse_moved(x, y, ...) - local sCursor = nil - - -- make sure we only act if previously on_mouse_pressed was in selection - if self.bClickedIntoSelection and - ( -- we are already dragging or we moved enough to start dragging - not self.drag_start_loc or - distance(self.drag_start_loc[1],self.drag_start_loc[2], x, y) > min_drag - ) then - self.drag_start_loc = nil - - -- show that we are dragging something - sCursor = 'hand' - - -- calculate line and column for current mouse position - local iLine, iCol = self:resolve_screen_position(x, y) - local iSelLine1 = self.dragged_selection[1] - local iSelCol1 = self.dragged_selection[2] - local iSelLine2 = self.dragged_selection[3] - local iSelCol2 = self.dragged_selection[4] - self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) - if not isInSelection(iLine, iCol, iSelLine1, iSelCol1, iSelLine2, iSelCol2) then - -- show cursor only if outside selection - self.doc:add_selection(iLine, iCol) - end - -- update scroll position - self:scroll_to_line(iLine, true) - end -- if previously clicked into selection + local sCursor = nil + + -- make sure we only act if previously on_mouse_pressed was in selection + if + self.bClickedIntoSelection + and + ( -- we are already dragging or we moved enough to start dragging + not self.drag_start_loc or + distance(self.drag_start_loc[1],self.drag_start_loc[2], x, y) > min_drag + ) + then + self.drag_start_loc = nil - -- hand off to 'old' on_mouse_moved() - on_mouse_moved(self, x, y, ...) - -- override cursor as needed - if sCursor then self.cursor = sCursor end + -- show that we are dragging something + sCursor = 'hand' + + -- calculate line and column for current mouse position + local iLine, iCol = self:resolve_screen_position(x, y) + local iSelLine1 = self.dragged_selection[1] + local iSelCol1 = self.dragged_selection[2] + local iSelLine2 = self.dragged_selection[3] + local iSelCol2 = self.dragged_selection[4] + self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) + if not isInSelection(iLine, iCol, iSelLine1, iSelCol1, iSelLine2, iSelCol2) then + -- show cursor only if outside selection + self.doc:add_selection(iLine, iCol) + end + -- update scroll position + self:scroll_to_line(iLine, true) + end -- if previously clicked into selection + + -- hand off to 'old' on_mouse_moved() + on_mouse_moved(self, x, y, ...) + -- override cursor as needed + if sCursor then self.cursor = sCursor end end -- DocView:on_mouse_moved -- override DocView:on_mouse_pressed local on_mouse_pressed = DocView.on_mouse_pressed function DocView:on_mouse_pressed(button, x, y, clicks) - local caught = DocView.super.on_mouse_pressed(self, button, x, y, clicks) - if caught then - return caught - end - -- no need to proceed if not left button or has no selection - if ('left' ~= button) - or (not self.doc:has_selection()) - or (1 < clicks) then - return on_mouse_pressed(self, button, x, y, clicks) - end - -- convert pixel coordinates to line and column coordinates - local iLine, iCol = self:resolve_screen_position(x, y) - -- get selection coordinates - local iSelLine1, iSelCol1, iSelLine2, iSelCol2 = self.doc:get_selection(true) - -- set flag for on_mouse_released and on_mouse_moved() methods to detect dragging - self.bClickedIntoSelection = isInSelection(iLine, iCol, iSelLine1, iSelCol1, - iSelLine2, iSelCol2) - if self.bClickedIntoSelection then - self.drag_start_loc = { x, y } - -- stash selection for inserting later - self.sDraggedText = self.doc:get_text(self.doc:get_selection()) - self.dragged_selection = { iSelLine1, iSelCol1, iSelLine2, iSelCol2 } - else - self.bClickedIntoSelection = nil - self.dragged_selection = nil - -- let 'old' on_mouse_pressed() do whatever it needs to do - on_mouse_pressed(self, button, x, y, clicks) - end + local caught = DocView.super.on_mouse_pressed(self, button, x, y, clicks) + if caught then + return caught + end + -- no need to proceed if not left button or has no selection + if + ('left' ~= button) + or (not self.doc:has_selection()) + or (1 < clicks) + then + return on_mouse_pressed(self, button, x, y, clicks) + end + -- convert pixel coordinates to line and column coordinates + local iLine, iCol = self:resolve_screen_position(x, y) + -- get selection coordinates + local iSelLine1, iSelCol1, iSelLine2, iSelCol2 = self.doc:get_selection(true) + -- set flag for on_mouse_released and on_mouse_moved() methods to detect dragging + self.bClickedIntoSelection = isInSelection(iLine, iCol, iSelLine1, iSelCol1, + iSelLine2, iSelCol2) + if self.bClickedIntoSelection then + self.drag_start_loc = { x, y } + -- stash selection for inserting later + self.sDraggedText = self.doc:get_text(self.doc:get_selection()) + self.dragged_selection = { iSelLine1, iSelCol1, iSelLine2, iSelCol2 } + else + self.bClickedIntoSelection = nil + self.dragged_selection = nil + -- let 'old' on_mouse_pressed() do whatever it needs to do + on_mouse_pressed(self, button, x, y, clicks) + end end -- DocView:on_mouse_pressed -- override DocView:on_mouse_released() local on_mouse_released = DocView.on_mouse_released function DocView:on_mouse_released(button, x, y) - local iLine, iCol = self:resolve_screen_position(x, y) - if self.bClickedIntoSelection then - local iSelLine1, iSelCol1, iSelLine2, iSelCol2 = table.unpack(self.dragged_selection) - if not self.drag_start_loc - and not isInSelection(iLine, iCol, iSelLine1, iSelCol1, iSelLine2, iSelCol2) then - -- insert stashed selected text at current position - if iLine < iSelLine1 or (iLine == iSelLine1 and iCol < iSelCol1) then - -- delete first - self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) - if not keymap.modkeys['ctrl'] then - self.doc:delete_to(0) - end - self.doc:set_selection(iLine, iCol) - self.doc:text_input(self.sDraggedText) - else - -- insert first - self.doc:set_selection(iLine, iCol) - self.doc:text_input(self.sDraggedText) - self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) - if not keymap.modkeys['ctrl'] then - self.doc:delete_to(0) - end - self.doc:set_selection(iLine, iCol) - end - elseif self.drag_start_loc then - -- deselect only if the drag never happened - self.doc:set_selection(iLine, iCol) + local iLine, iCol = self:resolve_screen_position(x, y) + if self.bClickedIntoSelection then + local iSelLine1, iSelCol1, iSelLine2, iSelCol2 = table.unpack(self.dragged_selection) + if + not self.drag_start_loc + and + not isInSelection(iLine, iCol, iSelLine1, iSelCol1, iSelLine2, iSelCol2) + then + -- insert stashed selected text at current position + if iLine < iSelLine1 or (iLine == iSelLine1 and iCol < iSelCol1) then + -- delete first + self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) + if not keymap.modkeys['ctrl'] then + self.doc:delete_to(0) end - -- unset stash and flag(s) TODO: - self.sDraggedText = '' - self.bClickedIntoSelection = nil + self.doc:set_selection(iLine, iCol) + self.doc:text_input(self.sDraggedText) + else + -- insert first + self.doc:set_selection(iLine, iCol) + self.doc:text_input(self.sDraggedText) + self.doc:set_selection(iSelLine1, iSelCol1, iSelLine2, iSelCol2) + if not keymap.modkeys['ctrl'] then + self.doc:delete_to(0) + end + self.doc:set_selection(iLine, iCol) + end + elseif self.drag_start_loc then + -- deselect only if the drag never happened + self.doc:set_selection(iLine, iCol) end + -- unset stash and flag(s) TODO: + self.sDraggedText = '' + self.bClickedIntoSelection = nil + end - -- hand over to old handler - on_mouse_released(self, button, x, y) + -- hand over to old handler + on_mouse_released(self, button, x, y) end -- DocView:on_mouse_released -- override DocView:draw_caret() local draw_caret = DocView.draw_caret function DocView:draw_caret(x, y) - if self.bClickedIntoSelection then - local iLine, iCol = self:resolve_screen_position(x, y) - -- don't show carets inside selections - if isInSelection(iLine, iCol, - self.dragged_selection[1], self.dragged_selection[2], - self.dragged_selection[3], self.dragged_selection[4]) then - return - end + if self.bClickedIntoSelection then + local iLine, iCol = self:resolve_screen_position(x, y) + -- don't show carets inside selections + if + isInSelection( + iLine, iCol, + self.dragged_selection[1], self.dragged_selection[2], + self.dragged_selection[3], self.dragged_selection[4] + ) + then + return end - draw_caret(self, x, y) + end + draw_caret(self, x, y) end -- DocView:draw_caret() diff --git a/plugins/language_R.lua b/plugins/language_R.lua index a0bebed..afe3d1e 100644 --- a/plugins/language_R.lua +++ b/plugins/language_R.lua @@ -2,39 +2,38 @@ local syntax = require "core.syntax" syntax.add{ - name = "R", - files = {"%.r$", "%.rds$", "%.rda$", "%.rdata$", "%.R$"}, - comment = "#", - patterns = { - {pattern = {"#", "\n"}, type = "comment"}, - {pattern = {'"', '"'}, type = "string"}, - {pattern = {"'", "'"}, type = "string"}, - {pattern = "[%a_][%w_]*%f[(]", type = "function"}, - {pattern = "[%a_][%w_]*", type = "symbol"}, - {pattern = "[%+%-=/%*%^%%<>!|&]", type = "operator"}, - {pattern = "0x[%da-fA-F]+", type = "number"}, - {pattern = "-?%d+[%d%.eE]*", type = "number"}, - {pattern = "-?%.?%d+", type = "number"}, - - }, - symbols = { - ["TRUE"] = "literal", - ["FALSE"] = "literal", - ["NA"] = "literal", - ["NULL"] = "literal", - ["Inf"] = "literal", - ["if"] = "keyword", - ["else"] = "keyword", - ["while"] = "keyword", - ["function"] = "keyword", - ["break"] = "keyword", - ["next"] = "keyword", - ["repeat"] = "keyword", - ["in"] = "keyword", - ["for"] = "keyword", - ["NA_integer"] = "keyword", - ["NA_complex"] = "keyword", - ["NA_character"] = "keyword", - ["NA_real"] = "keyword" - } + name = "R", + files = {"%.r$", "%.rds$", "%.rda$", "%.rdata$", "%.R$"}, + comment = "#", + patterns = { + {pattern = {"#", "\n"}, type = "comment"}, + {pattern = {'"', '"'}, type = "string"}, + {pattern = {"'", "'"}, type = "string"}, + {pattern = "[%a_][%w_]*%f[(]", type = "function"}, + {pattern = "[%a_][%w_]*", type = "symbol"}, + {pattern = "[%+%-=/%*%^%%<>!|&]", type = "operator"}, + {pattern = "0x[%da-fA-F]+", type = "number"}, + {pattern = "-?%d+[%d%.eE]*", type = "number"}, + {pattern = "-?%.?%d+", type = "number"}, + }, + symbols = { + ["TRUE"] = "literal", + ["FALSE"] = "literal", + ["NA"] = "literal", + ["NULL"] = "literal", + ["Inf"] = "literal", + ["if"] = "keyword", + ["else"] = "keyword", + ["while"] = "keyword", + ["function"] = "keyword", + ["break"] = "keyword", + ["next"] = "keyword", + ["repeat"] = "keyword", + ["in"] = "keyword", + ["for"] = "keyword", + ["NA_integer"] = "keyword", + ["NA_complex"] = "keyword", + ["NA_character"] = "keyword", + ["NA_real"] = "keyword" + } } diff --git a/plugins/language_powershell.lua b/plugins/language_powershell.lua index 3350419..fdba844 100644 --- a/plugins/language_powershell.lua +++ b/plugins/language_powershell.lua @@ -2,73 +2,76 @@ local syntax = require "core.syntax" syntax.add { - name = "PowerShell", - files = {"%.ps1$", "%.psm1$", "%.psd1$", "%.ps1xml$", "%.pssc$", "%.psrc$", "%.cdxml$"}, - comment = "#", - patterns = { - {pattern = "#.*\n", type = "comment"}, - {pattern = [[\.]], type = "normal"}, - {pattern = {'"', '"'}, type = "string"}, - {pattern = {"'", "'"}, type = "string"}, - {pattern = "%f[%w_][%d%.]+%f[^%w_]", type = "number"}, - {pattern = "[%+=/%*%^%%<>!~|&,:]+", type = "operator"}, - {pattern = "%f[%S]%-[%w%-_]+", type = "function"}, - {pattern = "[%u][%a]+[%-][%u][%a]+", type = "function"}, - {pattern = "${.*}", type = "symbol"}, - {pattern = "$[%a_@*][%w_]*", type = "keyword2"}, - {pattern = "$[%$][%a]+", type = "keyword2"}, - {pattern = "[%a_][%w_]*", type = "symbol"} - }, - symbols = { - ["if"] = "keyword", - ["else"] = "keyword", - ["elseif"] = "keyword", - ["switch"] = "keyword", - ["default"] = "keyword", - ["function"] = "keyword", - ["filter"] = "keyword", - ["workflow"] = "keyword", - ["configuration"] = "keyword", - ["class"] = "keyword", - ["enum"] = "keyword", - ["Parameter"] = "keyword", - ["ValidateScript"] = "keyword", - ["CmdletBinding"] = "keyword", - ["try"] = "keyword", - ["catch"] = "keyword", - ["finally"] = "keyword", - ["throw"] = "keyword", - ["while"] = "keyword", - ["for"] = "keyword", - ["do"] = "keyword", - ["until"] = "keyword", - ["break"] = "keyword", - ["continue"] = "keyword", - ["foreach"] = "keyword", - ["in"] = "keyword", - ["return"] = "keyword", - ["where"] = "function", - ["select"] = "function", - ["filter"] = "keyword", - ["in"] = "keyword", - ["trap"] = "keyword", - ["param"] = "keyword", - ["data"] = "keyword", - ["dynamicparam"] = "keyword", - ["begin"] = "function", - ["process"] = "function", - ["end"] = "function", - ["exit"] = "function", - ["inlinescript"] = "function", - ["parallel"] = "function", - ["sequence"] = "function", - ["true"] = "literal", - ["false"] = "literal", - ["TODO"] = "comment", - ["FIXME"] = "comment", - ["XXX"] = "comment", - ["TBD"] = "comment", - ["HACK"] = "comment", - ["NOTE"] = "comment" - } + name = "PowerShell", + files = { + "%.ps1$", "%.psm1$", "%.psd1$", "%.ps1xml$", + "%.pssc$", "%.psrc$", "%.cdxml$" + }, + comment = "#", + patterns = { + {pattern = "#.*\n", type = "comment"}, + {pattern = [[\.]], type = "normal"}, + {pattern = {'"', '"'}, type = "string"}, + {pattern = {"'", "'"}, type = "string"}, + {pattern = "%f[%w_][%d%.]+%f[^%w_]", type = "number"}, + {pattern = "[%+=/%*%^%%<>!~|&,:]+", type = "operator"}, + {pattern = "%f[%S]%-[%w%-_]+", type = "function"}, + {pattern = "[%u][%a]+[%-][%u][%a]+", type = "function"}, + {pattern = "${.*}", type = "symbol"}, + {pattern = "$[%a_@*][%w_]*", type = "keyword2"}, + {pattern = "$[%$][%a]+", type = "keyword2"}, + {pattern = "[%a_][%w_]*", type = "symbol"} + }, + symbols = { + ["if"] = "keyword", + ["else"] = "keyword", + ["elseif"] = "keyword", + ["switch"] = "keyword", + ["default"] = "keyword", + ["function"] = "keyword", + ["filter"] = "keyword", + ["workflow"] = "keyword", + ["configuration"] = "keyword", + ["class"] = "keyword", + ["enum"] = "keyword", + ["Parameter"] = "keyword", + ["ValidateScript"] = "keyword", + ["CmdletBinding"] = "keyword", + ["try"] = "keyword", + ["catch"] = "keyword", + ["finally"] = "keyword", + ["throw"] = "keyword", + ["while"] = "keyword", + ["for"] = "keyword", + ["do"] = "keyword", + ["until"] = "keyword", + ["break"] = "keyword", + ["continue"] = "keyword", + ["foreach"] = "keyword", + ["in"] = "keyword", + ["return"] = "keyword", + ["where"] = "function", + ["select"] = "function", + ["filter"] = "keyword", + ["in"] = "keyword", + ["trap"] = "keyword", + ["param"] = "keyword", + ["data"] = "keyword", + ["dynamicparam"] = "keyword", + ["begin"] = "function", + ["process"] = "function", + ["end"] = "function", + ["exit"] = "function", + ["inlinescript"] = "function", + ["parallel"] = "function", + ["sequence"] = "function", + ["true"] = "literal", + ["false"] = "literal", + ["TODO"] = "comment", + ["FIXME"] = "comment", + ["XXX"] = "comment", + ["TBD"] = "comment", + ["HACK"] = "comment", + ["NOTE"] = "comment" + } } diff --git a/plugins/language_rivet.lua b/plugins/language_rivet.lua index 30d5e4e..574b368 100644 --- a/plugins/language_rivet.lua +++ b/plugins/language_rivet.lua @@ -6,108 +6,108 @@ local syntax = require "core.syntax" syntax.add { - name = "Rivet", - files = {"%.ri$"}, - comment = "//", - block_comment = {"/*", "*/"}, - patterns = { - {pattern = "//.-\n", type = "comment"}, - {pattern = {"/%*", "%*/"}, type = "comment"}, - {pattern = {'[rb]?"', '"', "\\"}, type = "string"}, - {pattern = {"[b]?'", "'", '\\' }, type = "string"}, - {pattern = "0b[01_]+", type = "number"}, - {pattern = "0o[0-7_]+", type = "number"}, - {pattern = "0x[%x_]+", type = "number"}, - {pattern = "%d[%d_]*%.[%d_]*[eE][-+]?%d+", type = "number"}, - {pattern = "%d[%d_]*%.[%d_]*", type = "number"}, - {pattern = "%d[%d_]*", type = "number"}, - {pattern = "-?%.?%d+", type = "number"}, - {pattern = "[%+%-=/%*%^%%<>!~|&%.%?]", type = "operator"}, - {pattern = "[%a_][%w_]*::", type = "keyword2"}, - {pattern = "[A-Z][%w_]*", type = "keyword2"}, -- types and constants - {pattern = "[%a_][%w_]*%f[(]", type = "function"}, - {pattern = "[%a_][%w_]*!%f[(]", type = "keyword2"}, - {pattern = "[%a_][%w_]*", type = "symbol"}, - {pattern = {"#%[", "%]"}, type = "keyword"}, - {pattern = "%$%s?[%a_][%w_]*", type = "keyword2"}, - {pattern = "%@%s?[%a_][%w_]*", type = "keyword2"}, - }, - symbols = { - ["extern"] = "keyword", - ["use"] = "keyword", + name = "Rivet", + files = {"%.ri$"}, + comment = "//", + block_comment = {"/*", "*/"}, + patterns = { + {pattern = "//.-\n", type = "comment"}, + {pattern = {"/%*", "%*/"}, type = "comment"}, + {pattern = {'[rb]?"', '"', "\\"}, type = "string"}, + {pattern = {"[b]?'", "'", '\\' }, type = "string"}, + {pattern = "0b[01_]+", type = "number"}, + {pattern = "0o[0-7_]+", type = "number"}, + {pattern = "0x[%x_]+", type = "number"}, + {pattern = "%d[%d_]*%.[%d_]*[eE][-+]?%d+", type = "number"}, + {pattern = "%d[%d_]*%.[%d_]*", type = "number"}, + {pattern = "%d[%d_]*", type = "number"}, + {pattern = "-?%.?%d+", type = "number"}, + {pattern = "[%+%-=/%*%^%%<>!~|&%.%?]", type = "operator"}, + {pattern = "[%a_][%w_]*::", type = "keyword2"}, + {pattern = "[A-Z][%w_]*", type = "keyword2"}, -- types and constants + {pattern = "[%a_][%w_]*%f[(]", type = "function"}, + {pattern = "[%a_][%w_]*!%f[(]", type = "keyword2"}, + {pattern = "[%a_][%w_]*", type = "symbol"}, + {pattern = {"#%[", "%]"}, type = "keyword"}, + {pattern = "%$%s?[%a_][%w_]*", type = "keyword2"}, + {pattern = "%@%s?[%a_][%w_]*", type = "keyword2"}, + }, + symbols = { + ["extern"] = "keyword", + ["use"] = "keyword", - ["pub"] = "keyword", - ["as"] = "keyword", + ["pub"] = "keyword", + ["as"] = "keyword", - ["pkg"] = "keyword", - ["mod"] = "keyword", - ["const"] = "keyword", - ["static"] = "keyword", - ["trait"] = "keyword", - ["struct"] = "keyword", - ["union"] = "keyword", - ["type"] = "keyword", - ["errtype"] = "keyword", - ["enum"] = "keyword", - ["fn"] = "keyword", - ["test"] = "keyword", - ["extend"] = "keyword", + ["pkg"] = "keyword", + ["mod"] = "keyword", + ["const"] = "keyword", + ["static"] = "keyword", + ["trait"] = "keyword", + ["struct"] = "keyword", + ["union"] = "keyword", + ["type"] = "keyword", + ["errtype"] = "keyword", + ["enum"] = "keyword", + ["fn"] = "keyword", + ["test"] = "keyword", + ["extend"] = "keyword", - -- comptime `if` and `match` expr - ["$if"] = "keyword", - ["$elif"] = "keyword", - ["$else"] = "keyword", - ["$match"] = "keyword", + -- comptime `if` and `match` expr + ["$if"] = "keyword", + ["$elif"] = "keyword", + ["$else"] = "keyword", + ["$match"] = "keyword", - ["if"] = "keyword", - ["elif"] = "keyword", - ["else"] = "keyword", - ["match"] = "keyword", - ["while"] = "keyword", - ["for"] = "keyword", + ["if"] = "keyword", + ["elif"] = "keyword", + ["else"] = "keyword", + ["match"] = "keyword", + ["while"] = "keyword", + ["for"] = "keyword", - ["break"] = "keyword", - ["continue"] = "keyword", - ["return"] = "keyword", - ["raise"] = "keyword", + ["break"] = "keyword", + ["continue"] = "keyword", + ["return"] = "keyword", + ["raise"] = "keyword", - ["let"] = "keyword", - ["mut"] = "keyword", - ["unsafe"] = "keyword", - ["goto"] = "keyword", - ["orelse"] = "keyword", - ["catch"] = "keyword", - ["cast"] = "keyword", - ["or"] = "keyword", - ["and"] = "keyword", - ["is"] = "keyword", - ["in"] = "keyword", + ["let"] = "keyword", + ["mut"] = "keyword", + ["unsafe"] = "keyword", + ["goto"] = "keyword", + ["orelse"] = "keyword", + ["catch"] = "keyword", + ["cast"] = "keyword", + ["or"] = "keyword", + ["and"] = "keyword", + ["is"] = "keyword", + ["in"] = "keyword", - -- types - ["c_void"] = "keyword2", - ["void"] = "keyword2", - ["bool"] = "keyword2", - ["i8"] = "keyword2", - ["i16"] = "keyword2", - ["i32"] = "keyword2", - ["i64"] = "keyword2", - ["u8"] = "keyword2", - ["u16"] = "keyword2", - ["u32"] = "keyword2", - ["u64"] = "keyword2", - ["f32"] = "keyword2", - ["f64"] = "keyword2", - ["rune"] = "keyword2", - ["isize"] = "keyword2", - ["usize"] = "keyword2", - ["str"] = "keyword2", - ["Self"] = "keyword2", + -- types + ["c_void"] = "keyword2", + ["void"] = "keyword2", + ["bool"] = "keyword2", + ["i8"] = "keyword2", + ["i16"] = "keyword2", + ["i32"] = "keyword2", + ["i64"] = "keyword2", + ["u8"] = "keyword2", + ["u16"] = "keyword2", + ["u32"] = "keyword2", + ["u64"] = "keyword2", + ["f32"] = "keyword2", + ["f64"] = "keyword2", + ["rune"] = "keyword2", + ["isize"] = "keyword2", + ["usize"] = "keyword2", + ["str"] = "keyword2", + ["Self"] = "keyword2", - -- literals - ["base"] = "literal", - ["self"] = "literal", - ["true"] = "literal", - ["false"] = "literal", - ["none"] = "literal" - } + -- literals + ["base"] = "literal", + ["self"] = "literal", + ["true"] = "literal", + ["false"] = "literal", + ["none"] = "literal" + } } diff --git a/plugins/language_ruby.lua b/plugins/language_ruby.lua index af700c2..30f2be1 100644 --- a/plugins/language_ruby.lua +++ b/plugins/language_ruby.lua @@ -23,7 +23,6 @@ syntax.add { }, symbols = { ["nil"] = "literal", - ["end"] = "literal", ["true"] = "literal", ["false"] = "literal", ["private"] = "keyword", @@ -63,7 +62,6 @@ syntax.add { ["self"] = "keyword", ["super"] = "keyword", ["then"] = "keyword", - ["true"] = "keyword", ["undef"] = "keyword", ["unless"] = "keyword", ["until"] = "keyword", diff --git a/plugins/language_rust.lua b/plugins/language_rust.lua index 44a9980..848e8b1 100644 --- a/plugins/language_rust.lua +++ b/plugins/language_rust.lua @@ -23,68 +23,66 @@ syntax.add { { pattern = "[%a_][%w_]*", type = "symbol" }, }, symbols = { - ["as"] = "keyword", - ["async"] = "keyword", - ["await"] = "keyword", - ["break"] = "keyword", - ["const"] = "keyword", - ["continue"] = "keyword", - ["crate"] = "keyword", - ["dyn"] = "keyword", - ["else"] = "keyword", - ["enum"] = "keyword", - ["extern"] = "keyword", - ["false"] = "keyword", - ["fn"] = "keyword", - ["for"] = "keyword", - ["if"] = "keyword", - ["impl"] = "keyword", - ["in"] = "keyword", - ["let"] = "keyword", - ["loop"] = "keyword", - ["match"] = "keyword", - ["mod"] = "keyword", - ["move"] = "keyword", - ["mut"] = "keyword", - ["pub"] = "keyword", - ["ref"] = "keyword", - ["return"] = "keyword", - ["Self"] = "keyword", - ["self"] = "keyword", - ["static"] = "keyword", - ["struct"] = "keyword", - ["super"] = "keyword", - ["trait"] = "keyword", - ["true"] = "keyword", - ["type"] = "keyword", - ["unsafe"] = "keyword", - ["use"] = "keyword", - ["where"] = "keyword", - ["while"] = "keyword", - ["i32"] = "keyword2", - ["i64"] = "keyword2", - ["i128"] = "keyword2", - ["i16"] = "keyword2", - ["i8"] = "keyword2", - ["u8"] = "keyword2", - ["u16"] = "keyword2", - ["u32"] = "keyword2", - ["u64"] = "keyword2", - ["usize"] = "keyword2", - ["isize"] = "keyword2", - ["f32"] = "keyword2", - ["f64"] = "keyword2", - ["f128"] = "keyword2", - ["String"] = "keyword2", - ["char"] = "keyword2", - ["str"] = "keyword2", - ["bool"] = "keyword2", - ["true"] = "literal", - ["false"] = "literal", - ["None"] = "literal", - ["Some"] = "literal", - ["Option"] = "literal", - ["Result"] = "literal", + ["as"] = "keyword", + ["async"] = "keyword", + ["await"] = "keyword", + ["break"] = "keyword", + ["const"] = "keyword", + ["continue"] = "keyword", + ["crate"] = "keyword", + ["dyn"] = "keyword", + ["else"] = "keyword", + ["enum"] = "keyword", + ["extern"] = "keyword", + ["fn"] = "keyword", + ["for"] = "keyword", + ["if"] = "keyword", + ["impl"] = "keyword", + ["in"] = "keyword", + ["let"] = "keyword", + ["loop"] = "keyword", + ["match"] = "keyword", + ["mod"] = "keyword", + ["move"] = "keyword", + ["mut"] = "keyword", + ["pub"] = "keyword", + ["ref"] = "keyword", + ["return"] = "keyword", + ["Self"] = "keyword", + ["self"] = "keyword", + ["static"] = "keyword", + ["struct"] = "keyword", + ["super"] = "keyword", + ["trait"] = "keyword", + ["type"] = "keyword", + ["unsafe"] = "keyword", + ["use"] = "keyword", + ["where"] = "keyword", + ["while"] = "keyword", + ["i32"] = "keyword2", + ["i64"] = "keyword2", + ["i128"] = "keyword2", + ["i16"] = "keyword2", + ["i8"] = "keyword2", + ["u8"] = "keyword2", + ["u16"] = "keyword2", + ["u32"] = "keyword2", + ["u64"] = "keyword2", + ["usize"] = "keyword2", + ["isize"] = "keyword2", + ["f32"] = "keyword2", + ["f64"] = "keyword2", + ["f128"] = "keyword2", + ["String"] = "keyword2", + ["char"] = "keyword2", + ["str"] = "keyword2", + ["bool"] = "keyword2", + ["true"] = "literal", + ["false"] = "literal", + ["None"] = "literal", + ["Some"] = "literal", + ["Option"] = "literal", + ["Result"] = "literal", }, } diff --git a/plugins/language_wren.lua b/plugins/language_wren.lua index 42f4fbd..2022dbf 100644 --- a/plugins/language_wren.lua +++ b/plugins/language_wren.lua @@ -22,19 +22,15 @@ syntax.add { ["class"] = "keyword", ["construct"] = "keyword", ["else"] = "keyword", - ["false"] = "keyword", ["for"] = "keyword", ["foreign"] = "keyword", ["if"] = "keyword", ["import"] = "keyword", ["in"] = "keyword", ["is"] = "keyword", - ["null"] = "keyword", ["return"] = "keyword", ["static"] = "keyword", ["super"] = "keyword", - ["this"] = "keyword", - ["true"] = "keyword", ["var"] = "keyword", ["while"] = "keyword", ["this"] = "keyword2", diff --git a/plugins/minimap.lua b/plugins/minimap.lua index 37cbda7..f2638c8 100644 --- a/plugins/minimap.lua +++ b/plugins/minimap.lua @@ -22,159 +22,159 @@ local Object = require "core.object" -- General plugin settings config.plugins.minimap = common.merge({ - enabled = true, - width = 100, - instant_scroll = false, - syntax_highlight = true, - scale = 1, - -- hide on small docs (can be true, false or min number of lines) - avoid_small_docs = false, - -- how many spaces one tab is equivalent to - tab_width = 4, - draw_background = true, - -- you can override these colors - selection_color = nil, - caret_color = nil, - -- If other plugins provide per-line highlights, - -- this controls the placement. (e.g. gitdiff_highlight) - highlight_align = 'left', - highlight_width = 3, - gutter_width = 5, - -- The config specification used by the settings gui - config_spec = { - name = "Mini Map", - { - label = "Enabled", - description = "Activate the minimap by default.", - path = "enabled", - type = "toggle", - default = true - }, - { - label = "Width", - description = "Width of the minimap in pixels.", - path = "width", - type = "number", - default = 100, - min = 50, - max = 1000 - }, - { - label = "Instant Scroll", - description = "When enabled disables the scrolling animation.", - path = "instant_scroll", - type = "toggle", - default = false - }, - { - label = "Syntax Highlighting", - description = "Disable to improve performance.", - path = "syntax_highlight", - type = "toggle", - default = true - }, - { - label = "Scale", - description = "Size of the minimap using a scaling factor.", - path = "scale", - type = "number", - default = 1, - min = 0.5, - max = 10, - step = 0.1 - }, - { - label = "Hide for small Docs", - description = "Hide the minimap when a Doc is small enough.", - path = "avoid_small_docs", - type = "toggle", - default = false - }, - { - label = "Small Docs definition", - description = "Size of a Doc to be considered small. Use 0 to automatically decide.", - path = "avoid_small_docs_len", - type = "number", - default = 0, - min = 0, - on_apply = function(value) - if value == 0 then - config.plugins.minimap.avoid_small_docs = true - else - config.plugins.minimap.avoid_small_docs = value - end - end - }, - { - label = "Tabs Width", - description = "The amount of spaces that represent a tab.", - path = "tab_width", - type = "number", - default = 4, - min = 1, - max = 8 - }, - { - label = "Draw Background", - description = "When disabled makes the minimap transparent.", - path = "draw_background", - type = "toggle", - default = true - }, - { - label = "Selection Color", - description = "Background color of selected text in html notation eg: #FFFFFF. Leave empty to use default.", - path = "selection_color_html", - type = "string", - on_apply = function(value) - if value and value:match("#%x%x%x%x%x%x") then - config.plugins.minimap.selection_color = { common.color(value) } - else - config.plugins.minimap.selection_color = nil - end - end - }, - { - label = "Caret Color", - description = "Background color of active line in html notation eg: #FFFFFF. Leave empty to use default.", - path = "caret_color_html", - type = "string", - on_apply = function(value) - if value and value:match("#%x%x%x%x%x%x") then - config.plugins.minimap.caret_color = { common.color(value) } - else - config.plugins.minimap.caret_color = nil - end - end - }, - { - label = "Highlight Alignment", - path = "highlight_align", - type = "selection", - default = "left", - values = { - {"Left", "left"}, - {"Right", "right"} - } - }, - { - label = "Highlight Width", - path = "highlight_width", - type = "number", - default = 3, - min = 0, - max = 50 - }, - { - label = "Gutter Width", - description = "Left padding of the minimap.", - path = "gutter_width", - type = "number", - default = 5, - min = 0, - max = 50 - }, - } + enabled = true, + width = 100, + instant_scroll = false, + syntax_highlight = true, + scale = 1, + -- hide on small docs (can be true, false or min number of lines) + avoid_small_docs = false, + -- how many spaces one tab is equivalent to + tab_width = 4, + draw_background = true, + -- you can override these colors + selection_color = nil, + caret_color = nil, + -- If other plugins provide per-line highlights, + -- this controls the placement. (e.g. gitdiff_highlight) + highlight_align = 'left', + highlight_width = 3, + gutter_width = 5, + -- The config specification used by the settings gui + config_spec = { + name = "Mini Map", + { + label = "Enabled", + description = "Activate the minimap by default.", + path = "enabled", + type = "toggle", + default = true + }, + { + label = "Width", + description = "Width of the minimap in pixels.", + path = "width", + type = "number", + default = 100, + min = 50, + max = 1000 + }, + { + label = "Instant Scroll", + description = "When enabled disables the scrolling animation.", + path = "instant_scroll", + type = "toggle", + default = false + }, + { + label = "Syntax Highlighting", + description = "Disable to improve performance.", + path = "syntax_highlight", + type = "toggle", + default = true + }, + { + label = "Scale", + description = "Size of the minimap using a scaling factor.", + path = "scale", + type = "number", + default = 1, + min = 0.5, + max = 10, + step = 0.1 + }, + { + label = "Hide for small Docs", + description = "Hide the minimap when a Doc is small enough.", + path = "avoid_small_docs", + type = "toggle", + default = false + }, + { + label = "Small Docs definition", + description = "Size of a Doc to be considered small. Use 0 to automatically decide.", + path = "avoid_small_docs_len", + type = "number", + default = 0, + min = 0, + on_apply = function(value) + if value == 0 then + config.plugins.minimap.avoid_small_docs = true + else + config.plugins.minimap.avoid_small_docs = value + end + end + }, + { + label = "Tabs Width", + description = "The amount of spaces that represent a tab.", + path = "tab_width", + type = "number", + default = 4, + min = 1, + max = 8 + }, + { + label = "Draw Background", + description = "When disabled makes the minimap transparent.", + path = "draw_background", + type = "toggle", + default = true + }, + { + label = "Selection Color", + description = "Background color of selected text in html notation eg: #FFFFFF. Leave empty to use default.", + path = "selection_color_html", + type = "string", + on_apply = function(value) + if value and value:match("#%x%x%x%x%x%x") then + config.plugins.minimap.selection_color = { common.color(value) } + else + config.plugins.minimap.selection_color = nil + end + end + }, + { + label = "Caret Color", + description = "Background color of active line in html notation eg: #FFFFFF. Leave empty to use default.", + path = "caret_color_html", + type = "string", + on_apply = function(value) + if value and value:match("#%x%x%x%x%x%x") then + config.plugins.minimap.caret_color = { common.color(value) } + else + config.plugins.minimap.caret_color = nil + end + end + }, + { + label = "Highlight Alignment", + path = "highlight_align", + type = "selection", + default = "left", + values = { + {"Left", "left"}, + {"Right", "right"} + } + }, + { + label = "Highlight Width", + path = "highlight_width", + type = "number", + default = 3, + min = 0, + max = 50 + }, + { + label = "Gutter Width", + description = "Left padding of the minimap.", + path = "gutter_width", + type = "number", + default = 5, + min = 0, + max = 50 + }, + } }, config.plugins.minimap) -- Configure size for rendering each char in the minimap @@ -188,118 +188,118 @@ function MiniMap:new() end function MiniMap:line_highlight_color(line_index) - -- other plugins can override this, and return a color + -- other plugins can override this, and return a color end local minimap = MiniMap() local per_docview = setmetatable({}, { __mode = "k" }) local function show_minimap(docview) - if not docview:is(DocView) then return false end - if - not config.plugins.minimap.enabled - or not docview:is(DocView) - or per_docview[docview] == false - then - return false - end - if config.plugins.minimap.avoid_small_docs then - local last_line = #docview.doc.lines - if type(config.plugins.minimap.avoid_small_docs) == "number" then - return last_line > config.plugins.minimap.avoid_small_docs - else - local _, y = docview:get_line_screen_position(last_line, docview.doc.lines[last_line]) - y = y + docview.scroll.y - docview.position.y + docview:get_line_height() - return y > docview.size.y - end - end - return true + if not docview:is(DocView) then return false end + if + not config.plugins.minimap.enabled + or not docview:is(DocView) + or per_docview[docview] == false + then + return false + end + if config.plugins.minimap.avoid_small_docs then + local last_line = #docview.doc.lines + if type(config.plugins.minimap.avoid_small_docs) == "number" then + return last_line > config.plugins.minimap.avoid_small_docs + else + local _, y = docview:get_line_screen_position(last_line, docview.doc.lines[last_line]) + y = y + docview.scroll.y - docview.position.y + docview:get_line_height() + return y > docview.size.y + end + end + return true end -- Overloaded since the default implementation adds a extra x3 size of hotspot for the mouse to hit the scrollbar. local prev_scrollbar_overlaps_point = DocView.scrollbar_overlaps_point DocView.scrollbar_overlaps_point = function(self, x, y) - if not show_minimap(self) then - return prev_scrollbar_overlaps_point(self, x, y) - end + if not show_minimap(self) then + return prev_scrollbar_overlaps_point(self, x, y) + end - local sx, sy, sw, sh = self:get_scrollbar_rect() - return x >= sx and x < sx + sw and y >= sy and y < sy + sh + local sx, sy, sw, sh = self:get_scrollbar_rect() + return x >= sx and x < sx + sw and y >= sy and y < sy + sh end -- Helper function to determine if current file is too large to be shown fully inside the minimap area. local function is_file_too_large(self) - local line_count = #self.doc.lines - local _, _, _, sh = self:get_scrollbar_rect() + local line_count = #self.doc.lines + local _, _, _, sh = self:get_scrollbar_rect() - -- check if line count is too large to fit inside the minimap area - local max_minmap_lines = math.floor(sh / line_spacing) - return line_count > 1 and line_count > max_minmap_lines + -- check if line count is too large to fit inside the minimap area + local max_minmap_lines = math.floor(sh / line_spacing) + return line_count > 1 and line_count > max_minmap_lines end -- Overloaded with an extra check if the user clicked inside the minimap to automatically scroll to that line. local prev_on_mouse_pressed = DocView.on_mouse_pressed DocView.on_mouse_pressed = function(self, button, x, y, clicks) - if not show_minimap(self) then - return prev_on_mouse_pressed(self, button, x, y, clicks) - end - - -- check if user clicked in the minimap area and jump directly to that line - -- unless they are actually trying to perform a drag - local minimap_hit = self:scrollbar_overlaps_point(x, y) - if minimap_hit then - local line_count = #self.doc.lines - local minimap_height = line_count * line_spacing - - -- check if line count is too large to fit inside the minimap area - local is_too_large = is_file_too_large(self) - if is_too_large then - local _, _, _, sh = self:get_scrollbar_rect() - minimap_height = sh - end - - -- calc which line to jump to - local dy = y - self.position.y - local jump_to_line = math.floor((dy / minimap_height) * line_count) + 1 - - local _, cy, _, cy2 = self:get_content_bounds() - local lh = self:get_line_height() - local visible_lines_count = math.max(1, (cy2 - cy) / lh) - local visible_lines_start = math.max(1, math.floor(cy / lh)) - - -- calc if user hit the currently visible area - local hit_visible_area = true - if is_too_large then - - local visible_height = visible_lines_count * line_spacing - local scroll_pos = (visible_lines_start - 1) / - (line_count - visible_lines_count - 1) - scroll_pos = math.min(1.0, scroll_pos) -- 0..1 - local visible_y = self.position.y + scroll_pos * - (minimap_height - visible_height) - - local t = (line_count - visible_lines_start) / visible_lines_count - if t <= 1 then visible_y = visible_y + visible_height * (1.0 - t) end - - if y < visible_y or y > visible_y + visible_height then - hit_visible_area = false - end - else - - -- If the click is on the currently visible line numbers, - -- ignore it since then they probably want to initiate a drag instead. - if jump_to_line < visible_lines_start or jump_to_line > visible_lines_start + - visible_lines_count then hit_visible_area = false end - end - - -- if user didn't click on the visible area (ie not dragging), scroll accordingly - if not hit_visible_area then - self:scroll_to_line(jump_to_line, false, config.plugins.minimap.instant_scroll) - end - - end - - return prev_on_mouse_pressed(self, button, x, y, clicks) + if not show_minimap(self) then + return prev_on_mouse_pressed(self, button, x, y, clicks) + end + + -- check if user clicked in the minimap area and jump directly to that line + -- unless they are actually trying to perform a drag + local minimap_hit = self:scrollbar_overlaps_point(x, y) + if minimap_hit then + local line_count = #self.doc.lines + local minimap_height = line_count * line_spacing + + -- check if line count is too large to fit inside the minimap area + local is_too_large = is_file_too_large(self) + if is_too_large then + local _, _, _, sh = self:get_scrollbar_rect() + minimap_height = sh + end + + -- calc which line to jump to + local dy = y - self.position.y + local jump_to_line = math.floor((dy / minimap_height) * line_count) + 1 + + local _, cy, _, cy2 = self:get_content_bounds() + local lh = self:get_line_height() + local visible_lines_count = math.max(1, (cy2 - cy) / lh) + local visible_lines_start = math.max(1, math.floor(cy / lh)) + + -- calc if user hit the currently visible area + local hit_visible_area = true + if is_too_large then + + local visible_height = visible_lines_count * line_spacing + local scroll_pos = (visible_lines_start - 1) / + (line_count - visible_lines_count - 1) + scroll_pos = math.min(1.0, scroll_pos) -- 0..1 + local visible_y = self.position.y + scroll_pos * + (minimap_height - visible_height) + + local t = (line_count - visible_lines_start) / visible_lines_count + if t <= 1 then visible_y = visible_y + visible_height * (1.0 - t) end + + if y < visible_y or y > visible_y + visible_height then + hit_visible_area = false + end + else + + -- If the click is on the currently visible line numbers, + -- ignore it since then they probably want to initiate a drag instead. + if jump_to_line < visible_lines_start or jump_to_line > visible_lines_start + + visible_lines_count then hit_visible_area = false end + end + + -- if user didn't click on the visible area (ie not dragging), scroll accordingly + if not hit_visible_area then + self:scroll_to_line(jump_to_line, false, config.plugins.minimap.instant_scroll) + end + + end + + return prev_on_mouse_pressed(self, button, x, y, clicks) end -- Overloaded with pretty much the same logic as original DocView implementation, @@ -307,244 +307,244 @@ end -- since the "scrollbar" essentially represents the lines visible in the content view. local prev_on_mouse_moved = DocView.on_mouse_moved DocView.on_mouse_moved = function(self, x, y, dx, dy) - if not show_minimap(self) then - return prev_on_mouse_moved(self, x, y, dx, dy) - end - - if self.dragging_scrollbar then - local line_count = #self.doc.lines - local lh = self:get_line_height() - local delta = lh / line_spacing * dy - - if is_file_too_large(self) then - local _, sy, _, sh = self:get_scrollbar_rect() - delta = (line_count * lh) / sh * dy - end - - self.scroll.to.y = self.scroll.to.y + delta - end - - -- we need to "hide" that the scrollbar is dragging so that View doesnt does its own scrolling logic - local t = self.dragging_scrollbar - self.dragging_scrollbar = false - local r = prev_on_mouse_moved(self, x, y, dx, dy) - self.dragging_scrollbar = t - return r + if not show_minimap(self) then + return prev_on_mouse_moved(self, x, y, dx, dy) + end + + if self.dragging_scrollbar then + local line_count = #self.doc.lines + local lh = self:get_line_height() + local delta = lh / line_spacing * dy + + if is_file_too_large(self) then + local _, sy, _, sh = self:get_scrollbar_rect() + delta = (line_count * lh) / sh * dy + end + + self.scroll.to.y = self.scroll.to.y + delta + end + + -- we need to "hide" that the scrollbar is dragging so that View doesnt does its own scrolling logic + local t = self.dragging_scrollbar + self.dragging_scrollbar = false + local r = prev_on_mouse_moved(self, x, y, dx, dy) + self.dragging_scrollbar = t + return r end -- Overloaded since we want the mouse to interact with the full size of the minimap area, -- not juse the scrollbar. local prev_get_scrollbar_rect = DocView.get_scrollbar_rect DocView.get_scrollbar_rect = function(self) - if not show_minimap(self) then return prev_get_scrollbar_rect(self) end + if not show_minimap(self) then return prev_get_scrollbar_rect(self) end - return self.position.x + self.size.x - config.plugins.minimap.width * SCALE, - self.position.y, config.plugins.minimap.width * SCALE, self.size.y + return self.position.x + self.size.x - config.plugins.minimap.width * SCALE, + self.position.y, config.plugins.minimap.width * SCALE, self.size.y end local prev_get_scrollbar_track_rect = DocView.get_scrollbar_track_rect DocView.get_scrollbar_track_rect = function(self) - if not show_minimap(self) then return prev_get_scrollbar_track_rect(self) end + if not show_minimap(self) then return prev_get_scrollbar_track_rect(self) end - return self.position.x + self.size.x - config.plugins.minimap.width * SCALE, - self.position.y, config.plugins.minimap.width * SCALE, self.size.y + return self.position.x + self.size.x - config.plugins.minimap.width * SCALE, + self.position.y, config.plugins.minimap.width * SCALE, self.size.y end -- Overloaded so we can render the minimap in the "scrollbar area". local prev_draw_scrollbar = DocView.draw_scrollbar DocView.draw_scrollbar = function(self) - if not show_minimap(self) then return prev_draw_scrollbar(self) end - - local x, y, w, h = self:get_scrollbar_rect() - - local highlight = self.hovered_scrollbar or self.dragging_scrollbar - local visual_color = highlight and style.scrollbar2 or style.scrollbar - - local _, cy, _, cy2 = self:get_content_bounds() - local lh = self:get_line_height() - local visible_lines_count = math.max(1, (cy2 - cy) / lh) - local visible_lines_start = math.max(1, math.floor(cy / lh)) - local scroller_height = visible_lines_count * line_spacing - local line_count = #self.doc.lines - - local visible_y = self.position.y + (visible_lines_start - 1) * line_spacing - - -- check if file is too large to fit inside the minimap area - local max_minmap_lines = math.floor(h / line_spacing) - local minimap_start_line = 1 - if is_file_too_large(self) then - - local scroll_pos = (visible_lines_start - 1) / - (line_count - visible_lines_count - 1) - scroll_pos = math.min(1.0, scroll_pos) -- 0..1, procent of visual area scrolled - - local scroll_pos_pixels = scroll_pos * (h - scroller_height) - visible_y = self.position.y + scroll_pos_pixels - - -- offset visible area if user is scrolling past end - local t = (line_count - visible_lines_start) / visible_lines_count - if t <= 1 then visible_y = visible_y + scroller_height * (1.0 - t) end - - minimap_start_line = visible_lines_start - - math.floor(scroll_pos_pixels / line_spacing) - minimap_start_line = math.max(1, math.min(minimap_start_line, - line_count - max_minmap_lines)) - end - - if config.plugins.minimap.draw_background then - renderer.draw_rect(x, y, w, h, style.minimap_background or style.background) - end - -- draw visual rect - renderer.draw_rect(x, visible_y, w, scroller_height, visual_color) - - -- highlight the selected lines, and the line with the caret on it - local selection_color = config.plugins.minimap.selection_color or style.dim - local caret_color = config.plugins.minimap.caret_color or style.caret - local selection_line, selection_col, selection_line2, selection_col2 = self.doc:get_selection() - local selection_y = y + (selection_line - minimap_start_line) * line_spacing - local selection2_y = y + (selection_line2 - minimap_start_line) * line_spacing - local selection_min_y = math.min(selection_y, selection2_y) - local selection_h = math.abs(selection2_y - selection_y)+1 - renderer.draw_rect(x, selection_min_y, w, selection_h, selection_color) - renderer.draw_rect(x, selection_y, w, line_spacing, caret_color) - - local highlight_align = config.plugins.minimap.highlight_align - local highlight_width = config.plugins.minimap.highlight_width - local gutter_width = config.plugins.minimap.gutter_width - - -- time to draw the actual code, setup some local vars that are used in both highlighted and plain renderind. - local line_y = y - - -- when not using syntax highlighted rendering, just use the normal color but dim it 50%. - local color = style.syntax["normal"] - color = {color[1], color[2], color[3], color[4] * 0.5} - - -- we try to "batch" characters so that they can be rendered as just one rectangle instead of one for each. - local batch_width = 0 - local batch_start = x - local minimap_cutoff_x = x + config.plugins.minimap.width * SCALE - local batch_syntax_type = nil - local function flush_batch(type) - local old_color = color - color = style.syntax[batch_syntax_type] - if config.plugins.minimap.syntax_highlight and color ~= nil then - -- fetch and dim colors - color = {color[1], color[2], color[3], color[4] * 0.5} - else - color = old_color - end - if batch_width > 0 then - renderer.draw_rect(batch_start, line_y, batch_width, char_height, color) - end - batch_syntax_type = type - batch_start = batch_start + batch_width - batch_width = 0 - end - - local highlight_x - if highlight_align == 'left' then - highlight_x = x - else - highlight_x = x + w - highlight_width - end - local function render_highlight(idx, line_y) - local highlight_color = minimap:line_highlight_color(idx) - if highlight_color then - renderer.draw_rect(highlight_x, line_y, highlight_width, line_spacing, highlight_color) - end - end - - local endidx = minimap_start_line + max_minmap_lines - endidx = math.min(endidx, line_count) - -- render lines with syntax highlighting - if config.plugins.minimap.syntax_highlight then - - -- keep track of the highlight type, since this needs to break batches as well - batch_syntax_type = nil - - -- per line - for idx = minimap_start_line, endidx do - batch_syntax_type = nil - batch_start = x + gutter_width - batch_width = 0 - - render_highlight(idx, line_y) - - -- per token - for _, type, text in self.doc.highlighter:each_token(idx) do - -- flush prev batch - if not batch_syntax_type then batch_syntax_type = type end - if batch_syntax_type ~= type then flush_batch(type) end - - -- per character - for char in common.utf8_chars(text) do - if char == " " or char == "\n" then - flush_batch(type) - batch_start = batch_start + char_spacing - elseif char == " " then - flush_batch(type) - batch_start = batch_start + (char_spacing * config.plugins.minimap.tab_width) - elseif batch_start + batch_width > minimap_cutoff_x then - flush_batch(type) - break - else - batch_width = batch_width + char_spacing - end - - end - end - flush_batch(nil) - line_y = line_y + line_spacing - end - - else -- render lines without syntax highlighting - for idx = minimap_start_line, endidx do - batch_start = x + gutter_width - batch_width = 0 - - render_highlight(idx, line_y) - - for char in common.utf8_chars(self.doc.lines[idx]) do - if char == " " or char == "\n" then - flush_batch() - batch_start = batch_start + char_spacing - elseif char == " " then - flush_batch() - batch_start = batch_start + (char_spacing * config.plugins.minimap.tab_width) - elseif batch_start + batch_width > minimap_cutoff_x then - flush_batch() - else - batch_width = batch_width + char_spacing - end - end - flush_batch() - line_y = line_y + line_spacing - end - - end + if not show_minimap(self) then return prev_draw_scrollbar(self) end + + local x, y, w, h = self:get_scrollbar_rect() + + local highlight = self.hovered_scrollbar or self.dragging_scrollbar + local visual_color = highlight and style.scrollbar2 or style.scrollbar + + local _, cy, _, cy2 = self:get_content_bounds() + local lh = self:get_line_height() + local visible_lines_count = math.max(1, (cy2 - cy) / lh) + local visible_lines_start = math.max(1, math.floor(cy / lh)) + local scroller_height = visible_lines_count * line_spacing + local line_count = #self.doc.lines + + local visible_y = self.position.y + (visible_lines_start - 1) * line_spacing + + -- check if file is too large to fit inside the minimap area + local max_minmap_lines = math.floor(h / line_spacing) + local minimap_start_line = 1 + if is_file_too_large(self) then + + local scroll_pos = (visible_lines_start - 1) / + (line_count - visible_lines_count - 1) + scroll_pos = math.min(1.0, scroll_pos) -- 0..1, procent of visual area scrolled + + local scroll_pos_pixels = scroll_pos * (h - scroller_height) + visible_y = self.position.y + scroll_pos_pixels + + -- offset visible area if user is scrolling past end + local t = (line_count - visible_lines_start) / visible_lines_count + if t <= 1 then visible_y = visible_y + scroller_height * (1.0 - t) end + + minimap_start_line = visible_lines_start - + math.floor(scroll_pos_pixels / line_spacing) + minimap_start_line = math.max(1, math.min(minimap_start_line, + line_count - max_minmap_lines)) + end + + if config.plugins.minimap.draw_background then + renderer.draw_rect(x, y, w, h, style.minimap_background or style.background) + end + -- draw visual rect + renderer.draw_rect(x, visible_y, w, scroller_height, visual_color) + + -- highlight the selected lines, and the line with the caret on it + local selection_color = config.plugins.minimap.selection_color or style.dim + local caret_color = config.plugins.minimap.caret_color or style.caret + local selection_line, selection_col, selection_line2, selection_col2 = self.doc:get_selection() + local selection_y = y + (selection_line - minimap_start_line) * line_spacing + local selection2_y = y + (selection_line2 - minimap_start_line) * line_spacing + local selection_min_y = math.min(selection_y, selection2_y) + local selection_h = math.abs(selection2_y - selection_y)+1 + renderer.draw_rect(x, selection_min_y, w, selection_h, selection_color) + renderer.draw_rect(x, selection_y, w, line_spacing, caret_color) + + local highlight_align = config.plugins.minimap.highlight_align + local highlight_width = config.plugins.minimap.highlight_width + local gutter_width = config.plugins.minimap.gutter_width + + -- time to draw the actual code, setup some local vars that are used in both highlighted and plain renderind. + local line_y = y + + -- when not using syntax highlighted rendering, just use the normal color but dim it 50%. + local color = style.syntax["normal"] + color = {color[1], color[2], color[3], color[4] * 0.5} + + -- we try to "batch" characters so that they can be rendered as just one rectangle instead of one for each. + local batch_width = 0 + local batch_start = x + local minimap_cutoff_x = x + config.plugins.minimap.width * SCALE + local batch_syntax_type = nil + local function flush_batch(type) + local old_color = color + color = style.syntax[batch_syntax_type] + if config.plugins.minimap.syntax_highlight and color ~= nil then + -- fetch and dim colors + color = {color[1], color[2], color[3], color[4] * 0.5} + else + color = old_color + end + if batch_width > 0 then + renderer.draw_rect(batch_start, line_y, batch_width, char_height, color) + end + batch_syntax_type = type + batch_start = batch_start + batch_width + batch_width = 0 + end + + local highlight_x + if highlight_align == 'left' then + highlight_x = x + else + highlight_x = x + w - highlight_width + end + local function render_highlight(idx, line_y) + local highlight_color = minimap:line_highlight_color(idx) + if highlight_color then + renderer.draw_rect(highlight_x, line_y, highlight_width, line_spacing, highlight_color) + end + end + + local endidx = minimap_start_line + max_minmap_lines + endidx = math.min(endidx, line_count) + -- render lines with syntax highlighting + if config.plugins.minimap.syntax_highlight then + + -- keep track of the highlight type, since this needs to break batches as well + batch_syntax_type = nil + + -- per line + for idx = minimap_start_line, endidx do + batch_syntax_type = nil + batch_start = x + gutter_width + batch_width = 0 + + render_highlight(idx, line_y) + + -- per token + for _, type, text in self.doc.highlighter:each_token(idx) do + -- flush prev batch + if not batch_syntax_type then batch_syntax_type = type end + if batch_syntax_type ~= type then flush_batch(type) end + + -- per character + for char in common.utf8_chars(text) do + if char == " " or char == "\n" then + flush_batch(type) + batch_start = batch_start + char_spacing + elseif char == " " then + flush_batch(type) + batch_start = batch_start + (char_spacing * config.plugins.minimap.tab_width) + elseif batch_start + batch_width > minimap_cutoff_x then + flush_batch(type) + break + else + batch_width = batch_width + char_spacing + end + + end + end + flush_batch(nil) + line_y = line_y + line_spacing + end + + else -- render lines without syntax highlighting + for idx = minimap_start_line, endidx do + batch_start = x + gutter_width + batch_width = 0 + + render_highlight(idx, line_y) + + for char in common.utf8_chars(self.doc.lines[idx]) do + if char == " " or char == "\n" then + flush_batch() + batch_start = batch_start + char_spacing + elseif char == " " then + flush_batch() + batch_start = batch_start + (char_spacing * config.plugins.minimap.tab_width) + elseif batch_start + batch_width > minimap_cutoff_x then + flush_batch() + else + batch_width = batch_width + char_spacing + end + end + flush_batch() + line_y = line_y + line_spacing + end + + end end local prev_update = DocView.update DocView.update = function (self) - if not show_minimap(self) then return prev_update(self) end - self.size.x = self.size.x - config.plugins.minimap.width * SCALE - return prev_update(self) + if not show_minimap(self) then return prev_update(self) end + self.size.x = self.size.x - config.plugins.minimap.width * SCALE + return prev_update(self) end command.add(nil, { - ["minimap:toggle-visibility"] = function() - config.plugins.minimap.enabled = not config.plugins.minimap.enabled - end, - ["minimap:toggle-syntax-highlighting"] = function() - config.plugins.minimap.syntax_highlight = not config.plugins.minimap.syntax_highlight - end + ["minimap:toggle-visibility"] = function() + config.plugins.minimap.enabled = not config.plugins.minimap.enabled + end, + ["minimap:toggle-syntax-highlighting"] = function() + config.plugins.minimap.syntax_highlight = not config.plugins.minimap.syntax_highlight + end }) command.add("core.docview!", { - ["minimap:toggle-visibility-for-current-view"] = function() - per_docview[core.active_view] = per_docview[core.active_view] == false - end + ["minimap:toggle-visibility-for-current-view"] = function() + per_docview[core.active_view] = per_docview[core.active_view] == false + end }) return minimap diff --git a/plugins/regexreplacepreview.lua b/plugins/regexreplacepreview.lua index 85845ad..7ca8bc1 100644 --- a/plugins/regexreplacepreview.lua +++ b/plugins/regexreplacepreview.lua @@ -6,121 +6,126 @@ local command = require "core.command" -- Takes the following pattern: /pattern/replace/ -- Capture groupings can be replaced using \1 through \9 local function regex_replace_file(view, pattern, old_lines, raw, start_line, end_line) - local doc = view.doc - local start_pattern, end_pattern, end_replacement, start_replacement = 2, 2; - repeat - end_pattern = string.find(pattern, "/", end_pattern) - until end_pattern == nil or pattern[end_pattern-1] ~= "\\" - if end_pattern == nil then - end_pattern = #pattern + 1 - else - end_pattern = end_pattern - 1 - start_replacement = end_pattern+2; - end_replacement = end_pattern+2; - repeat - end_replacement = string.find(pattern, "/", end_replacement) - until end_replacement == nil or pattern[end_replacement-1] ~= "\\" - end - end_replacement = end_replacement and (end_replacement - 1) + local doc = view.doc + local start_pattern, end_pattern, end_replacement, start_replacement = 2, 2; + repeat + end_pattern = string.find(pattern, "/", end_pattern) + until end_pattern == nil or pattern[end_pattern-1] ~= "\\" + if end_pattern == nil then + end_pattern = #pattern + 1 + else + end_pattern = end_pattern - 1 + start_replacement = end_pattern+2; + end_replacement = end_pattern+2; + repeat + end_replacement = string.find(pattern, "/", end_replacement) + until end_replacement == nil or pattern[end_replacement-1] ~= "\\" + end + end_replacement = end_replacement and (end_replacement - 1) - local re = start_pattern ~= end_pattern and regex.compile(pattern:sub(start_pattern, end_pattern)) + local re = start_pattern ~= end_pattern + and regex.compile(pattern:sub(start_pattern, end_pattern)) - local replacement = end_replacement and pattern:sub(start_replacement, end_replacement) - local replace_line = raw and function(line, new_text) - if line == #doc.lines then - doc:raw_remove(line, 1, line, #doc.lines[line], { idx = 1 }, 0) - else - doc:raw_remove(line, 1, line+1, 1, { idx = 1 }, 0) - end - doc:raw_insert(line, 1, new_text, { idx = 1 }, 0) - end or function(line, new_text) - if line == #doc.lines then - doc:remove(line, 1, line, #doc.lines[line]) - else - doc:remove(line, 1, line+1, 1) - end - doc:insert(line, 1, new_text) - end + local replacement = end_replacement and pattern:sub( + start_replacement, end_replacement + ) + local replace_line = raw and function(line, new_text) + if line == #doc.lines then + doc:raw_remove(line, 1, line, #doc.lines[line], { idx = 1 }, 0) + else + doc:raw_remove(line, 1, line+1, 1, { idx = 1 }, 0) + end + doc:raw_insert(line, 1, new_text, { idx = 1 }, 0) + end or function(line, new_text) + if line == #doc.lines then + doc:remove(line, 1, line, #doc.lines[line]) + else + doc:remove(line, 1, line+1, 1) + end + doc:insert(line, 1, new_text) + end - local line_scroll = nil - if re then - for i = (start_line or 1), (end_line or #doc.lines) do - local new_text, matches, rmatches - local old_text = old_lines[i] or doc.lines[i] - local old_length = #old_text - if replacement then - new_text, matches, rmatches = regex.gsub(re, old_text, replacement) - end - if matches and #matches > 0 then - old_lines[i] = old_text - replace_line(i, new_text) - if line_scroll == nil then - line_scroll = i - doc:set_selection(i, rmatches[1][1], i, rmatches[1][2]) - end - elseif old_lines[i] then - replace_line(i, old_lines[i]) - old_lines[i] = nil - end - if not replacement then - local s,e = regex.match(re, old_text) - if s then - line_scroll = i - doc:set_selection(i, s, i, e) - break - end - end + local line_scroll = nil + if re then + for i = (start_line or 1), (end_line or #doc.lines) do + local new_text, matches, rmatches + local old_text = old_lines[i] or doc.lines[i] + local old_length = #old_text + if replacement then + new_text, matches, rmatches = regex.gsub(re, old_text, replacement) end - if line_scroll then - view:scroll_to_line(line_scroll, true) + if matches and #matches > 0 then + old_lines[i] = old_text + replace_line(i, new_text) + if line_scroll == nil then + line_scroll = i + doc:set_selection(i, rmatches[1][1], i, rmatches[1][2]) + end + elseif old_lines[i] then + replace_line(i, old_lines[i]) + old_lines[i] = nil end - end - if replacement == nil then - for k,v in pairs(old_lines) do - replace_line(k, v) + if not replacement then + local s,e = regex.match(re, old_text) + if s then + line_scroll = i + doc:set_selection(i, s, i, e) + break + end end - old_lines = {} - end - return old_lines, line_scroll ~= nil + end + if line_scroll then + view:scroll_to_line(line_scroll, true) + end + end + if replacement == nil then + for k,v in pairs(old_lines) do + replace_line(k, v) + end + old_lines = {} + end + return old_lines, line_scroll ~= nil end command.add("core.docview", { - ["regex-replace-preview:find-replace-regex"] = function() - core.command_view:set_text("/") - local old_lines = {} - local view = core.active_view - local doc = view.doc - local original_selection = { doc:get_selection(true) } - local selection = doc:has_selection() and { doc:get_selection(true) } or {} - core.command_view:enter( - "Regex Replace (enter pattern as /old/new/)", - function(pattern) - regex_replace_file(view, pattern, {}, false, selection[1], selection[3]) - end, - function(pattern) - local incremental, has_replacement = regex_replace_file(view, pattern, old_lines, true, selection[1], selection[3]) - if incremental then - old_lines = incremental + ["regex-replace-preview:find-replace-regex"] = function() + core.command_view:set_text("/") + local old_lines = {} + local view = core.active_view + local doc = view.doc + local original_selection = { doc:get_selection(true) } + local selection = doc:has_selection() and { doc:get_selection(true) } or {} + core.command_view:enter( + "Regex Replace (enter pattern as /old/new/)", + function(pattern) + regex_replace_file(view, pattern, {}, false, selection[1], selection[3]) + end, + function(pattern) + local incremental, has_replacement = regex_replace_file( + view, pattern, old_lines, true, selection[1], selection[3] + ) + if incremental then + old_lines = incremental + end + if not has_replacement then + doc:set_selection(table.unpack(original_selection)) + end + end, + function(pattern) + for k,v in pairs(old_lines) do + if v then + if k == #doc.lines then + doc:raw_remove(k, 1, k, #doc.lines[k], { idx = 1 }, 0) + else + doc:raw_remove(k, 1, k+1, 1, { idx = 1 }, 0) end - if not has_replacement then - doc:set_selection(table.unpack(original_selection)) - end - end, - function(pattern) - for k,v in pairs(old_lines) do - if v then - if k == #doc.lines then - doc:raw_remove(k, 1, k, #doc.lines[k], { idx = 1 }, 0) - else - doc:raw_remove(k, 1, k+1, 1, { idx = 1 }, 0) - end - doc:raw_insert(k, 1, v, { idx = 1 }, 0) - end - end - doc:set_selection(table.unpack(original_selection)) - end - ) - end + doc:raw_insert(k, 1, v, { idx = 1 }, 0) + end + end + doc:set_selection(table.unpack(original_selection)) + end + ) + end }) keymap.add { ["ctrl+shift+r"] = "regex-replace-preview:find-replace-regex" } diff --git a/plugins/select_colorscheme.lua b/plugins/select_colorscheme.lua index 4406aa1..0d60251 100644 --- a/plugins/select_colorscheme.lua +++ b/plugins/select_colorscheme.lua @@ -65,10 +65,10 @@ local function make_color_module_name(name) end function Settings:change_color(name) - if self:is_change_color(name) then - core.reload_module(make_color_module_name(name)) - self.color_scheme = name - end + if self:is_change_color(name) then + core.reload_module(make_color_module_name(name)) + self.color_scheme = name + end end function Settings:save_settings() @@ -121,10 +121,10 @@ local color_scheme_suggest = function(text) end command.add(nil, { - ["ui:color scheme"] = function() - core.command_view:enter("Select color scheme", color_scheme_submit, color_scheme_suggest) - end, - }) + ["ui:color scheme"] = function() + core.command_view:enter("Select color scheme", color_scheme_submit, color_scheme_suggest) + end, +}) -- ---------------------------------------------------------------- Settings:init() diff --git a/plugins/themeselect.lua b/plugins/themeselect.lua index 6a06715..fe4ff34 100644 --- a/plugins/themeselect.lua +++ b/plugins/themeselect.lua @@ -7,12 +7,11 @@ local core = require "core" -- usage: -- require("plugins.themeselect").add_pattern("%.md$", "summer") -local theme_select = { } +local theme_select = {} local saved_colors_module = "core.style" -local themes_patterns = { -} +local themes_patterns = {} local reload_module = core.reload_module local set_visited = core.set_visited |