diff --git a/cmd/micro/action/actions.go b/cmd/micro/action/actions.go index 9be172c4..dc7d32d7 100644 --- a/cmd/micro/action/actions.go +++ b/cmd/micro/action/actions.go @@ -12,6 +12,7 @@ import ( "github.com/zyedidia/micro/cmd/micro/config" "github.com/zyedidia/micro/cmd/micro/screen" "github.com/zyedidia/micro/cmd/micro/shell" + "github.com/zyedidia/micro/cmd/micro/shellwords" "github.com/zyedidia/micro/cmd/micro/util" "github.com/zyedidia/tcell" ) @@ -540,15 +541,62 @@ func (h *BufHandler) SaveAll() bool { // Save the buffer to disk func (h *BufHandler) Save() bool { - h.Buf.Save() + // If this is an empty buffer, ask for a filename + if h.Buf.Path == "" { + h.SaveAs() + } else { + h.saveBufToFile(h.Buf.Path) + } + return false } // SaveAs saves the buffer to disk with the given name func (h *BufHandler) SaveAs() bool { + InfoBar.Prompt("Filename: ", "", "Save", nil, func(resp string, canceled bool) { + if !canceled { + // the filename might or might not be quoted, so unquote first then join the strings. + args, err := shellwords.Split(resp) + filename := strings.Join(args, " ") + if err != nil { + InfoBar.Error("Error parsing arguments: ", err) + return + } + h.saveBufToFile(filename) + + } + }) return false } +// This function saves the buffer to `filename` and changes the buffer's path and name +// to `filename` if the save is successful +func (h *BufHandler) saveBufToFile(filename string) { + err := h.Buf.SaveAs(filename) + if err != nil { + if strings.HasSuffix(err.Error(), "permission denied") { + InfoBar.YNPrompt("Permission denied. Do you want to save this file using sudo? (y,n)", func(yes, canceled bool) { + if yes && !canceled { + err = h.Buf.SaveAsWithSudo(filename) + if err != nil { + InfoBar.Error(err) + } else { + h.Buf.Path = filename + h.Buf.SetName(filename) + InfoBar.Message("Saved " + filename) + } + } + }) + } else { + InfoBar.Error(err) + } + } else { + h.Buf.Path = filename + h.Buf.SetName(filename) + InfoBar.Message("Saved " + filename) + } +} + // Find opens a prompt and searches forward for the input func (h *BufHandler) Find() bool { InfoBar.Prompt("Find: ", "", "Find", func(resp string) {