bubbles icon indicating copy to clipboard operation
bubbles copied to clipboard

Key combinations

Open dlvhdr opened this issue 3 years ago • 3 comments
trafficstars

Is there an easy way of detecting key combinations, similar to how vim key combos work?

I'm guessing I can implement something myself by recording the time between key presses and all that.

The use case is to allow more complex keybindings in a program that are easier to remember. Prefixing key combos with something like vim's <leader> key, or global actions with g.

dlvhdr avatar May 13 '22 18:05 dlvhdr

There's no way to do this yet, though you can totally implement this in the manner like you're suggesting.

That said, this would also be an awesome feature for the Key Bubble. Transferring this issue accordingly.

meowgorithm avatar May 14 '22 01:05 meowgorithm

@dlvhdr I think this could be implemented by "focusing" a particular element/component in the UI, whether that's invisible or not would be up to you, with 1 key press. Then subsequent key presses flow only to the focused element. Allowing you to avoid timing race conditions.

This is what I figured out just last night.

func (m Model) onKeyPress(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
	switch {
	case key.Matches(msg, m.keys.FocusLeft):
		return m.refocus(-1)

	case key.Matches(msg, m.keys.FocusRight):
		return m.refocus(1)

	case key.Matches(msg, m.keys.Quit):
		return m, tea.Quit
	default:
		return m.updateComponent(m.state.currentFocus, msg)
	}

	return m, nil
}

func (m Model) updateComponent(key componentKey, teaMsg tea.Msg) (Model, tea.Cmd) {
	compUpdate, compCmd := m.components[key].Update(teaMsg)
	m.components[key] = compUpdate
	return m, compCmd
}

Let me know if this helps. Also, I absolutely love https://github.com/dlvhdr/gh-dash - I've been using it as inspiration for a different project of mine. I just really the clean look of it, and use of icons and such. In fact, I discovered this focusing method as I was looking at gh-dash and wanted an alternative to the keybinding you setup there. You use ctrl+u and ctrl+d to scroll the "sidebar", and I wanted to leverage more of the default keybindings of the viewport (pageup/down, etc). Anyways, cheers 🍻

ghostsquad avatar May 24 '22 05:05 ghostsquad

Cool I like this idea @ghostsquad. I definitely think I need to improve the navigation in the preview pane and handle focus properly. Let me know if you find an elegant solution for your project

dlvhdr avatar May 24 '22 13:05 dlvhdr