|
|
|
@ -1,8 +1,8 @@
|
|
|
|
|
local a = vim.api
|
|
|
|
|
if __lua_dev_state == nil then
|
|
|
|
|
__lua_dev_state = {}
|
|
|
|
|
if _G.__lua_dev_state == nil then
|
|
|
|
|
_G.__lua_dev_state = {}
|
|
|
|
|
end
|
|
|
|
|
local s = __lua_dev_state
|
|
|
|
|
local s = _G.__lua_dev_state
|
|
|
|
|
|
|
|
|
|
local function create_buf(window)
|
|
|
|
|
if s.buf ~= nil then
|
|
|
|
@ -22,18 +22,44 @@ local function create_buf(window)
|
|
|
|
|
s.buf = buf
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function dosplit(str, delimiter)
|
|
|
|
|
local result = { }
|
|
|
|
|
local from = 1
|
|
|
|
|
local delim_from, delim_to = string.find( str, delimiter, from )
|
|
|
|
|
while delim_from do
|
|
|
|
|
table.insert( result, string.sub( str, from , delim_from-1 ) )
|
|
|
|
|
from = delim_to + 1
|
|
|
|
|
delim_from, delim_to = string.find( str, delimiter, from )
|
|
|
|
|
end
|
|
|
|
|
table.insert( result, string.sub( str, from ) )
|
|
|
|
|
return result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function splitlines(str)
|
|
|
|
|
return dosplit(str, "\n")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function append_buf(lines, hl)
|
|
|
|
|
if s.buf == nil then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local l0 = a.nvim_buf_line_count(s.buf)
|
|
|
|
|
if type(lines) == type("") then
|
|
|
|
|
unimplemented()
|
|
|
|
|
lines = splitlines(lines)
|
|
|
|
|
end
|
|
|
|
|
a.nvim_buf_set_lines(s.buf, l0, l0, true, lines)
|
|
|
|
|
local l1 = a.nvim_buf_line_count(s.buf)
|
|
|
|
|
if hl ~= nil then
|
|
|
|
|
for i = l0, a.nvim_buf_line_count(s.buf)-1 do
|
|
|
|
|
for i = l0, l1-1 do
|
|
|
|
|
a.nvim_buf_add_highlight(s.buf, -1, hl, i, 0, -1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- TODO: scroll!
|
|
|
|
|
local curwin = a.nvim_get_current_win()
|
|
|
|
|
for _,win in ipairs(a.nvim_list_wins()) do
|
|
|
|
|
if a.nvim_win_get_buf(win) == s.buf and win ~= curwin then
|
|
|
|
|
a.nvim_win_set_cursor(win, {l1, 1e9})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return l0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -42,17 +68,52 @@ local function luadev_print(x) -- TODO: ...
|
|
|
|
|
append_buf({str})
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function dedent(str, leave_indent)
|
|
|
|
|
-- find minimum common indent across lines
|
|
|
|
|
local indent = nil
|
|
|
|
|
for line in str:gmatch('[^\n]+') do
|
|
|
|
|
local line_indent = line:match('^%s+') or ''
|
|
|
|
|
if indent == nil or #line_indent < #indent then
|
|
|
|
|
indent = line_indent
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if indent == nil or #indent == 0 then
|
|
|
|
|
-- no minimum common indent
|
|
|
|
|
return str
|
|
|
|
|
end
|
|
|
|
|
local left_indent = (' '):rep(leave_indent or 0)
|
|
|
|
|
-- create a pattern for the indent
|
|
|
|
|
indent = indent:gsub('%s', '[ \t]')
|
|
|
|
|
-- strip it from the first line
|
|
|
|
|
str = str:gsub('^'..indent, left_indent)
|
|
|
|
|
-- strip it from the remaining lines
|
|
|
|
|
str = str:gsub('[\n]'..indent, '\n' .. left_indent)
|
|
|
|
|
return str
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function exec(str)
|
|
|
|
|
local s, err = loadstring(str,"g")
|
|
|
|
|
if s == nil then
|
|
|
|
|
local chunk, err = loadstring(str,"g")
|
|
|
|
|
local inlines = splitlines(dedent(str))
|
|
|
|
|
if inlines[#inlines] == "" then
|
|
|
|
|
inlines[#inlines] = nil
|
|
|
|
|
end
|
|
|
|
|
for i,l in ipairs(inlines) do
|
|
|
|
|
inlines[i] = "> "..l
|
|
|
|
|
end
|
|
|
|
|
append_buf({""})
|
|
|
|
|
local start = append_buf(inlines)
|
|
|
|
|
for i,_ in ipairs(inlines) do
|
|
|
|
|
a.nvim_buf_add_highlight(s.buf, -1, "Question", start+i-1, 0, 2)
|
|
|
|
|
end
|
|
|
|
|
if chunk == nil then
|
|
|
|
|
append_buf({err},"WarningMsg")
|
|
|
|
|
else
|
|
|
|
|
local oldprint = _G.print
|
|
|
|
|
_G.print = luadev_print
|
|
|
|
|
s, err = pcall(s)
|
|
|
|
|
local st, err2 = pcall(chunk)
|
|
|
|
|
_G.print = oldprint
|
|
|
|
|
if s == false then
|
|
|
|
|
append_buf({err},"WarningMsg")
|
|
|
|
|
if st == false then
|
|
|
|
|
append_buf({err2},"WarningMsg")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@ -61,9 +122,19 @@ local function start()
|
|
|
|
|
create_buf(true)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
local mod = {
|
|
|
|
|
start=start,
|
|
|
|
|
exec=exec,
|
|
|
|
|
print=luadev_print,
|
|
|
|
|
append_buf=append_buf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-- TODO: export abstraction for autoreload
|
|
|
|
|
if s.mod == nil then
|
|
|
|
|
s.mod = mod
|
|
|
|
|
else
|
|
|
|
|
for k,v in pairs(mod) do
|
|
|
|
|
s.mod[k] = v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return s.mod
|
|
|
|
|