{"id":18053807,"url":"https://github.com/hymkor/go-windows1x-virtualterminal","last_synced_at":"2026-05-10T06:46:13.837Z","repository":{"id":162427135,"uuid":"636965620","full_name":"hymkor/go-windows1x-virtualterminal","owner":"hymkor","description":"Enables Windows10 and 11's native ESCAPE SEQUENCES and TERMINAL INPUTS","archived":false,"fork":false,"pushed_at":"2024-05-06T16:49:32.000Z","size":40,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-10T15:50:55.524Z","etag":null,"topics":["escape-sequence","go","golang","terminal","windows"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/hymkor/go-windows1x-virtualterminal","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hymkor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-06T05:20:34.000Z","updated_at":"2024-09-03T21:42:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"53e61e89-5f45-41ff-8ab2-df854574a5d6","html_url":"https://github.com/hymkor/go-windows1x-virtualterminal","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hymkor%2Fgo-windows1x-virtualterminal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hymkor%2Fgo-windows1x-virtualterminal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hymkor%2Fgo-windows1x-virtualterminal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hymkor%2Fgo-windows1x-virtualterminal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hymkor","download_url":"https://codeload.github.com/hymkor/go-windows1x-virtualterminal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247307328,"owners_count":20917448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["escape-sequence","go","golang","terminal","windows"],"created_at":"2024-10-31T00:08:07.592Z","updated_at":"2026-05-10T06:46:13.802Z","avatar_url":"https://github.com/hymkor.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"go-windows1x-virtualterminal\r\n=============================\r\n\r\nThis package enables following features on Windows10 and Windows11:\r\n\r\n- Enabling ANSI Escape Sequences for stdout and stderr\r\n- Enabling the input of keyboard arrow keys in the form of codes such as `ESC[A` to `ESC[D.` from stdin\r\n\r\nIf the platform is not Windows, the original terminal often supports escape sequences, so each function exits silently without causing an error.\r\n\r\nIf the platform is Windows older than version 10, each function will return `virtualterminal.ErrNotSupported` because the command prompt does not support these features.\r\n\r\nEnabling ANSI Escape Sequences\r\n------------------------------\r\n\r\n```examples/example.go\r\npackage main\r\n\r\nimport (\r\n    \"errors\"\r\n    \"fmt\"\r\n    \"os\"\r\n\r\n    \"github.com/hymkor/go-windows1x-virtualterminal\"\r\n)\r\n\r\nfunc mains() error {\r\n    fmt.Println(\"Defaut-Mode: \\x1B[32;1m!!!!\\x1B[0m\\n\")\r\n    closer, err := virtualterminal.EnableStdout()\r\n    if err != nil {\r\n        if errors.Is(err, virtualterminal.ErrNotSupported) {\r\n            return fmt.Errorf(\"This machine can not use ANSI-ESCAPE-SEQUENCE: %w\", err)\r\n        }\r\n        return err\r\n    }\r\n    fmt.Println(\"Ansi-Mode: \\x1B[32;1m!!!!\\x1B[0m\\n\")\r\n    closer()\r\n    fmt.Println(\"Default-Mode: \\x1B[32;1m!!!!\\x1B[0m\\n\")\r\n    return nil\r\n}\r\n\r\nfunc main() {\r\n    if err := mains(); err != nil {\r\n        fmt.Fprintln(os.Stderr, err.Error())\r\n        os.Exit(1)\r\n    }\r\n}\r\n```\r\n\r\n![example.png](examples/example.png)\r\n\r\nRead a key without Enter-key\r\n---------------------------\r\n\r\n```keyin/example.go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    \"os\"\r\n    \"strings\"\r\n\r\n    \"github.com/hymkor/go-windows1x-virtualterminal\"\r\n    \"github.com/hymkor/go-windows1x-virtualterminal/keyin\"\r\n)\r\n\r\nfunc mains() error {\r\n    // EnableStdin should be called once in one application.\r\n    close1, err := virtualterminal.EnableStdin()\r\n    if err != nil {\r\n        return err\r\n    }\r\n    defer close1()\r\n\r\n    // Raw switches the terminal to raw-mode.\r\n    // It should be called once in one readline loop.\r\n    close2, err := keyin.Raw()\r\n    if err != nil {\r\n        return err\r\n    }\r\n    defer close2()\r\n\r\n    fmt.Print(\"Hit any key: \")\r\n\r\n    ch, err := keyin.Get()\r\n    if err != nil {\r\n        return err\r\n    }\r\n\r\n    ch = strings.ReplaceAll(ch, \"\\x1B\", \"\u003cESC\u003e\")\r\n    fmt.Println(ch)\r\n    return nil\r\n}\r\n\r\nfunc main() {\r\n    if err := mains(); err != nil {\r\n        fmt.Fprintln(os.Stderr, err.Error())\r\n        os.Exit(1)\r\n    }\r\n}\r\n```\r\n\r\nEnabling the input of keyboard arrow keys\r\n------------------------------------------\r\n\r\n```examples/example2.go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    \"io\"\r\n    \"os\"\r\n\r\n    \"golang.org/x/term\"\r\n\r\n    \"github.com/hymkor/go-windows1x-virtualterminal\"\r\n)\r\n\r\nfunc readLine() (string, error) {\r\n    oldState, err := term.MakeRaw(int(os.Stdin.Fd()))\r\n    if err != nil {\r\n        return \"\", err\r\n    }\r\n    defer term.Restore(int(os.Stdin.Fd()), oldState)\r\n\r\n    disableIn, err := virtualterminal.EnableStdin()\r\n    if err != nil {\r\n        return \"\", err\r\n    }\r\n    defer disableIn()\r\n\r\n    disableOut, err := virtualterminal.EnableStdout()\r\n    if err != nil {\r\n        return \"\", err\r\n    }\r\n    defer disableOut()\r\n\r\n    terminal := term.NewTerminal(\u0026struct {\r\n        io.Reader\r\n        io.Writer\r\n    }{os.Stdin, os.Stdout}, \"\u003e \")\r\n\r\n    return terminal.ReadLine()\r\n}\r\n\r\nfunc main() {\r\n    line, err := readLine()\r\n    if err != nil {\r\n        fmt.Fprintln(os.Stderr, err.Error())\r\n        os.Exit(1)\r\n    }\r\n    fmt.Println(\"Line:\", line)\r\n}\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhymkor%2Fgo-windows1x-virtualterminal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhymkor%2Fgo-windows1x-virtualterminal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhymkor%2Fgo-windows1x-virtualterminal/lists"}