https://github.com/atomicgo/keyboard
⌨️ Read keyboard events in your terminal applications! (Arrow keys, Home, End, etc.)
https://github.com/atomicgo/keyboard
atomicgo cli go golang keyboard terminal
Last synced: about 2 months ago
JSON representation
⌨️ Read keyboard events in your terminal applications! (Arrow keys, Home, End, etc.)
- Host: GitHub
- URL: https://github.com/atomicgo/keyboard
- Owner: atomicgo
- License: mit
- Created: 2022-06-01T20:48:36.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-08-08T17:04:25.000Z (11 months ago)
- Last Synced: 2025-01-09T19:46:59.222Z (5 months ago)
- Topics: atomicgo, cli, go, golang, keyboard, terminal
- Language: Go
- Homepage: https://atomicgo.dev
- Size: 72.3 KB
- Stars: 88
- Watchers: 3
- Forks: 5
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
AtomicGo | keyboard
---
Get The Module
|
Documentation
|
Contributing
|
Code of Conduct---
![]()
-----------------------------------------------------------------------------------------------------
go get atomicgo.dev/keyboard
-----------------------------------------------------------------------------------------------------## Description
Package keyboard can be used to read key presses from the keyboard, while in a
terminal application. It's crossplatform and keypresses can be combined to check
for ctrl+c, alt+4, ctrl-shift, alt+ctrl+right, etc. It can also be used to
simulate (mock) keypresses for CI testing.Works nicely with https://atomicgo.dev/cursor
## Simple Usage
```go
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
```## Advanced Usage
```go
// Stop keyboard listener on Escape key press or CTRL+C.
// Exit application on "q" key press.
// Print every rune key press.
// Print every other key press.
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
switch key.Code {
case keys.CtrlC, keys.Escape:
return true, nil // Return true to stop listener
case keys.RuneKey: // Check if key is a rune key (a, b, c, 1, 2, 3, ...)
if key.String() == "q" { // Check if key is "q"
fmt.Println("\rQuitting application")
os.Exit(0) // Exit application
}
fmt.Printf("\rYou pressed the rune key: %s\n", key)
default:
fmt.Printf("\rYou pressed: %s\n", key)
}return false, nil // Return false to continue listening
})
```## Simulate Key Presses (for mocking in tests)
```go
go func() {
keyboard.SimulateKeyPress("Hello") // Simulate key press for every letter in string
keyboard.SimulateKeyPress(keys.Enter) // Simulate key press for Enter
keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
keyboard.SimulateKeyPress('x') // Simulate key press for a single rune
keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputskeyboard.SimulateKeyPress(keys.Escape) // Simulate key press for Escape, which quits the program
}()keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.Escape || key.Code == keys.CtrlC {
os.Exit(0) // Exit program on Escape
}fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
```## Usage
#### func Listen
```go
func Listen(onKeyPress func(key keys.Key) (stop bool, err error)) error
```
Listen calls a callback function when a key is pressed.Simple example:
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})#### func SimulateKeyPress
```go
func SimulateKeyPress(input ...interface{}) error
```
SimulateKeyPress simulate a key press. It can be used to mock user input and
test your application.Example:
go func() {
keyboard.SimulateKeyPress("Hello") // Simulate key press for every letter in string
keyboard.SimulateKeyPress(keys.Enter) // Simulate key press for Enter
keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
keyboard.SimulateKeyPress('x') // Simulate key press for a single rune
keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs
}()---
> [AtomicGo.dev](https://atomicgo.dev) ·
> with ❤️ by [@MarvinJWendt](https://github.com/MarvinJWendt) |
> [MarvinJWendt.com](https://marvinjwendt.com)