diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index c355f236..389cc793 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -989,7 +989,7 @@ func (v *View) OpenFile(usePlugin bool) bool { return false } - if v.CanClose("Continue? (yes, no, save) ") { + if v.CanClose("Continue? (y,n,s) ", 'y', 'n', 's') { filename, canceled := messenger.Prompt("File to open: ", "Open", FileCompletion) if canceled { return false @@ -1285,7 +1285,7 @@ func (v *View) Quit(usePlugin bool) bool { } // Make sure not to quit if there are unsaved changes - if v.CanClose("Quit anyway? (yes, no, save) ") { + if v.CanClose("Quit anyway? (y,n,s) ", 'y', 'n', 's') { v.CloseBuffer() if len(tabs[curTab].views) > 1 { v.splitNode.Delete() diff --git a/cmd/micro/messenger.go b/cmd/micro/messenger.go index 06774e3d..85ae5414 100644 --- a/cmd/micro/messenger.go +++ b/cmd/micro/messenger.go @@ -124,6 +124,35 @@ func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) { } } +// LetterPrompt gives the user a prompt and waits for a one letter response +func (m *Messenger) LetterPrompt(prompt string, responses ...rune) (rune, bool) { + m.Message(prompt) + + _, h := screen.Size() + for { + m.Clear() + m.Display() + screen.ShowCursor(Count(m.message), h-1) + screen.Show() + event := <-events + + switch e := event.(type) { + case *tcell.EventKey: + switch e.Key() { + case tcell.KeyRune: + for _, r := range responses { + if e.Rune() == r { + m.Reset() + return r, false + } + } + case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape: + return ' ', true + } + } + } +} + type Completion int const ( diff --git a/cmd/micro/view.go b/cmd/micro/view.go index b6743db8..cef69ac9 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -169,13 +169,13 @@ func (v *View) ScrollDown(n int) { // If there are unsaved changes, the user will be asked if the view can be closed // causing them to lose the unsaved changes // The message is what to print after saying "You have unsaved changes. " -func (v *View) CanClose(msg string) bool { +func (v *View) CanClose(msg string, responses ...rune) bool { if v.Buf.IsModified { - quit, canceled := messenger.Prompt("You have unsaved changes. "+msg, "Unsaved", NoCompletion) + char, canceled := messenger.LetterPrompt("You have unsaved changes. "+msg, responses...) if !canceled { - if strings.ToLower(quit) == "yes" || strings.ToLower(quit) == "y" { + if char == 'y' { return true - } else if strings.ToLower(quit) == "save" || strings.ToLower(quit) == "s" { + } else if char == 's' { v.Save(true) return true } @@ -217,7 +217,7 @@ func (v *View) CloseBuffer() { // ReOpen reloads the current buffer func (v *View) ReOpen() { - if v.CanClose("Continue? (yes, no, save) ") { + if v.CanClose("Continue? (y,n,s) ", 'y', 'n', 's') { screen.Clear() v.Buf.ReOpen() v.Relocate()