@@ -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 (" \t Default 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+
226269func 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 }
0 commit comments