]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/messenger.go
Don't print error message if history file doesn't exist
[micro.git] / cmd / micro / messenger.go
index 3fda5368fc092925c8c696c4fe963ee6058f514e..0d20603a2df05f026a30e5f4293631d50937ae8c 100644 (file)
@@ -3,10 +3,12 @@ package main
 import (
        "bufio"
        "bytes"
+       "encoding/gob"
        "fmt"
        "os"
        "strconv"
 
+       "github.com/mattn/go-runewidth"
        "github.com/zyedidia/clipboard"
        "github.com/zyedidia/tcell"
 )
@@ -69,9 +71,11 @@ type Messenger struct {
        gutterMessage bool
 }
 
-func (m *Messenger) AddLog(msg string) {
+// AddLog sends a message to the log view
+func (m *Messenger) AddLog(msg ...interface{}) {
+       logMessage := fmt.Sprint(msg...)
        buffer := m.getBuffer()
-       buffer.insert(buffer.End(), []byte(msg+"\n"))
+       buffer.insert(buffer.End(), []byte(logMessage+"\n"))
        buffer.Cursor.Loc = buffer.End()
        buffer.Cursor.Relocate()
 }
@@ -228,6 +232,7 @@ const (
        OptionCompletion
        PluginCmdCompletion
        PluginNameCompletion
+       OptionValueCompletion
 )
 
 // Prompt sends the user a message and waits for a response to be typed in
@@ -293,6 +298,10 @@ func (m *Messenger) Prompt(prompt, placeholder, historyType string, completionTy
                                        chosen, suggestions = HelpComplete(currentArg)
                                } else if completionType == OptionCompletion {
                                        chosen, suggestions = OptionComplete(currentArg)
+                               } else if completionType == OptionValueCompletion {
+                                       if currentArgNum-1 > 0 {
+                                               chosen, suggestions = OptionValueComplete(args[currentArgNum-1], currentArg)
+                                       }
                                } else if completionType == PluginCmdCompletion {
                                        chosen, suggestions = PluginCmdComplete(currentArg)
                                } else if completionType == PluginNameCompletion {
@@ -463,8 +472,10 @@ func (m *Messenger) Display() {
        if m.hasMessage {
                if m.hasPrompt || globalSettings["infobar"].(bool) {
                        runes := []rune(m.message + m.response)
+                       posx := 0
                        for x := 0; x < len(runes); x++ {
-                               screen.SetContent(x, h-1, runes[x], nil, m.style)
+                               screen.SetContent(posx, h-1, runes[x], nil, m.style)
+                               posx += runewidth.RuneWidth(runes[x])
                        }
                }
        }
@@ -475,6 +486,55 @@ func (m *Messenger) Display() {
        }
 }
 
+// LoadHistory attempts to load user history from configDir/buffers/history
+// into the history map
+// The savehistory option must be on
+func (m *Messenger) LoadHistory() {
+       if GetGlobalOption("savehistory").(bool) {
+               file, err := os.Open(configDir + "/buffers/history")
+               var decodedMap map[string][]string
+               if err == nil {
+                       decoder := gob.NewDecoder(file)
+                       err = decoder.Decode(&decodedMap)
+                       file.Close()
+
+                       if err != nil {
+                               m.Error("Error loading history:", err)
+                               return
+                       }
+               }
+
+               m.history = decodedMap
+       } else {
+               m.history = make(map[string][]string)
+       }
+}
+
+// SaveHistory saves the user's command history to configDir/buffers/history
+// only if the savehistory option is on
+func (m *Messenger) SaveHistory() {
+       if GetGlobalOption("savehistory").(bool) {
+               // Don't save history past 100
+               for k, v := range m.history {
+                       if len(v) > 100 {
+                               m.history[k] = v[0:100]
+                       }
+               }
+
+               file, err := os.Create(configDir + "/buffers/history")
+               if err == nil {
+                       encoder := gob.NewEncoder(file)
+
+                       err = encoder.Encode(m.history)
+                       if err != nil {
+                               m.Error("Error saving history:", err)
+                               return
+                       }
+                       file.Close()
+               }
+       }
+}
+
 // A GutterMessage is a message displayed on the side of the editor
 type GutterMessage struct {
        lineNum int