lite-xl 2.1 support, sort of (currently requires hack for luasocket)
some nrepl fixes, "project file" support for customizing lite-xl on a per-project basis by loading a fennel file
This commit is contained in:
parent
8872d0f828
commit
1bcea81f43
|
@ -79,7 +79,7 @@ local function count(tbl)
|
||||||
end
|
end
|
||||||
|
|
||||||
function encode(x)
|
function encode(x)
|
||||||
local unpack = unpack or table.unpack
|
local unpack = rawget(_G, "unpack") or table.unpack
|
||||||
if(type(x) == "table" and select("#", unpack(x)) == count(x)) then
|
if(type(x) == "table" and select("#", unpack(x)) == count(x)) then
|
||||||
return encode_list(x)
|
return encode_list(x)
|
||||||
elseif(type(x) == "table") then
|
elseif(type(x) == "table") then
|
||||||
|
|
|
@ -66,8 +66,8 @@
|
||||||
"repl:create" #(show)
|
"repl:create" #(show)
|
||||||
"repl:switch-connection"
|
"repl:switch-connection"
|
||||||
#(core.command_view:enter "Connection Type"
|
#(core.command_view:enter "Connection Type"
|
||||||
#(when $2.text (set replsession.default-repl $2.text))
|
{:submit #(when $2.text (set replsession.default-repl $2.text))
|
||||||
#(mm.keys replsession.submit))
|
:suggest #(mm.keys replsession.submit)})
|
||||||
})
|
})
|
||||||
|
|
||||||
(command.add #(nrepl:connected?) {
|
(command.add #(nrepl:connected?) {
|
||||||
|
@ -106,7 +106,7 @@
|
||||||
|
|
||||||
(fn autocomplete-symbol [callback ?starting-text]
|
(fn autocomplete-symbol [callback ?starting-text]
|
||||||
(fn fixup-result [text item] (callback (or (and item item.text) text)))
|
(fn fixup-result [text item] (callback (or (and item item.text) text)))
|
||||||
(core.command_view:enter "Symbol" fixup-result autocomplete-results)
|
(core.command_view:enter "Symbol" {:submit fixup-result :suggest autocomplete-results})
|
||||||
(print "start-text" ?starting-text)
|
(print "start-text" ?starting-text)
|
||||||
(when ?starting-text
|
(when ?starting-text
|
||||||
(core.command_view:set_text ?starting-text)
|
(core.command_view:set_text ?starting-text)
|
||||||
|
|
3
init.lua
3
init.lua
|
@ -1,8 +1,9 @@
|
||||||
-- mod-version:2 -- lite-xl 2.0
|
-- mod-version:3 -- lite-xl 2.1
|
||||||
local fennel = require "plugins.fennel-xl.fennel"
|
local fennel = require "plugins.fennel-xl.fennel"
|
||||||
fennel.path = package.path:gsub("%.lua", ".fnl")
|
fennel.path = package.path:gsub("%.lua", ".fnl")
|
||||||
debug.traceback = fennel.traceback
|
debug.traceback = fennel.traceback
|
||||||
table.insert(package.loaders or package.searchers, fennel.searcher)
|
table.insert(package.loaders or package.searchers, fennel.searcher)
|
||||||
|
|
||||||
require "plugins.fennel-xl.editor"
|
require "plugins.fennel-xl.editor"
|
||||||
|
require "plugins.fennel-xl.project"
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
(self:do #(nrepl:new-session
|
(self:do #(nrepl:new-session
|
||||||
#(do (set self.session $2)
|
#(do (set self.session $2)
|
||||||
(self:done-msg))
|
(self:done-msg))
|
||||||
(self:make-handlers)))))
|
(self:make-handlers))
|
||||||
|
true)))
|
||||||
|
|
||||||
(fn Session.shutdown-session [self]
|
(fn Session.shutdown-session [self]
|
||||||
(set self.queue [])
|
(set self.queue [])
|
||||||
|
@ -42,8 +43,9 @@
|
||||||
{:status/done #(coroutine.resume coro)
|
{:status/done #(coroutine.resume coro)
|
||||||
:status/interrupted #(coroutine.resume coro)})))
|
:status/interrupted #(coroutine.resume coro)})))
|
||||||
|
|
||||||
(fn Session.do [self f]
|
(fn Session.do [self f ?init]
|
||||||
(if self.in-progress (table.insert self.queue f)
|
(if (or self.in-progress (and (not ?init) (= self.session nil)) )
|
||||||
|
(table.insert self.queue f)
|
||||||
(do (set self.in-progress true)
|
(do (set self.in-progress true)
|
||||||
(f))))
|
(f))))
|
||||||
|
|
||||||
|
@ -73,15 +75,18 @@
|
||||||
(lume.merge (or ?handlers {}) (self:input-handler input))))
|
(lume.merge (or ?handlers {}) (self:input-handler input))))
|
||||||
|
|
||||||
(local fennel (require :plugins.fennel-xl.fennel))
|
(local fennel (require :plugins.fennel-xl.fennel))
|
||||||
(fn parse-vals [s]
|
(fn parse-vals [s] [s])
|
||||||
(let [parser (fennel.parser s)]
|
; (let [parser (fennel.parser s)]
|
||||||
(icollect [ok ast (fennel.parser s)] (if ok ast s))))
|
; (icollect [ok ast (fennel.parser s)] (if ok ast s))))
|
||||||
|
|
||||||
(defmethod restart :nrepl (fn [session]
|
(defmethod restart :nrepl (fn [session]
|
||||||
(when (not (nrepl:connected?)) (error "Must connect nrepl"))
|
|
||||||
(when session.conn (session.conn:shutdown-session))
|
(when session.conn (session.conn:shutdown-session))
|
||||||
(set session.conn (Session))
|
(set session.conn (Session))
|
||||||
(session.conn:init-session)
|
(if (not (nrepl:connected?))
|
||||||
|
(nrepl:connect {:host session.host
|
||||||
|
:port session.port
|
||||||
|
:on-connect #(session.conn:init-session)})
|
||||||
|
(session.conn:init-session))
|
||||||
session))
|
session))
|
||||||
|
|
||||||
(defmethod submit :nrepl (fn [session chunk callback ?suppress-crash]
|
(defmethod submit :nrepl (fn [session chunk callback ?suppress-crash]
|
||||||
|
|
|
@ -90,14 +90,16 @@
|
||||||
(set self.active-requests {})
|
(set self.active-requests {})
|
||||||
(set self.session-handlers {})))
|
(set self.session-handlers {})))
|
||||||
:connect
|
:connect
|
||||||
(fn [self ?port ?host]
|
(fn [self ?opt]
|
||||||
(when (not self.connection)
|
(when (not self.connection)
|
||||||
(local (port host) (values (or ?port 7888) (or ?host :localhost)))
|
(local opt (or ?opt {}))
|
||||||
|
(local (port host) (values (or opt.port 7888) (or opt.host :localhost)))
|
||||||
(set self.connection (assert (socket.connect host port)))
|
(set self.connection (assert (socket.connect host port)))
|
||||||
(self.connection:settimeout 0)
|
(self.connection:settimeout 0)
|
||||||
(core.add_thread #(while true (self:receive) (coroutine.yield)) self)
|
(core.add_thread #(while true (self:receive) (coroutine.yield)) self)
|
||||||
(self:send {:op :clone}
|
(self:send {:op :clone}
|
||||||
{:new-session #(set self.default-session $2)})))
|
{:new-session #(do (set self.default-session $2)
|
||||||
|
(when opt.on-connect (opt.on-connect self)))})))
|
||||||
:connected?
|
:connected?
|
||||||
(fn [self] (not= self.default-session nil))
|
(fn [self] (not= self.default-session nil))
|
||||||
:new-session
|
:new-session
|
||||||
|
|
25
project.fnl
Normal file
25
project.fnl
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
(local core (require :core))
|
||||||
|
(local fennel (require :plugins.fennel-xl.fennel))
|
||||||
|
|
||||||
|
(fn load-fennel-project-file [dir]
|
||||||
|
(let [project-path (.. dir _G.PATHSEP "lite-xl-project.fnl")
|
||||||
|
fennel-path fennel.path]
|
||||||
|
(when (system.get_file_info project-path)
|
||||||
|
; temporarily allow importing project-local modules
|
||||||
|
(set fennel.path (.. fennel-path ";" project-path _G.PATHSEP "?.fnl;" project-path _G.PATHSEP "?" _G.PATHSEP "init.fnl"))
|
||||||
|
(fennel.dofile project-path)
|
||||||
|
(set fennel.path fennel-path))))
|
||||||
|
|
||||||
|
(let [run core.run]
|
||||||
|
(fn core.run [...]
|
||||||
|
; when a new lite-xl window opens with a project, on_enter_project is _not_ called
|
||||||
|
(core.try load-fennel-project-file core.project_dir)
|
||||||
|
|
||||||
|
(let [on-enter-project core.on_enter_project]
|
||||||
|
(fn core.on_enter_project [new-dir]
|
||||||
|
(on-enter-project new-dir)
|
||||||
|
(core.try load-fennel-project-file new-dir)))
|
||||||
|
(set core.run run)
|
||||||
|
(run ...)))
|
||||||
|
|
||||||
|
{}
|
Loading…
Reference in a new issue