diff --git a/editor.go b/editor.go index 3038f07..d720a41 100644 --- a/editor.go +++ b/editor.go @@ -16,6 +16,7 @@ func editorLoader(rtm *rt.Runtime) *rt.Table { "setVimRegister": {editorSetRegister, 1, false}, "getVimRegister": {editorGetRegister, 2, false}, "getLine": {editorGetLine, 0, false}, + "readChar": {editorReadChar, 0, false}, } mod := rt.NewTable() @@ -94,3 +95,13 @@ func editorGetLine(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.StringValue(string(buf))), nil } + +// #interface editor +// getChar() -> string +// Reads a keystroke from the user. This is in a format +// of something like Ctrl-L.. +func editorReadChar(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + buf := lr.rl.ReadChar() + + return c.PushingNext1(t.Runtime, rt.StringValue(string(buf))), nil +} diff --git a/nature/commands/doc.lua b/nature/commands/doc.lua index 841f912..a7162bf 100644 --- a/nature/commands/doc.lua +++ b/nature/commands/doc.lua @@ -60,7 +60,7 @@ Available sections: ]] .. table.concat(modules, ', ') return lunacolors.underline(lunacolors.blue(string.gsub(fname, '.md', ''))) end) if #moddocs ~= 0 then - funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ') + funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ') .. '\nLMAO' end local valsStr = funcdocs:match '%-%-%-\n([^%-%-%-]+)\n' diff --git a/nature/greenhouse/init.lua b/nature/greenhouse/init.lua index 3cd4133..57a3fb3 100644 --- a/nature/greenhouse/init.lua +++ b/nature/greenhouse/init.lua @@ -110,10 +110,21 @@ function Greenhouse:initUi() hilbish.goro(function() while not done do local c = read() - if c == 3 then + if c == 'Ctrl-D' then done = true end + if c == 'Up' then + self:scroll 'up' + end + if c == 'Down' then + self:scroll 'down' + end + + if c == 'Ctrl-Right' then self:next() end + if c == 'Ctrl-Left' then self:previous() end + + --[[ if c == 27 then local c1 = read() if c1 == 91 then @@ -141,8 +152,7 @@ function Greenhouse:initUi() end goto continue end - print('\nchar:') - print(c) + ]]-- ::continue:: end @@ -157,10 +167,10 @@ end function read() terminal.saveState() terminal.setRaw() - local c = io.read(1) + local c = hilbish.editor.readChar() terminal.restoreState() - return c:byte() + return c end return Greenhouse diff --git a/readline/codes.go b/readline/codes.go index 492bc72..aeb042a 100644 --- a/readline/codes.go +++ b/readline/codes.go @@ -1,5 +1,7 @@ package readline +import "os" + // Character codes const ( charCtrlA = iota + 1 @@ -134,3 +136,53 @@ const ( const ( seqCtermFg255 = "\033[48;5;255m" ) + +// TODO: return whether its actually a sequence or not +// remedies the edge case of someone literally typing Ctrl-A for example. +func (rl *Instance) ReadChar() string { + b := make([]byte, 1024) + i, _ := os.Stdin.Read(b) + r := []rune(string(b)) + s := string(r[:i]) + + switch b[0] { + case charCtrlA: return "Ctrl-A" + case charCtrlB: return "Ctrl-B" + case charCtrlC: return "Ctrl-C" + case charEOF: return "Ctrl-D" + case charCtrlE: return "Ctrl-E" + case charCtrlF: return "Ctrl-F" + case charCtrlG: return "Ctrl-G" + case charBackspace, charBackspace2: return "Backspace" + case charTab: return "Tab" + case charCtrlJ: return "Ctrl-J" + case charCtrlK: return "Ctrl-K" + case charCtrlL: return "Ctrl-L" + case charCtrlM: return "Ctrl-M" + case charCtrlN: return "Ctrl-N" + case charCtrlO: return "Ctrl-O" + case charCtrlP: return "Ctrl-P" + case charCtrlQ: return "Ctrl-Q" + case charCtrlR: return "Ctrl-R" + case charCtrlS: return "Ctrl-S" + case charCtrlT: return "Ctrl-T" + case charCtrlU: return "Ctrl-U" + case charCtrlV: return "Ctrl-V" + case charCtrlW: return "Ctrl-W" + case charCtrlX: return "Ctrl-X" + case charCtrlY: return "Ctrl-Y" + case charCtrlZ: return "Ctrl-Z" + case charEscape: + switch s { + case string(charEscape): return "Escape" + case seqUp: return "Up" + case seqDown: return "Down" + case seqBackwards: return "Left" + case seqForwards: return "Right" + case seqCtrlLeftArrow: return "Ctrl-Left" + case seqCtrlRightArrow: return "Ctrl-Right" + } + } + + return "???" +}