diff --git a/app.go b/app.go index 5255d3c7..45e0dbd2 100644 --- a/app.go +++ b/app.go @@ -45,7 +45,7 @@ func newApp(ui *ui, nav *nav) *app { nav: nav, ticker: new(time.Ticker), quitChan: quitChan, - watch: newWatch(nav.dirChan, nav.fileChan), + watch: newWatch(nav.dirChan, nav.fileChan, nav.delChan), } sigChan := make(chan os.Signal, 1) @@ -460,6 +460,9 @@ func (app *app) loop() { app.ui.loadFileInfo(app.nav) } app.ui.draw(app.nav) + case path := <-app.nav.delChan: + delete(app.nav.dirCache, path) + delete(app.nav.regCache, path) case ev := <-app.ui.evChan: e := app.ui.readEvent(ev, app.nav) if e == nil { diff --git a/eval.go b/eval.go index b11ff6d7..8e19cac3 100644 --- a/eval.go +++ b/eval.go @@ -1396,7 +1396,7 @@ func (e *callExpr) eval(app *app, args []string) { app.ui.loadFile(app, true) onRedraw(app) case "load": - if !app.nav.init { + if !app.nav.init || gOpts.watch { return } app.nav.renew() diff --git a/nav.go b/nav.go index 008466fd..592a8982 100644 --- a/nav.go +++ b/nav.go @@ -439,6 +439,7 @@ type nav struct { dirChan chan *dir regChan chan *reg fileChan chan *file + delChan chan string dirCache map[string]*dir regCache map[string]*reg saves map[string]bool @@ -585,6 +586,7 @@ func newNav(height int) *nav { dirChan: make(chan *dir), regChan: make(chan *reg), fileChan: make(chan *file), + delChan: make(chan string), dirCache: make(map[string]*dir), regCache: make(map[string]*reg), saves: make(map[string]bool), diff --git a/watch.go b/watch.go index 0f2b55ec..269a4636 100644 --- a/watch.go +++ b/watch.go @@ -2,6 +2,7 @@ package main import ( "log" + "os" "path/filepath" "time" @@ -18,9 +19,10 @@ type watch struct { updateTimer *time.Timer dirChan chan<- *dir fileChan chan<- *file + delChan chan<- string } -func newWatch(dirChan chan<- *dir, fileChan chan<- *file) *watch { +func newWatch(dirChan chan<- *dir, fileChan chan<- *file, delChan chan<- string) *watch { return &watch{ quit: make(chan struct{}), loads: make(map[string]bool), @@ -29,6 +31,7 @@ func newWatch(dirChan chan<- *dir, fileChan chan<- *file) *watch { updateTimer: time.NewTimer(0), dirChan: dirChan, fileChan: fileChan, + delChan: delChan, } } @@ -81,7 +84,14 @@ func (watch *watch) loop() { for { select { case ev := <-watch.events: - if ev.Has(fsnotify.Create) || ev.Has(fsnotify.Remove) || ev.Has(fsnotify.Rename) { + if ev.Has(fsnotify.Create) { + dir := filepath.Dir(ev.Name) + watch.addLoad(dir) + watch.addUpdate(dir) + } + + if ev.Has(fsnotify.Remove) || ev.Has(fsnotify.Rename) { + watch.delChan <- ev.Name dir := filepath.Dir(ev.Name) watch.addLoad(dir) watch.addUpdate(dir) @@ -92,6 +102,9 @@ func (watch *watch) loop() { } case <-watch.loadTimer.C: for path := range watch.loads { + if _, err := os.Lstat(path); err != nil { + continue + } dir := newDir(path) dir.sort() watch.dirChan <- dir @@ -99,6 +112,9 @@ func (watch *watch) loop() { watch.loads = make(map[string]bool) case <-watch.updateTimer.C: for path := range watch.updates { + if _, err := os.Lstat(path); err != nil { + continue + } watch.fileChan <- newFile(path) } watch.updates = make(map[string]bool)