aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/gitstatus.lua61
-rw-r--r--plugins/lfautoinsert.lua54
2 files changed, 115 insertions, 0 deletions
diff --git a/plugins/gitstatus.lua b/plugins/gitstatus.lua
new file mode 100644
index 0000000..4fe043f
--- /dev/null
+++ b/plugins/gitstatus.lua
@@ -0,0 +1,61 @@
+local core = require "core"
+local config = require "core.config"
+local style = require "core.style"
+local StatusView = require "core.statusview"
+
+
+local git = {
+ branch = nil,
+ inserts = 0,
+ deletes = 0,
+}
+
+core.add_thread(function()
+ while true do
+ if system.get_file_info(".git") then
+ -- get branch name
+ local fp = io.popen("git rev-parse --abbrev-ref HEAD")
+ git.branch = fp:read("*l")
+ fp:close()
+
+ -- get diff
+ local fp = io.popen("git diff --stat")
+ local last_line = ""
+ for line in fp:lines() do last_line = line end
+ fp:close()
+ git.inserts = tonumber(last_line:match("(%d+) ins")) or 0
+ git.deletes = tonumber(last_line:match("(%d+) del")) or 0
+
+ else
+ git.branch = nil
+ end
+
+ coroutine.yield(config.project_scan_rate)
+ end
+end)
+
+
+local get_items = StatusView.get_items
+
+function StatusView:get_items()
+ if not git.branch then
+ return get_items(self)
+ end
+ local left, right = get_items(self)
+
+ local t = {
+ style.dim, self.separator,
+ (git.inserts ~= 0 or git.deletes ~= 0) and style.accent or style.text,
+ git.branch,
+ style.dim, " ",
+ git.inserts ~= 0 and style.accent or style.text, "+", git.inserts,
+ style.dim, " / ",
+ git.deletes ~= 0 and style.accent or style.text, "-", git.deletes,
+ }
+ for _, item in ipairs(t) do
+ table.insert(right, item)
+ end
+
+ return left, right
+end
+
diff --git a/plugins/lfautoinsert.lua b/plugins/lfautoinsert.lua
new file mode 100644
index 0000000..64006b9
--- /dev/null
+++ b/plugins/lfautoinsert.lua
@@ -0,0 +1,54 @@
+local core = require "core"
+local command = require "core.command"
+local config = require "core.config"
+local keymap = require "core.keymap"
+
+config.autoinsert_map = {
+ ["{\n"] = "}",
+ ["%(\n"] = ")",
+ ["%f[[]%[\n"] = "]",
+ ["%[%[\n"] = "]]",
+ ["=\n"] = false,
+ [":\n"] = false,
+ ["^#if"] = "#endif",
+ ["^#else"] = "#endif",
+ ["%f[%w]do\n"] = "end",
+ ["%f[%w]then\n"] = "end",
+ ["%f[%w]else\n"] = "end",
+ ["%f[%w]repeat\n"] = "until",
+ ["%f[%w]function.*%)\n"] = "end",
+}
+
+
+local function indent_size(doc, line)
+ local text = doc.lines[line] or ""
+ local s, e = text:find("^[\t ]*")
+ return e - s
+end
+
+command.add("core.docview", {
+ ["autoinsert:newline"] = function()
+ command.perform("doc:newline")
+
+ local doc = core.active_view.doc
+ local line = doc:get_selection()
+ local text = doc.lines[line - 1]
+
+ for ptn, close in pairs(config.autoinsert_map) do
+ if text:find(ptn) then
+ if close
+ and indent_size(doc, line + 1) <= indent_size(doc, line - 1)
+ then
+ command.perform("doc:newline")
+ core.active_view:on_text_input(close)
+ command.perform("doc:move-to-previous-line")
+ end
+ command.perform("doc:indent")
+ end
+ end
+ end
+})
+
+keymap.add {
+ ["return"] = { "command:submit", "autoinsert:newline" }
+}