mirror of https://github.com/Hilbis/Hilbish
feat: add getChar function to editor interface
this is a simple command that returns a single key from the user. this can be used to read keystrokes in an interactive program like how greenhouse (the pager) does itpull/240/head
parent
4a3ceed39c
commit
b6315639b2
11
editor.go
11
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
|
||||
}
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 "???"
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue