Skip to content

Commit c93d951

Browse files
Merge branch 'master' into dev
2 parents 70439ea + 9835676 commit c93d951

34 files changed

+939
-491
lines changed

cmd/micro/clean.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ package main
33
import (
44
"bufio"
55
"encoding/gob"
6+
"errors"
67
"fmt"
7-
"io/ioutil"
88
"os"
99
"path/filepath"
1010
"sort"
1111
"strings"
1212

1313
"github.com/zyedidia/micro/v2/internal/buffer"
1414
"github.com/zyedidia/micro/v2/internal/config"
15+
"github.com/zyedidia/micro/v2/internal/util"
1516
)
1617

1718
func shouldContinue() bool {
@@ -39,7 +40,16 @@ func CleanConfig() {
3940
}
4041

4142
fmt.Println("Cleaning default settings")
42-
config.WriteSettings(filepath.Join(config.ConfigDir, "settings.json"))
43+
44+
settingsFile := filepath.Join(config.ConfigDir, "settings.json")
45+
err := config.WriteSettings(settingsFile)
46+
if err != nil {
47+
if errors.Is(err, util.ErrOverwrite) {
48+
fmt.Println(err.Error())
49+
} else {
50+
fmt.Println("Error writing settings.json file: " + err.Error())
51+
}
52+
}
4353

4454
// detect unused options
4555
var unusedOptions []string
@@ -67,16 +77,20 @@ func CleanConfig() {
6777
fmt.Printf("%s (value: %v)\n", s, config.GlobalSettings[s])
6878
}
6979

70-
fmt.Printf("These options will be removed from %s\n", filepath.Join(config.ConfigDir, "settings.json"))
80+
fmt.Printf("These options will be removed from %s\n", settingsFile)
7181

7282
if shouldContinue() {
7383
for _, s := range unusedOptions {
7484
delete(config.GlobalSettings, s)
7585
}
7686

77-
err := config.OverwriteSettings(filepath.Join(config.ConfigDir, "settings.json"))
87+
err := config.OverwriteSettings(settingsFile)
7888
if err != nil {
79-
fmt.Println("Error writing settings.json file: " + err.Error())
89+
if errors.Is(err, util.ErrOverwrite) {
90+
fmt.Println(err.Error())
91+
} else {
92+
fmt.Println("Error overwriting settings.json file: " + err.Error())
93+
}
8094
}
8195

8296
fmt.Println("Removed unused options")
@@ -85,12 +99,13 @@ func CleanConfig() {
8599
}
86100

87101
// detect incorrectly formatted buffer/ files
88-
files, err := ioutil.ReadDir(filepath.Join(config.ConfigDir, "buffers"))
102+
buffersPath := filepath.Join(config.ConfigDir, "buffers")
103+
files, err := os.ReadDir(buffersPath)
89104
if err == nil {
90105
var badFiles []string
91106
var buffer buffer.SerializedBuffer
92107
for _, f := range files {
93-
fname := filepath.Join(config.ConfigDir, "buffers", f.Name())
108+
fname := filepath.Join(buffersPath, f.Name())
94109
file, e := os.Open(fname)
95110

96111
if e == nil {
@@ -105,9 +120,9 @@ func CleanConfig() {
105120
}
106121

107122
if len(badFiles) > 0 {
108-
fmt.Printf("Detected %d files with an invalid format in %s\n", len(badFiles), filepath.Join(config.ConfigDir, "buffers"))
123+
fmt.Printf("Detected %d files with an invalid format in %s\n", len(badFiles), buffersPath)
109124
fmt.Println("These files store cursor and undo history.")
110-
fmt.Printf("Removing badly formatted files in %s\n", filepath.Join(config.ConfigDir, "buffers"))
125+
fmt.Printf("Removing badly formatted files in %s\n", buffersPath)
111126

112127
if shouldContinue() {
113128
removed := 0

cmd/micro/debug.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func (NullWriter) Write(data []byte) (n int, err error) {
1818
// InitLog sets up the debug log system for micro if it has been enabled by compile-time variables
1919
func InitLog() {
2020
if util.Debug == "ON" {
21-
f, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
21+
f, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, util.FileMode)
2222
if err != nil {
2323
log.Fatalf("error opening file: %v", err)
2424
}

cmd/micro/micro.go

Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import (
44
"flag"
55
"fmt"
66
"io"
7-
"io/ioutil"
87
"log"
98
"os"
109
"os/signal"
10+
"path/filepath"
1111
"regexp"
1212
"runtime"
1313
"runtime/pprof"
@@ -99,7 +99,7 @@ func InitFlags() {
9999
fmt.Println("Version:", util.Version)
100100
fmt.Println("Commit hash:", util.CommitHash)
101101
fmt.Println("Compiled on", util.CompileDate)
102-
os.Exit(0)
102+
exit(0)
103103
}
104104

105105
if *flagOptions {
@@ -115,7 +115,7 @@ func InitFlags() {
115115
fmt.Printf("-%s value\n", k)
116116
fmt.Printf(" \tDefault value: '%v'\n", v)
117117
}
118-
os.Exit(0)
118+
exit(0)
119119
}
120120

121121
if util.Debug == "OFF" && *flagDebug {
@@ -136,7 +136,7 @@ func DoPluginFlags() {
136136
CleanConfig()
137137
}
138138

139-
os.Exit(0)
139+
exit(0)
140140
}
141141
}
142142

@@ -209,7 +209,7 @@ func LoadInput(args []string) []*buffer.Buffer {
209209
// Option 2
210210
// The input is not a terminal, so something is being piped in
211211
// and we should read from stdin
212-
input, err = ioutil.ReadAll(os.Stdin)
212+
input, err = io.ReadAll(os.Stdin)
213213
if err != nil {
214214
screen.TermMessage("Error reading from stdin: ", err)
215215
input = []byte{}
@@ -223,12 +223,55 @@ func LoadInput(args []string) []*buffer.Buffer {
223223
return buffers
224224
}
225225

226+
func checkBackup(name string) error {
227+
target := filepath.Join(config.ConfigDir, name)
228+
backup := util.AppendBackupSuffix(target)
229+
if info, err := os.Stat(backup); err == nil {
230+
input, err := os.ReadFile(backup)
231+
if err == nil {
232+
t := info.ModTime()
233+
msg := fmt.Sprintf(buffer.BackupMsg, target, t.Format("Mon Jan _2 at 15:04, 2006"), backup)
234+
choice := screen.TermPrompt(msg, []string{"r", "i", "a", "recover", "ignore", "abort"}, true)
235+
236+
if choice%3 == 0 {
237+
// recover
238+
err := os.WriteFile(target, input, util.FileMode)
239+
if err != nil {
240+
return err
241+
}
242+
return os.Remove(backup)
243+
} else if choice%3 == 1 {
244+
// delete
245+
return os.Remove(backup)
246+
} else if choice%3 == 2 {
247+
// abort
248+
return errors.New("Aborted")
249+
}
250+
}
251+
}
252+
return nil
253+
}
254+
255+
func exit(rc int) {
256+
for _, b := range buffer.OpenBuffers {
257+
if !b.Modified() {
258+
b.Fini()
259+
}
260+
}
261+
262+
if screen.Screen != nil {
263+
screen.Screen.Fini()
264+
}
265+
266+
os.Exit(rc)
267+
}
268+
226269
func main() {
227270
defer func() {
228271
if util.Stdout.Len() > 0 {
229272
fmt.Fprint(os.Stdout, util.Stdout.String())
230273
}
231-
os.Exit(0)
274+
exit(0)
232275
}()
233276

234277
var err error
@@ -256,6 +299,12 @@ func main() {
256299
config.InitRuntimeFiles(true)
257300
config.InitPlugins()
258301

302+
err = checkBackup("settings.json")
303+
if err != nil {
304+
screen.TermMessage(err)
305+
exit(1)
306+
}
307+
259308
err = config.ReadSettings()
260309
if err != nil {
261310
screen.TermMessage(err)
@@ -288,7 +337,7 @@ func main() {
288337
if err != nil {
289338
fmt.Println(err)
290339
fmt.Println("Fatal: Micro could not initialize a Screen.")
291-
os.Exit(1)
340+
exit(1)
292341
}
293342
m := clipboard.SetMethod(config.GetGlobalOption("clipboard").(string))
294343
clipErr := clipboard.Initialize(m)
@@ -307,7 +356,7 @@ func main() {
307356
for _, b := range buffer.OpenBuffers {
308357
b.Backup()
309358
}
310-
os.Exit(1)
359+
exit(1)
311360
}
312361
}()
313362

@@ -316,6 +365,12 @@ func main() {
316365
screen.TermMessage(err)
317366
}
318367

368+
err = checkBackup("bindings.json")
369+
if err != nil {
370+
screen.TermMessage(err)
371+
exit(1)
372+
}
373+
319374
action.InitBindings()
320375
action.InitCommands()
321376

@@ -434,41 +489,20 @@ func DoEvent() {
434489
}
435490
case f := <-timerChan:
436491
f()
492+
case b := <-buffer.BackupCompleteChan:
493+
b.RequestedBackup = false
437494
case <-sighup:
438-
for _, b := range buffer.OpenBuffers {
439-
if !b.Modified() {
440-
b.Fini()
441-
}
442-
}
443-
os.Exit(0)
495+
exit(0)
444496
case <-util.Sigterm:
445-
for _, b := range buffer.OpenBuffers {
446-
if !b.Modified() {
447-
b.Fini()
448-
}
449-
}
450-
451-
if screen.Screen != nil {
452-
screen.Screen.Fini()
453-
}
454-
os.Exit(0)
497+
exit(0)
455498
}
456499

457500
if e, ok := event.(*tcell.EventError); ok {
458501
log.Println("tcell event error: ", e.Error())
459502

460503
if e.Err() == io.EOF {
461504
// shutdown due to terminal closing/becoming inaccessible
462-
for _, b := range buffer.OpenBuffers {
463-
if !b.Modified() {
464-
b.Fini()
465-
}
466-
}
467-
468-
if screen.Screen != nil {
469-
screen.Screen.Fini()
470-
}
471-
os.Exit(0)
505+
exit(0)
472506
}
473507
return
474508
}

internal/action/actions.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,9 @@ func (h *BufPane) SaveAsCB(action string, callback func()) bool {
10021002
h.completeAction(action)
10031003
return
10041004
}
1005+
} else {
1006+
InfoBar.Error(err)
1007+
return
10051008
}
10061009
} else {
10071010
InfoBar.YNPrompt(
@@ -1038,7 +1041,6 @@ func (h *BufPane) saveBufToFile(filename string, action string, callback func())
10381041
if err != nil {
10391042
InfoBar.Error(err)
10401043
} else {
1041-
h.Buf.Path = filename
10421044
h.Buf.SetName(filename)
10431045
InfoBar.Message("Saved " + filename)
10441046
if callback != nil {
@@ -1064,7 +1066,6 @@ func (h *BufPane) saveBufToFile(filename string, action string, callback func())
10641066
InfoBar.Error(err)
10651067
}
10661068
} else {
1067-
h.Buf.Path = filename
10681069
h.Buf.SetName(filename)
10691070
InfoBar.Message("Saved " + filename)
10701071
if callback != nil {
@@ -1815,24 +1816,24 @@ func (h *BufPane) HalfPageDown() bool {
18151816

18161817
// ToggleDiffGutter turns the diff gutter off and on
18171818
func (h *BufPane) ToggleDiffGutter() bool {
1818-
if !h.Buf.Settings["diffgutter"].(bool) {
1819-
h.Buf.Settings["diffgutter"] = true
1819+
diffgutter := !h.Buf.Settings["diffgutter"].(bool)
1820+
h.Buf.SetOptionNative("diffgutter", diffgutter)
1821+
if diffgutter {
18201822
h.Buf.UpdateDiff()
18211823
InfoBar.Message("Enabled diff gutter")
18221824
} else {
1823-
h.Buf.Settings["diffgutter"] = false
18241825
InfoBar.Message("Disabled diff gutter")
18251826
}
18261827
return true
18271828
}
18281829

18291830
// ToggleRuler turns line numbers off and on
18301831
func (h *BufPane) ToggleRuler() bool {
1831-
if !h.Buf.Settings["ruler"].(bool) {
1832-
h.Buf.Settings["ruler"] = true
1832+
ruler := !h.Buf.Settings["ruler"].(bool)
1833+
h.Buf.SetOptionNative("ruler", ruler)
1834+
if ruler {
18331835
InfoBar.Message("Enabled ruler")
18341836
} else {
1835-
h.Buf.Settings["ruler"] = false
18361837
InfoBar.Message("Disabled ruler")
18371838
}
18381839
return true
@@ -1885,7 +1886,7 @@ func (h *BufPane) CommandMode() bool {
18851886

18861887
// ToggleOverwriteMode lets the user toggle the text overwrite mode
18871888
func (h *BufPane) ToggleOverwriteMode() bool {
1888-
h.isOverwriteMode = !h.isOverwriteMode
1889+
h.Buf.OverwriteMode = !h.Buf.OverwriteMode
18891890
return true
18901891
}
18911892

@@ -1938,7 +1939,7 @@ func (h *BufPane) Quit() bool {
19381939
}
19391940
}
19401941

1941-
if config.GlobalSettings["autosave"].(float64) > 0 {
1942+
if config.GlobalSettings["autosave"].(float64) > 0 && h.Buf.Path != "" {
19421943
// autosave on means we automatically save when quitting
19431944
h.SaveCB("Quit", func() {
19441945
h.ForceQuit()

0 commit comments

Comments
 (0)