From 1fa473e94394eb9a27b879552ecf34632e03d736 Mon Sep 17 00:00:00 2001 From: niten94 <127052329+niten94@users.noreply.github.com> Date: Wed, 19 Mar 2025 19:59:03 +0800 Subject: [PATCH 1/4] Merge tscreen_windows.go with tscreen_stub.go --- tscreen_stub.go | 7 +++++-- tscreen_windows.go | 44 -------------------------------------------- 2 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 tscreen_windows.go diff --git a/tscreen_stub.go b/tscreen_stub.go index 0c7d0122..e599a610 100644 --- a/tscreen_stub.go +++ b/tscreen_stub.go @@ -1,4 +1,4 @@ -// +build nacl plan9 +// +build nacl plan9 windows // Copyright 2015 The TCell Authors // @@ -16,7 +16,10 @@ package tcell -// This stub file is for systems that have no termios. +// On Windows we don't have support for termios. We probably could, and +// may should, in a cygwin type environment. Its not clear how to make +// this all work nicely with both cygwin and Windows console, so we +// decline to do so here. type termiosPrivate struct{} diff --git a/tscreen_windows.go b/tscreen_windows.go deleted file mode 100644 index e0ae2eeb..00000000 --- a/tscreen_windows.go +++ /dev/null @@ -1,44 +0,0 @@ -// +build windows - -// Copyright 2015 The TCell Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use file except in compliance with the License. -// You may obtain a copy of the license at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcell - -// On Windows we don't have support for termios. We probably could, and -// may should, in a cygwin type environment. Its not clear how to make -// this all work nicely with both cygwin and Windows console, so we -// decline to do so here. - -func (t *tScreen) termioInit() error { - return ErrNoScreen -} - -func (t *tScreen) termioFini() { - return -} - -func (t *tScreen) getWinSize() (int, int, error) { - return 0, 0, ErrNoScreen -} - -func (t *tScreen) getCharset() string { - return "UTF-16LE" -} - -func (t *tScreen) Beep() error { - return ErrNoScreen -} - -type termiosPrivate struct{} From 101a7d466ec086d1c86df84fa2cd37ad4a3d63f7 Mon Sep 17 00:00:00 2001 From: niten94 <127052329+niten94@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:21:54 +0800 Subject: [PATCH 2/4] Use x/term.MakeRaw on Linux --- go.mod | 3 ++- go.sum | 4 ++++ tscreen.go | 2 ++ tscreen_linux.go | 44 +++++++------------------------------------- 4 files changed, 15 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index 0b551637..0bbc5657 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,8 @@ require ( github.com/mattn/go-runewidth v0.0.7 github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8 github.com/zyedidia/poller v1.0.1 - golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 + golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 + golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf golang.org/x/text v0.3.0 ) diff --git a/go.sum b/go.sum index bdc40ef7..87a727a2 100644 --- a/go.sum +++ b/go.sum @@ -10,5 +10,9 @@ github.com/zyedidia/poller v1.0.1 h1:Tt9S3AxAjXwWGNiC2TUdRJkQDZSzCBNVQ4xXiQ7440s github.com/zyedidia/poller v1.0.1/go.mod h1:vZXJOHGDcuK08GXhF6IAY0ZFd2WcgOR5DOTp84Uk5eE= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/tscreen.go b/tscreen.go index 1bb0e5ad..29b1bf34 100644 --- a/tscreen.go +++ b/tscreen.go @@ -28,6 +28,7 @@ import ( "time" "unicode/utf8" + "golang.org/x/term" "golang.org/x/text/transform" "github.com/micro-editor/tcell/v2/terminfo" @@ -140,6 +141,7 @@ type tScreen struct { buttondn bool rawseq []string finiOnce sync.Once + saved *term.State sync.Mutex } diff --git a/tscreen_linux.go b/tscreen_linux.go index 63499a7c..7956ec20 100644 --- a/tscreen_linux.go +++ b/tscreen_linux.go @@ -23,16 +23,14 @@ import ( "syscall" "golang.org/x/sys/unix" + "golang.org/x/term" ) -type termiosPrivate struct { - tio *unix.Termios -} +type termiosPrivate struct{} func (t *tScreen) termioInit() error { var e error - var raw *unix.Termios - var tio *unix.Termios + var state *term.State if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { goto failed @@ -41,40 +39,12 @@ func (t *tScreen) termioInit() error { goto failed } - tio, e = unix.IoctlGetTermios(int(t.out.(*os.File).Fd()), unix.TCGETS) + state, e = term.MakeRaw(int(t.out.(*os.File).Fd())) if e != nil { goto failed } - t.tiosp = &termiosPrivate{tio: tio} - - // make a local copy, to make it raw - raw = &unix.Termios{ - Cflag: tio.Cflag, - Oflag: tio.Oflag, - Iflag: tio.Iflag, - Lflag: tio.Lflag, - Cc: tio.Cc, - } - raw.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | - unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) - raw.Oflag &^= unix.OPOST - raw.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | - unix.IEXTEN) - raw.Cflag &^= (unix.CSIZE | unix.PARENB) - raw.Cflag |= unix.CS8 - - // This is setup for blocking reads. In the past we attempted to - // use non-blocking reads, but now a separate input loop and timer - // copes with the problems we had on some systems (BSD/Darwin) - // where close hung forever. - raw.Cc[unix.VMIN] = 1 - raw.Cc[unix.VTIME] = 0 - - e = unix.IoctlSetTermios(int(t.out.(*os.File).Fd()), unix.TCSETS, raw) - if e != nil { - goto failed - } + t.saved = state signal.Notify(t.sigwinch, syscall.SIGWINCH) @@ -100,8 +70,8 @@ func (t *tScreen) termioFini() { <-t.indoneq - if t.out != nil && t.tiosp != nil { - unix.IoctlSetTermios(int(t.out.(*os.File).Fd()), unix.TCSETSF, t.tiosp.tio) + if t.out != nil && t.saved != nil { + term.Restore(int(t.out.(*os.File).Fd()), t.saved) t.out.(*os.File).Close() } From 25e302228d0a61d4788e06bb49e1756293ad6d87 Mon Sep 17 00:00:00 2001 From: niten94 <127052329+niten94@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:01:24 +0800 Subject: [PATCH 3/4] Use Linux screen implementation on Unix systems Use Linux screen implementation on all Unix systems and remove other files except tscreen_darwin.go. The method to operate files on Mac OS used in the fork cannot be changed, due to lack of clear information and opportunity to test related issues. --- tscreen.go | 1 - tscreen_bsd.go | 121 --------------------------- tscreen_darwin.go | 77 ++++++++---------- tscreen_solaris.go | 122 ---------------------------- tscreen_stub.go | 2 - tscreen_linux.go => tscreen_unix.go | 4 +- 6 files changed, 36 insertions(+), 291 deletions(-) delete mode 100644 tscreen_bsd.go delete mode 100644 tscreen_solaris.go rename tscreen_linux.go => tscreen_unix.go (97%) diff --git a/tscreen.go b/tscreen.go index 29b1bf34..f5849f2e 100644 --- a/tscreen.go +++ b/tscreen.go @@ -127,7 +127,6 @@ type tScreen struct { clear bool cursorx int cursory int - tiosp *termiosPrivate wasbtn bool acs map[rune]string charset string diff --git a/tscreen_bsd.go b/tscreen_bsd.go deleted file mode 100644 index b10e2224..00000000 --- a/tscreen_bsd.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build freebsd netbsd openbsd dragonfly - -// Copyright 2019 The TCell Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use file except in compliance with the License. -// You may obtain a copy of the license at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcell - -import ( - "os" - "os/signal" - "syscall" - "unsafe" -) - -type termiosPrivate syscall.Termios - -func (t *tScreen) termioInit() error { - var e error - var newtios termiosPrivate - var fd uintptr - var tios uintptr - var ioc uintptr - t.tiosp = &termiosPrivate{} - - if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { - goto failed - } - if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { - goto failed - } - - tios = uintptr(unsafe.Pointer(t.tiosp)) - ioc = uintptr(syscall.TIOCGETA) - fd = uintptr(t.out.(*os.File).Fd()) - if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { - e = e1 - goto failed - } - - newtios = *t.tiosp - newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | - syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | - syscall.ICRNL | syscall.IXON - newtios.Oflag &^= syscall.OPOST - newtios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | - syscall.ISIG | syscall.IEXTEN - newtios.Cflag &^= syscall.CSIZE | syscall.PARENB - newtios.Cflag |= syscall.CS8 - - tios = uintptr(unsafe.Pointer(&newtios)) - - ioc = uintptr(syscall.TIOCSETA) - if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { - e = e1 - goto failed - } - - signal.Notify(t.sigwinch, syscall.SIGWINCH) - - if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { - t.cells.Resize(w, h) - } - - return nil - -failed: - if t.in != nil { - t.in.(*os.File).Close() - } - if t.out != nil { - t.out.(*os.File).Close() - } - return e -} - -func (t *tScreen) termioFini() { - - signal.Stop(t.sigwinch) - - <-t.indoneq - - if t.out != nil { - fd := uintptr(t.out.(*os.File).Fd()) - ioc := uintptr(syscall.TIOCSETAF) - tios := uintptr(unsafe.Pointer(t.tiosp)) - syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0) - t.out.(*os.File).Close() - } - if t.in != nil { - t.in.(*os.File).Close() - } -} - -func (t *tScreen) getWinSize() (int, int, error) { - - fd := uintptr(t.out.(*os.File).Fd()) - dim := [4]uint16{} - dimp := uintptr(unsafe.Pointer(&dim)) - ioc := uintptr(syscall.TIOCGWINSZ) - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, - fd, ioc, dimp, 0, 0, 0); err != 0 { - return -1, -1, err - } - return int(dim[1]), int(dim[0]), nil -} - -func (t *tScreen) Beep() error { - t.writeString(string(byte(7))) - return nil -} diff --git a/tscreen_darwin.go b/tscreen_darwin.go index d05479d3..d40533f6 100644 --- a/tscreen_darwin.go +++ b/tscreen_darwin.go @@ -36,22 +36,19 @@ package tcell // close it, it actually closes import ( + "os" "os/signal" + "strconv" "syscall" - "unsafe" "github.com/zyedidia/poller" + "golang.org/x/sys/unix" + "golang.org/x/term" ) -type termiosPrivate syscall.Termios - func (t *tScreen) termioInit() error { var e error - var newtios termiosPrivate - var fd uintptr - var tios uintptr - var ioc uintptr - t.tiosp = &termiosPrivate{} + var state *term.State if t.in, e = poller.Open("/dev/tty", poller.O_RO); e != nil { goto failed @@ -60,31 +57,12 @@ func (t *tScreen) termioInit() error { goto failed } - tios = uintptr(unsafe.Pointer(t.tiosp)) - ioc = uintptr(syscall.TIOCGETA) - fd = uintptr(t.out.(*poller.FD).Sysfd()) - if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { - e = e1 + state, e = term.MakeRaw(t.out.(*poller.FD).Sysfd()) + if e != nil { goto failed } - newtios = *t.tiosp - newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | - syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | - syscall.ICRNL | syscall.IXON - newtios.Oflag &^= syscall.OPOST - newtios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | - syscall.ISIG | syscall.IEXTEN - newtios.Cflag &^= syscall.CSIZE | syscall.PARENB - newtios.Cflag |= syscall.CS8 - - tios = uintptr(unsafe.Pointer(&newtios)) - - ioc = uintptr(syscall.TIOCSETA) - if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { - e = e1 - goto failed - } + t.saved = state signal.Notify(t.sigwinch, syscall.SIGWINCH) @@ -110,11 +88,8 @@ func (t *tScreen) termioFini() { <-t.indoneq - if t.out != nil { - fd := uintptr(t.out.(*poller.FD).Sysfd()) - ioc := uintptr(syscall.TIOCSETAF) - tios := uintptr(unsafe.Pointer(t.tiosp)) - syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0) + if t.out != nil && t.saved != nil { + term.Restore(t.out.(*poller.FD).Sysfd(), t.saved) t.out.(*poller.FD).Close() } @@ -125,15 +100,33 @@ func (t *tScreen) termioFini() { func (t *tScreen) getWinSize() (int, int, error) { - fd := uintptr(t.out.(*poller.FD).Sysfd()) - dim := [4]uint16{} - dimp := uintptr(unsafe.Pointer(&dim)) - ioc := uintptr(syscall.TIOCGWINSZ) - if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, - fd, ioc, dimp, 0, 0, 0); err != 0 { + wsz, err := unix.IoctlGetWinsize(int(t.out.(*poller.FD).Sysfd()), unix.TIOCGWINSZ) + if err != nil { return -1, -1, err } - return int(dim[1]), int(dim[0]), nil + cols := int(wsz.Col) + rows := int(wsz.Row) + if cols == 0 { + colsEnv := os.Getenv("COLUMNS") + if colsEnv != "" { + if cols, err = strconv.Atoi(colsEnv); err != nil { + return -1, -1, err + } + } else { + cols = t.ti.Columns + } + } + if rows == 0 { + rowsEnv := os.Getenv("LINES") + if rowsEnv != "" { + if rows, err = strconv.Atoi(rowsEnv); err != nil { + return -1, -1, err + } + } else { + rows = t.ti.Lines + } + } + return cols, rows, nil } func (t *tScreen) Beep() error { diff --git a/tscreen_solaris.go b/tscreen_solaris.go deleted file mode 100644 index b0c7272f..00000000 --- a/tscreen_solaris.go +++ /dev/null @@ -1,122 +0,0 @@ -// +build solaris illumos - -// Copyright 2020 The TCell Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use file except in compliance with the License. -// You may obtain a copy of the license at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcell - -import ( - "os" - "os/signal" - "syscall" - - "golang.org/x/sys/unix" -) - -type termiosPrivate struct { - tio *unix.Termios -} - -func (t *tScreen) termioInit() error { - var e error - var raw *unix.Termios - var tio *unix.Termios - - if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { - goto failed - } - if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { - goto failed - } - - tio, e = unix.IoctlGetTermios(int(t.out.(*os.File).Fd()), unix.TCGETS) - if e != nil { - goto failed - } - - t.tiosp = &termiosPrivate{tio: tio} - - // make a local copy, to make it raw - raw = &unix.Termios{ - Cflag: tio.Cflag, - Oflag: tio.Oflag, - Iflag: tio.Iflag, - Lflag: tio.Lflag, - Cc: tio.Cc, - } - - raw.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.INLCR | - unix.IGNCR | unix.ICRNL | unix.IXON) - raw.Oflag &^= unix.OPOST - raw.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - raw.Cflag &^= (unix.CSIZE | unix.PARENB) - raw.Cflag |= unix.CS8 - - // This is setup for blocking reads. In the past we attempted to - // use non-blocking reads, but now a separate input loop and timer - // copes with the problems we had on some systems (BSD/Darwin) - // where close hung forever. - raw.Cc[unix.VMIN] = 1 - raw.Cc[unix.VTIME] = 0 - - e = unix.IoctlSetTermios(int(t.out.(*os.File).Fd()), unix.TCSETS, raw) - if e != nil { - goto failed - } - - signal.Notify(t.sigwinch, syscall.SIGWINCH) - - if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { - t.cells.Resize(w, h) - } - - return nil - -failed: - if t.in != nil { - t.in.(*os.File).Close() - } - if t.out != nil { - t.out.(*os.File).Close() - } - return e -} - -func (t *tScreen) termioFini() { - - signal.Stop(t.sigwinch) - - <-t.indoneq - - if t.out != nil && t.tiosp != nil { - unix.IoctlSetTermios(int(t.out.(*os.File).Fd()), unix.TCSETSF, t.tiosp.tio) - t.out.(*os.File).Close() - } - if t.in != nil { - t.in.(*os.File).Close() - } -} - -func (t *tScreen) getWinSize() (int, int, error) { - wsz, err := unix.IoctlGetWinsize(int(t.out.(*os.File).Fd()), unix.TIOCGWINSZ) - if err != nil { - return -1, -1, err - } - return int(wsz.Col), int(wsz.Row), nil -} - -func (t *tScreen) Beep() error { - t.writeString(string(byte(7))) - return nil -} diff --git a/tscreen_stub.go b/tscreen_stub.go index e599a610..800df1ca 100644 --- a/tscreen_stub.go +++ b/tscreen_stub.go @@ -21,8 +21,6 @@ package tcell // this all work nicely with both cygwin and Windows console, so we // decline to do so here. -type termiosPrivate struct{} - func (t *tScreen) termioInit() error { return ErrNoScreen } diff --git a/tscreen_linux.go b/tscreen_unix.go similarity index 97% rename from tscreen_linux.go rename to tscreen_unix.go index 7956ec20..1fea2f58 100644 --- a/tscreen_linux.go +++ b/tscreen_unix.go @@ -1,4 +1,4 @@ -// +build linux +// +build aix dragonfly freebsd linux netbsd openbsd solaris zos // Copyright 2019 The TCell Authors // @@ -26,8 +26,6 @@ import ( "golang.org/x/term" ) -type termiosPrivate struct{} - func (t *tScreen) termioInit() error { var e error var state *term.State From 57a2541b0070a1802c71bcfac676d7e0dee3b74f Mon Sep 17 00:00:00 2001 From: niten94 <127052329+niten94@users.noreply.github.com> Date: Wed, 26 Mar 2025 21:35:55 +0800 Subject: [PATCH 4/4] Tidy go.mod --- go.mod | 2 -- go.sum | 6 ------ 2 files changed, 8 deletions(-) diff --git a/go.mod b/go.mod index 0bbc5657..be22c816 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,6 @@ require ( github.com/gdamore/encoding v1.0.0 github.com/lucasb-eyer/go-colorful v1.0.3 github.com/mattn/go-runewidth v0.0.7 - github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8 - github.com/zyedidia/poller v1.0.1 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf golang.org/x/text v0.3.0 diff --git a/go.sum b/go.sum index 87a727a2..7b5fc8c6 100644 --- a/go.sum +++ b/go.sum @@ -4,12 +4,6 @@ github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tW github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8 h1:woqigIZtZUZxws1zZA99nAvuz2mQrxtWsuZSR9c8I/A= -github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8/go.mod h1:6Yhx5ZJl5942QrNRWLwITArVT9okUXc5c3brgWJMoDc= -github.com/zyedidia/poller v1.0.1 h1:Tt9S3AxAjXwWGNiC2TUdRJkQDZSzCBNVQ4xXiQ7440s= -github.com/zyedidia/poller v1.0.1/go.mod h1:vZXJOHGDcuK08GXhF6IAY0ZFd2WcgOR5DOTp84Uk5eE= -golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10= -golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=