tt. Boy, is parsing the key names into tcell.EventKeys a horrible thing. This type consists of three information:
Ha, I just stumbled across https://codeberg.org/tslocum/cbind, perfect!
tt. Boy, is parsing the key names into tcell.EventKeys a horrible thing. This type consists of three information:
Ha, I just stumbled across https://codeberg.org/tslocum/cbind, perfect!
@movq@www.uninformativ.de I figure that’s exactly what it is.
@bender@twtxt.net ICQ, yeah, I vaguely remember these times, despite I still know my ICQ number like it was yesterday. :-D
@shinyoukai@neko.laidback.moe No, it’s not dead. The one account in question actually is on jabber.org.
@bender@twtxt.net I vaguely remember this, some leftover from the old-style hashtags? The (#foo) stuff? 🤔
Heh I thought I fixed that bug? (is it s abug?!)
Yes, if a twtxt contains something like “(This is a test. Will this work as it should?)”, it will show empty on Yarn.
@prologic@twtxt.net it really is not blank. It reads:
2026-01-12T23:34:11+01:00 (you must be root)
This week, Mu (µ) get s bit more serious and starts to refactor the native backend (a lot). Soon™ we will support darwin/arm64, linux/arm64 and linux/amd64 (Yes, other forms of BSD will come!) – Mu (µ) also last week grew concurrency support too! 🤣
@klaxzy@klaxzy.net nothing like a blank twt eh? 😅
@shinyoukai@yume.laidback.moe Jabber = XMPP.
I’m trying to implement configurable key bindings in tt. Boy, is parsing the key names into tcell.EventKeys a horrible thing. This type consists of three information:
It’s hardcoded usage results in code like this:
func (t *TreeView[T]) InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
switch event.Key() {
case tcell.KeyUp:
t.moveUp()
case tcell.KeyDown:
t.moveDown()
case tcell.KeyHome:
t.moveTop()
case tcell.KeyEnd:
t.moveBottom()
case tcell.KeyCtrlE:
t.moveScrollOffsetDown()
case tcell.KeyCtrlY:
t.moveScrollOffsetUp()
case tcell.KeyTab, tcell.KeyBacktab:
if t.finished != nil {
t.finished(event.Key())
}
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'k':
t.moveUp()
case 'j':
t.moveDown()
case 'g':
t.moveTop()
case 'G':
t.moveBottom()
}
}
}
})
}
This data structure is just awful to handle and especially initialize in my opinion. Some compound tcell.Keys are mapped to human-readable names in tcell.KeyNames. However, these names always use - to join modifiers, e.g. resulting in Ctrl-A, whereas tcell.EventKey.Name() produces +-delimited strings, e.g. Ctrl+A. Gnaarf, why this asymmetry!? O_o
I just checked k9s and they’re extending tcell.KeyNames with their own tcell.Key definitions like crazy: https://github.com/derailed/k9s/blob/master/internal/ui/key.go Then, they convert an original tcell.EventKey to tcell.Key: https://github.com/derailed/k9s/blob/b53f3091ca2d9ab963913b0d5e59376aea3f3e51/internal/ui/app.go#L287 This must be used when actually handling keyboard input: https://github.com/derailed/k9s/blob/e55083ba271eed6fc4014674890f70c5ed6c70e0/internal/ui/tree.go#L101
This seems to be much nicer to use. However, I fear this will break eventually. And it’s more fragile in general, because it’s rather easy to forget the conversion or one can get confused whether a certain key at hand is now an original tcell.Key coming from the library or an “extended” one.
I will see if I can find some other programs that provide configurable tcell key bindings.