func (t *Terminal) CharMode() error {
	t.lastState.Lflag &^= sys.ICANON
	t.lastState.Cc[sys.VTIME] = 0
	t.lastState.Cc[sys.VMIN] = 1
	if err := sys.Setattr(t.fd, sys.TCSANOW, &t.lastState); err != nil {
		return os.NewSyscallError("sys.Setattr", err)
	}
	t.mode |= CharMode
	return nil
}
CharMode sets the terminal to single-character mode.
package term
import (
	"io"
	"os"
	"github.com/tredoe/term/sys"
	"golang.org/x/sys/unix"
)
var (
	InputFD int       = unix.Stdin
	Input   io.Reader = os.Stdin
	Output  io.Writer = os.Stdout
)
type Terminal struct {
	mode modeType
	oldState, lastState sys.Termios
	size sys.Winsize
	fd int  
}
func New() (*Terminal, error) {
	var t Terminal
	if err := sys.Getattr(InputFD, &t.lastState); err != nil {
		return nil, os.NewSyscallError("sys.Getattr", err)
	}
	t.oldState = t.lastState  
	t.fd = InputFD
	return &t, nil
}
type State struct {
	wrap sys.Termios
}
func (t *Terminal) OriginalState() State {
	return State{t.oldState}
}
func (t *Terminal) Restore() error {
	if t.mode != 0 {
		if err := sys.Setattr(t.fd, sys.TCSANOW, &t.oldState); err != nil {
			return os.NewSyscallError("sys.Setattr", err)
		}
		t.lastState = t.oldState
		t.mode = 0
	}
	return nil
}
func Restore(fd int, st State) error {
	if err := sys.Setattr(fd, sys.TCSANOW, &st.wrap); err != nil {
		return os.NewSyscallError("sys.Setattr", err)
	}
	return nil
}
func (t *Terminal) RawMode() error {
	t.lastState.Iflag &^= (sys.BRKINT | sys.IGNBRK | sys.ICRNL | sys.INLCR |
		sys.IGNCR | sys.ISTRIP | sys.IXON | sys.PARMRK)
	t.lastState.Oflag &^= sys.OPOST
	t.lastState.Lflag &^= (sys.ECHO | sys.ECHONL | sys.ICANON | sys.IEXTEN | sys.ISIG)
	t.lastState.Cflag &^= (sys.CSIZE | sys.PARENB)
	t.lastState.Cflag |= sys.CS8
	t.lastState.Cc[sys.VMIN] = 1  
	t.lastState.Cc[sys.VTIME] = 0
	if err := sys.Setattr(t.fd, sys.TCSAFLUSH, &t.lastState); err != nil {
		return os.NewSyscallError("sys.Setattr", err)
	}
	t.mode |= RawMode
	return nil
}
func (t *Terminal) EchoMode(echo bool) error {
	if !echo {
		t.lastState.Lflag &^= sys.ECHO
	} else {
		t.lastState.Lflag |= sys.ECHO
	}
	if err := sys.Setattr(t.fd, sys.TCSANOW, &t.lastState); err != nil {
		return os.NewSyscallError("sys.Setattr", err)
	}
	if echo {
		t.mode |= EchoMode
	} else {
		t.mode &^= EchoMode
	}
	return nil
}