mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
ca7252ef8e
async fetching of suggestions remove limit cache the trie for future use more more
88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
package gui
|
|
|
|
import (
|
|
"unicode"
|
|
|
|
"github.com/jesseduffield/gocui"
|
|
)
|
|
|
|
func (gui *Gui) handleEditorKeypress(textArea *gocui.TextArea, key gocui.Key, ch rune, mod gocui.Modifier, allowMultiline bool) bool {
|
|
newlineKey, ok := gui.getKey(gui.Config.GetUserConfig().Keybinding.Universal.AppendNewline).(gocui.Key)
|
|
if !ok {
|
|
newlineKey = gocui.KeyAltEnter
|
|
}
|
|
|
|
switch {
|
|
case key == gocui.KeyBackspace || key == gocui.KeyBackspace2:
|
|
textArea.BackSpaceChar()
|
|
case key == gocui.KeyCtrlD || key == gocui.KeyDelete:
|
|
textArea.DeleteChar()
|
|
case key == gocui.KeyArrowDown:
|
|
textArea.MoveCursorDown()
|
|
case key == gocui.KeyArrowUp:
|
|
textArea.MoveCursorUp()
|
|
case key == gocui.KeyArrowLeft:
|
|
textArea.MoveCursorLeft()
|
|
case key == gocui.KeyArrowRight:
|
|
textArea.MoveCursorRight()
|
|
case key == newlineKey:
|
|
if allowMultiline {
|
|
textArea.TypeRune('\n')
|
|
} else {
|
|
return false
|
|
}
|
|
case key == gocui.KeySpace:
|
|
textArea.TypeRune(' ')
|
|
case key == gocui.KeyInsert:
|
|
textArea.ToggleOverwrite()
|
|
case key == gocui.KeyCtrlU:
|
|
textArea.DeleteToStartOfLine()
|
|
case key == gocui.KeyCtrlA || key == gocui.KeyHome:
|
|
textArea.GoToStartOfLine()
|
|
case key == gocui.KeyCtrlE || key == gocui.KeyEnd:
|
|
textArea.GoToEndOfLine()
|
|
|
|
// TODO: see if we need all three of these conditions: maybe the final one is sufficient
|
|
case ch != 0 && mod == 0 && unicode.IsPrint(ch):
|
|
textArea.TypeRune(ch)
|
|
default:
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// we've just copy+pasted the editor from gocui to here so that we can also re-
|
|
// render the commit message length on each keypress
|
|
func (gui *Gui) commitMessageEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) bool {
|
|
matched := gui.handleEditorKeypress(v.TextArea, key, ch, mod, true)
|
|
|
|
// This function is called again on refresh as part of the general resize popup call,
|
|
// but we need to call it here so that when we go to render the text area it's not
|
|
// considered out of bounds to add a newline, meaning we can avoid unnecessary scrolling.
|
|
err := gui.resizePopupPanel(v, v.TextArea.GetContent())
|
|
if err != nil {
|
|
gui.Log.Error(err)
|
|
}
|
|
v.RenderTextArea()
|
|
gui.RenderCommitLength()
|
|
|
|
return matched
|
|
}
|
|
|
|
func (gui *Gui) defaultEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) bool {
|
|
matched := gui.handleEditorKeypress(v.TextArea, key, ch, mod, false)
|
|
|
|
v.RenderTextArea()
|
|
|
|
if gui.findSuggestions != nil {
|
|
input := v.TextArea.GetContent()
|
|
gui.suggestionsAsyncHandler.Do(func() func() {
|
|
suggestions := gui.findSuggestions(input)
|
|
return func() { gui.setSuggestions(suggestions) }
|
|
})
|
|
}
|
|
|
|
return matched
|
|
}
|