Add support for Plan 9

This gets readline working within Plan 9's
[vt(1)](https://9p.io/magic/man2html?man=vt&sect=1),
which can emulate a VT–220, ANSI, or XTerm terminal.
This commit is contained in:
Fazlul Shahriar 2018-09-03 07:25:54 -04:00
parent 2972be24d4
commit a011a6ad8d
2 changed files with 72 additions and 0 deletions

28
term_plan9.go Normal file
View File

@ -0,0 +1,28 @@
package readline
import "os"
// State contains the state of a terminal.
type State struct {
consctl *os.File
}
// MakeRaw put the terminal connected to the given file descriptor into raw
// mode and returns the previous state of the terminal so that it can be
// restored.
func MakeRaw(fd int) (*State, error) {
f, err := os.OpenFile("/dev/consctl", os.O_WRONLY, 0)
if err != nil {
return nil, err
}
if _, err := f.WriteString("rawon"); err != nil {
return nil, err
}
return &State{consctl: f}, nil
}
// Restore restores the terminal connected to the given file descriptor to a
// previous state.
func restoreTerm(fd int, state *State) error {
return state.consctl.Close()
}

44
utils_plan9.go Normal file
View File

@ -0,0 +1,44 @@
package readline
import (
"io"
"io/ioutil"
"strconv"
"syscall"
)
func SuspendMe() {
}
func GetScreenWidth() int {
const w = 0
// $COLS is set by vt(1). Read the environment variable directly
// because Go might be caching the value.
// See https://github.com/golang/go/issues/25234
b, err := ioutil.ReadFile("/env/COLS")
if err != nil {
return w
}
cols, err := strconv.Atoi(string(b))
if err != nil {
return w
}
return cols
}
// ClearScreen clears the console screen
func ClearScreen(w io.Writer) (int, error) {
return w.Write([]byte("\033[H"))
}
func DefaultIsTerminal() bool {
return true
}
func GetStdin() int {
return syscall.Stdin
}
func DefaultOnWidthChanged(f func()) {
}