screenWasNil := screen == nil
if !screenWasNil {
screen.Fini()
+ screen = nil
}
fmt.Println(msg...)
gutterMessage bool
}
-func (m *Messenger) addLog(msg string) {
+func (m *Messenger) AddLog(msg string) {
buffer := m.getBuffer()
- buffer.Insert(buffer.End(), msg+"\n")
+ buffer.insert(buffer.End(), []byte(msg+"\n"))
+ buffer.Cursor.Loc = buffer.End()
+ buffer.Cursor.Relocate()
}
func (m *Messenger) getBuffer() *Buffer {
if m.log == nil {
- m.log = NewBuffer([]byte{}, "")
- m.log.Name = "Log"
+ m.log = NewBufferFromString("", "")
+ m.log.name = "Log"
}
return m.log
}
// Message sends a message to the user
func (m *Messenger) Message(msg ...interface{}) {
- buf := new(bytes.Buffer)
- fmt.Fprint(buf, msg...)
- m.message = buf.String()
- m.style = defStyle
+ displayMessage := fmt.Sprint(msg...)
+ // only display a new message if there isn't an active prompt
+ // this is to prevent overwriting an existing prompt to the user
+ if m.hasPrompt == false {
+ // if there is no active prompt then style and display the message as normal
+ m.message = displayMessage
- if _, ok := colorscheme["message"]; ok {
- m.style = colorscheme["message"]
+ m.style = defStyle
+
+ if _, ok := colorscheme["message"]; ok {
+ m.style = colorscheme["message"]
+ }
+
+ m.hasMessage = true
}
- m.addLog(m.message)
- m.hasMessage = true
+ // add the message to the log regardless of active prompts
+ m.AddLog(displayMessage)
}
// Error sends an error message to the user
func (m *Messenger) Error(msg ...interface{}) {
buf := new(bytes.Buffer)
fmt.Fprint(buf, msg...)
- m.message = buf.String()
- m.style = defStyle.
- Foreground(tcell.ColorBlack).
- Background(tcell.ColorMaroon)
- if _, ok := colorscheme["error-message"]; ok {
- m.style = colorscheme["error-message"]
+ // only display a new message if there isn't an active prompt
+ // this is to prevent overwriting an existing prompt to the user
+ if m.hasPrompt == false {
+ // if there is no active prompt then style and display the message as normal
+ m.message = buf.String()
+ m.style = defStyle.
+ Foreground(tcell.ColorBlack).
+ Background(tcell.ColorMaroon)
+
+ if _, ok := colorscheme["error-message"]; ok {
+ m.style = colorscheme["error-message"]
+ }
+ m.hasMessage = true
}
- m.addLog(m.message)
+ // add the message to the log regardless of active prompts
+ m.AddLog(buf.String())
+}
+
+func (m *Messenger) PromptText(msg ...interface{}) {
+ displayMessage := fmt.Sprint(msg...)
+ // if there is no active prompt then style and display the message as normal
+ m.message = displayMessage
+
+ m.style = defStyle
+
+ if _, ok := colorscheme["message"]; ok {
+ m.style = colorscheme["message"]
+ }
+
m.hasMessage = true
+ // add the message to the log regardless of active prompts
+ m.AddLog(displayMessage)
}
// YesNoPrompt asks the user a yes or no question (waits for y or n) and returns the result
func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) {
m.hasPrompt = true
- m.Message(prompt)
+ m.PromptText(prompt)
_, h := screen.Size()
for {
case *tcell.EventKey:
switch e.Key() {
case tcell.KeyRune:
- if e.Rune() == 'y' {
- m.addLog("\t--> y")
+ if e.Rune() == 'y' || e.Rune() == 'Y' {
+ m.AddLog("\t--> y")
m.hasPrompt = false
return true, false
- } else if e.Rune() == 'n' {
- m.addLog("\t--> n")
+ } else if e.Rune() == 'n' || e.Rune() == 'N' {
+ m.AddLog("\t--> n")
m.hasPrompt = false
return false, false
}
case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape:
- m.addLog("\t--> (cancel)")
+ m.AddLog("\t--> (cancel)")
+ m.Clear()
+ m.Reset()
m.hasPrompt = false
return false, true
}
// LetterPrompt gives the user a prompt and waits for a one letter response
func (m *Messenger) LetterPrompt(prompt string, responses ...rune) (rune, bool) {
m.hasPrompt = true
- m.Message(prompt)
+ m.PromptText(prompt)
_, h := screen.Size()
for {
case tcell.KeyRune:
for _, r := range responses {
if e.Rune() == r {
- m.addLog("\t--> " + string(r))
+ m.AddLog("\t--> " + string(r))
m.Clear()
m.Reset()
m.hasPrompt = false
}
}
case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape:
- m.addLog("\t--> (cancel)")
+ m.AddLog("\t--> (cancel)")
m.Clear()
m.Reset()
m.hasPrompt = false
CommandCompletion
HelpCompletion
OptionCompletion
+ PluginCmdCompletion
+ PluginNameCompletion
)
// Prompt sends the user a message and waits for a response to be typed in
// This function blocks the main loop while waiting for input
-func (m *Messenger) Prompt(prompt, historyType string, completionTypes ...Completion) (string, bool) {
+func (m *Messenger) Prompt(prompt, placeholder, historyType string, completionTypes ...Completion) (string, bool) {
m.hasPrompt = true
- m.Message(prompt)
+ m.PromptText(prompt)
if _, ok := m.history[historyType]; !ok {
m.history[historyType] = []string{""}
} else {
}
m.historyNum = len(m.history[historyType]) - 1
- response, canceled := "", true
+ response, canceled := placeholder, true
+ m.response = response
+ m.cursorx = Count(placeholder)
RedrawAll()
for m.hasPrompt {
switch e.Key() {
case tcell.KeyCtrlQ, tcell.KeyCtrlC, tcell.KeyEscape:
// Cancel
- m.addLog("\t--> (cancel)")
+ m.AddLog("\t--> (cancel)")
m.hasPrompt = false
case tcell.KeyEnter:
// User is done entering their response
- m.addLog("\t--> " + m.response)
+ m.AddLog("\t--> " + m.response)
m.hasPrompt = false
response, canceled = m.response, false
m.history[historyType][len(m.history[historyType])-1] = response
chosen, suggestions = HelpComplete(currentArg)
} else if completionType == OptionCompletion {
chosen, suggestions = OptionComplete(currentArg)
+ } else if completionType == PluginCmdCompletion {
+ chosen, suggestions = PluginCmdComplete(currentArg)
+ } else if completionType == PluginNameCompletion {
+ chosen, suggestions = PluginNameComplete(currentArg)
} else if completionType < NoCompletion {
chosen, suggestions = PluginComplete(completionType, currentArg)
}