{"id":27880852,"url":"https://github.com/atomicgo/keyboard","last_synced_at":"2025-05-05T04:38:46.425Z","repository":{"id":38389791,"uuid":"498894068","full_name":"atomicgo/keyboard","owner":"atomicgo","description":"⌨️ Read keyboard events in your terminal applications! (Arrow keys, Home, End, etc.)","archived":false,"fork":false,"pushed_at":"2024-08-08T17:04:25.000Z","size":74,"stargazers_count":88,"open_issues_count":5,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-09T19:46:59.222Z","etag":null,"topics":["atomicgo","cli","go","golang","keyboard","terminal"],"latest_commit_sha":null,"homepage":"https://atomicgo.dev","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/atomicgo.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},"funding":{"github":["MarvinJWendt"]}},"created_at":"2022-06-01T20:48:36.000Z","updated_at":"2025-01-06T01:40:15.000Z","dependencies_parsed_at":"2023-02-08T20:46:25.020Z","dependency_job_id":"2befceed-9a1e-4dcd-8e0a-c6d29cd7582a","html_url":"https://github.com/atomicgo/keyboard","commit_stats":{"total_commits":51,"total_committers":2,"mean_commits":25.5,"dds":"0.019607843137254943","last_synced_commit":"5687dac1333c333eae4319858160cd0d52dee3de"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":"atomicgo/template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fkeyboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fkeyboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fkeyboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atomicgo%2Fkeyboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atomicgo","download_url":"https://codeload.github.com/atomicgo/keyboard/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252442480,"owners_count":21748448,"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":["atomicgo","cli","go","golang","keyboard","terminal"],"created_at":"2025-05-05T04:38:41.227Z","updated_at":"2025-05-05T04:38:46.417Z","avatar_url":"https://github.com/atomicgo.png","language":"Go","funding_links":["https://github.com/sponsors/MarvinJWendt"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eAtomicGo | keyboard\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\n\u003ca href=\"https://github.com/atomicgo/keyboard/releases\"\u003e\n\u003cimg src=\"https://img.shields.io/github/v/release/atomicgo/keyboard?style=flat-square\" alt=\"Latest Release\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/keyboard\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/atomicgo/keyboard/go.yml?style=flat-square\" alt=\"Tests\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/keyboard\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/codecov/c/gh/atomicgo/keyboard?color=magenta\u0026logo=codecov\u0026style=flat-square\" alt=\"Coverage\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://codecov.io/gh/atomicgo/keyboard\"\u003e\n\u003c!-- unittestcount:start --\u003e\u003cimg src=\"https://img.shields.io/badge/Unit_Tests-1-magenta?style=flat-square\" alt=\"Unit test count\"\u003e\u003c!-- unittestcount:end --\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://github.com/atomicgo/keyboard/issues\"\u003e\n\u003cimg src=\"https://img.shields.io/github/issues/atomicgo/keyboard.svg?style=flat-square\" alt=\"Issues\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://opensource.org/licenses/MIT\" target=\"_blank\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square\" alt=\"License: MIT\"\u003e\n\u003c/a\u003e\n\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n\u003cstrong\u003e\u003ca href=\"#install\"\u003eGet The Module\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://pkg.go.dev/atomicgo.dev/keyboard#section-documentation\" target=\"_blank\"\u003eDocumentation\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CONTRIBUTING.md\" target=\"_blank\"\u003eContributing\u003c/a\u003e\u003c/strong\u003e\n|\n\u003cstrong\u003e\u003ca href=\"https://github.com/atomicgo/atomicgo/blob/main/CODE_OF_CONDUCT.md\" target=\"_blank\"\u003eCode of Conduct\u003c/a\u003e\u003c/strong\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/atomicgo/atomicgo/main/assets/header.png\" alt=\"AtomicGo\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctd align=\"center\"\u003e\n\u003cimg width=\"2000\" height=\"0\"\u003e\u003cbr\u003e\n  -----------------------------------------------------------------------------------------------------\n\u003cimg width=\"2000\" height=\"0\"\u003e\n\u003c/td\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\u003ch3  align=\"center\"\u003e\u003cpre\u003ego get atomicgo.dev/keyboard\u003c/pre\u003e\u003c/h3\u003e\n\u003cp align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctd align=\"center\"\u003e\n\u003cimg width=\"2000\" height=\"0\"\u003e\u003cbr\u003e\n   -----------------------------------------------------------------------------------------------------\n\u003cimg width=\"2000\" height=\"0\"\u003e\n\u003c/td\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/p\u003e\n\n## Description\n\nPackage keyboard can be used to read key presses from the keyboard, while in a\nterminal application. It's crossplatform and keypresses can be combined to check\nfor ctrl+c, alt+4, ctrl-shift, alt+ctrl+right, etc. It can also be used to\nsimulate (mock) keypresses for CI testing.\n\nWorks nicely with https://atomicgo.dev/cursor\n\n## Simple Usage\n\n```go\nkeyboard.Listen(func(key keys.Key) (stop bool, err error) {\n  if key.Code == keys.CtrlC {\n    return true, nil // Stop listener by returning true on Ctrl+C\n  }\n\n  fmt.Println(\"\\r\" + key.String()) // Print every key press\n  return false, nil // Return false to continue listening\n})\n```\n\n## Advanced Usage\n\n```go\n// Stop keyboard listener on Escape key press or CTRL+C.\n// Exit application on \"q\" key press.\n// Print every rune key press.\n// Print every other key press.\nkeyboard.Listen(func(key keys.Key) (stop bool, err error) {\n  switch key.Code {\n  case keys.CtrlC, keys.Escape:\n    return true, nil // Return true to stop listener\n  case keys.RuneKey: // Check if key is a rune key (a, b, c, 1, 2, 3, ...)\n    if key.String() == \"q\" { // Check if key is \"q\"\n      fmt.Println(\"\\rQuitting application\")\n      os.Exit(0) // Exit application\n    }\n    fmt.Printf(\"\\rYou pressed the rune key: %s\\n\", key)\n  default:\n    fmt.Printf(\"\\rYou pressed: %s\\n\", key)\n  }\n\n  return false, nil // Return false to continue listening\n})\n```\n\n## Simulate Key Presses (for mocking in tests)\n\n```go\ngo func() {\n  keyboard.SimulateKeyPress(\"Hello\")             // Simulate key press for every letter in string\n  keyboard.SimulateKeyPress(keys.Enter)          // Simulate key press for Enter\n  keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right\n  keyboard.SimulateKeyPress('x')                 // Simulate key press for a single rune\n      keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs\n\n  keyboard.SimulateKeyPress(keys.Escape) // Simulate key press for Escape, which quits the program\n}()\n\nkeyboard.Listen(func(key keys.Key) (stop bool, err error) {\n  if key.Code == keys.Escape || key.Code == keys.CtrlC {\n    os.Exit(0) // Exit program on Escape\n  }\n\n  fmt.Println(\"\\r\" + key.String()) // Print every key press\n  return false, nil                // Return false to continue listening\n})\n```\n\n## Usage\n\n#### func  Listen\n\n```go\nfunc Listen(onKeyPress func(key keys.Key) (stop bool, err error)) error\n```\nListen calls a callback function when a key is pressed.\n\nSimple example:\n\n    keyboard.Listen(func(key keys.Key) (stop bool, err error) {\n    \tif key.Code == keys.CtrlC {\n    \t\treturn true, nil // Stop listener by returning true on Ctrl+C\n    \t}\n\n    \tfmt.Println(\"\\r\" + key.String()) // Print every key press\n    \treturn false, nil // Return false to continue listening\n    })\n\n#### func  SimulateKeyPress\n\n```go\nfunc SimulateKeyPress(input ...interface{}) error\n```\nSimulateKeyPress simulate a key press. It can be used to mock user input and\ntest your application.\n\nExample:\n\n    go func() {\n    \tkeyboard.SimulateKeyPress(\"Hello\")             // Simulate key press for every letter in string\n    \tkeyboard.SimulateKeyPress(keys.Enter)          // Simulate key press for Enter\n    \tkeyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right\n    \tkeyboard.SimulateKeyPress('x')                 // Simulate key press for a single rune\n    \tkeyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs\n    }()\n\n---\n\n\u003e [AtomicGo.dev](https://atomicgo.dev) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e with ❤️ by [@MarvinJWendt](https://github.com/MarvinJWendt) |\n\u003e [MarvinJWendt.com](https://marvinjwendt.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fkeyboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatomicgo%2Fkeyboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatomicgo%2Fkeyboard/lists"}