diff options
Diffstat (limited to 'plugins/markers.lua')
-rw-r--r-- | plugins/markers.lua | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/plugins/markers.lua b/plugins/markers.lua new file mode 100644 index 0000000..6e397d7 --- /dev/null +++ b/plugins/markers.lua @@ -0,0 +1,103 @@ +-- Markers plugin for lite text editor
+-- original implementation by Petri Häkkinen
+
+local core = require "core"
+local command = require "core.command"
+local keymap = require "core.keymap"
+local style = require "core.style"
+local DocView = require "core.docview"
+local Doc = require "core.doc"
+
+local cache = {} -- this table contains subtables for each document, each subtable is a set of line numbers
+setmetatable(cache, {
+ __mode = "k",
+ __index = function(t, k)
+ t[k] = {}
+ return t[k]
+ end,
+})
+
+
+local function shift_lines(doc, at, diff)
+ if diff == 0 then return end
+ local t = {}
+ for line in pairs(cache[doc]) do
+ line = line >= at and line + diff or line
+ t[line] = true
+ end
+ cache[doc] = t
+end
+
+
+local raw_insert = Doc.raw_insert
+
+function Doc:raw_insert(line, col, text, ...)
+ raw_insert(self, line, col, text, ...)
+ local line_count = 0
+ for _ in text:gmatch("\n") do
+ line_count = line_count + 1
+ end
+ shift_lines(self, line, line_count)
+end
+
+
+local raw_remove = Doc.raw_remove
+
+function Doc:raw_remove(line1, col1, line2, col2, ...)
+ raw_remove(self, line1, col1, line2, col2, ...)
+ shift_lines(self, line2, line1 - line2)
+end
+
+
+local draw_line_gutter = DocView.draw_line_gutter
+
+function DocView:draw_line_gutter(idx, x, y)
+ if cache[self.doc] and cache[self.doc][idx] then
+ local h = self:get_line_height()
+ renderer.draw_rect(x, y, style.padding.x * 0.4, h, style.selection)
+ end
+ draw_line_gutter(self, idx, x, y)
+end
+
+
+command.add("core.docview", {
+ ["markers:toggle-marker"] = function()
+ local doc = core.active_view.doc
+ local line = doc:get_selection()
+ local markers = cache[doc]
+
+ if markers[line] then
+ markers[line] = nil
+ else
+ markers[line] = true
+ end
+ end,
+
+ ["markers:go-to-next-marker"] = function()
+ local doc = core.active_view.doc
+ local line = doc:get_selection()
+ local markers = cache[doc]
+
+ local first_marker = math.huge
+ local next_marker = math.huge
+ for l, _ in pairs(markers) do
+ if l > line and l < next_marker then
+ next_marker = l
+ end
+ first_marker = math.min(first_marker, l)
+ end
+ if next_marker == math.huge then
+ next_marker = first_marker
+ end
+ if next_marker ~= math.huge then
+ doc:set_selection(next_marker, 1)
+ core.active_view:scroll_to_line(next_marker, true)
+ end
+ end,
+})
+
+
+keymap.add {
+ ["ctrl+f2"] = "markers:toggle-marker",
+ ["f2"] = "markers:go-to-next-marker",
+}
|