diff --git a/app.go b/app.go index 5ccab801..cb48386d 100644 --- a/app.go +++ b/app.go @@ -59,10 +59,8 @@ func newApp(ui *ui, nav *nav) *app { } func (app *app) quit() { - if gOpts.history { - if err := app.writeHistory(); err != nil { - log.Printf("writing history file: %s", err) - } + if err := app.writeHistory(); err != nil { + log.Printf("writing history file: %s", err) } if !gSingleMode { if err := remote(fmt.Sprintf("drop %d", gClientID)); err != nil { @@ -407,7 +405,7 @@ func (app *app) loop() { curr, err := app.nav.currFile() if err == nil { if d.path == app.nav.currDir().path { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } if d.path == curr.path { app.ui.dirPrev = d @@ -456,7 +454,7 @@ func (app *app) loop() { app.ui.draw(app.nav) case <-app.ticker.C: app.nav.renew() - app.ui.loadFile(app.nav, false) + app.ui.loadFile(app, false) app.ui.draw(app.nav) } } @@ -528,7 +526,7 @@ func (app *app) runShell(s string, args []string, prefix string) { anyKey() } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) switch prefix { case "%": diff --git a/doc.go b/doc.go index 86e0c421..8a38dcef 100644 --- a/doc.go +++ b/doc.go @@ -182,6 +182,7 @@ The following special shell commands are used to customize the behavior of lf wh delete pre-cd on-cd + on-select on-quit The following commands/keybindings are provided by default: @@ -877,6 +878,10 @@ This shell command can be defined to be executed before changing a directory. This shell command can be defined to be executed after changing a directory. + on-select + +This shell command can be defined to be executed after the selection changes. + on-quit This shell command can be defined to be executed before quit. diff --git a/docstring.go b/docstring.go index c0e933f8..599d30b9 100644 --- a/docstring.go +++ b/docstring.go @@ -187,6 +187,7 @@ lf when defined: delete pre-cd on-cd + on-select on-quit The following commands/keybindings are provided by default: @@ -945,6 +946,11 @@ directory. This shell command can be defined to be executed after changing a directory. + on-select + +This shell command can be defined to be executed after the selection +changes. + on-quit This shell command can be defined to be executed before quit. diff --git a/eval.go b/eval.go index af3671d1..ec716fd3 100644 --- a/eval.go +++ b/eval.go @@ -43,19 +43,19 @@ func (e *setExpr) eval(app *app, args []string) { app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "nodironly": gOpts.dironly = false app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "dironly!": gOpts.dironly = !gOpts.dironly app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "dirfirst": gOpts.sortType.option |= dirfirstSort app.nav.sort() @@ -75,7 +75,7 @@ func (e *setExpr) eval(app *app, args []string) { app.nav.height = app.ui.wins[0].h app.nav.regCache = make(map[string]*reg) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "nodrawbox": gOpts.drawbox = false app.ui.renew() @@ -83,7 +83,7 @@ func (e *setExpr) eval(app *app, args []string) { app.nav.height = app.ui.wins[0].h app.nav.regCache = make(map[string]*reg) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "drawbox!": gOpts.drawbox = !gOpts.drawbox app.ui.renew() @@ -91,46 +91,40 @@ func (e *setExpr) eval(app *app, args []string) { app.nav.height = app.ui.wins[0].h app.nav.regCache = make(map[string]*reg) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "globsearch": gOpts.globsearch = true app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "noglobsearch": gOpts.globsearch = false app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "globsearch!": gOpts.globsearch = !gOpts.globsearch app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "hidden": gOpts.sortType.option |= hiddenSort app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "nohidden": gOpts.sortType.option &= ^hiddenSort app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "hidden!": gOpts.sortType.option ^= hiddenSort app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) - case "history": - gOpts.history = true - case "nohistory": - gOpts.history = false - case "history!": - gOpts.history = !gOpts.history + app.ui.loadFile(app, true) case "icons": gOpts.icons = true case "noicons": @@ -141,17 +135,17 @@ func (e *setExpr) eval(app *app, args []string) { gOpts.ignorecase = true app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "noignorecase": gOpts.ignorecase = false app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "ignorecase!": gOpts.ignorecase = !gOpts.ignorecase app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "ignoredia": gOpts.ignoredia = true app.nav.sort() @@ -236,17 +230,17 @@ func (e *setExpr) eval(app *app, args []string) { gOpts.smartcase = true app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "nosmartcase": gOpts.smartcase = false app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "smartcase!": gOpts.smartcase = !gOpts.smartcase app.nav.sort() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "smartdia": gOpts.smartdia = true case "nosmartdia": @@ -338,7 +332,7 @@ func (e *setExpr) eval(app *app, args []string) { app.nav.sort() app.nav.position() app.ui.sort() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "ifs": gOpts.ifs = e.val case "info": @@ -383,7 +377,7 @@ func (e *setExpr) eval(app *app, args []string) { } gOpts.ratios = rats app.ui.wins = getWins(app.ui.screen) - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "shell": gOpts.shell = e.val case "shellflag": @@ -484,6 +478,12 @@ func onChdir(app *app) { } } +func onSelect(app *app) { + if cmd, ok := gOpts.cmds["on-select"]; ok { + cmd.eval(app, nil) + } +} + func splitKeys(s string) (keys []string) { for i := 0; i < len(s); { r, w := utf8.DecodeRuneInString(s[i:]) @@ -520,7 +520,7 @@ func update(app *app) { if _, err := app.nav.searchNext(); err != nil { app.ui.echoerrf("search: %s: %s", err, app.nav.search) } else if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case gOpts.incsearch && app.ui.cmdPrefix == "?": @@ -534,7 +534,7 @@ func update(app *app) { if _, err := app.nav.searchPrev(); err != nil { app.ui.echoerrf("search: %s: %s", err, app.nav.search) } else if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case gOpts.incfilter && app.ui.cmdPrefix == "filter: ": @@ -545,7 +545,7 @@ func update(app *app) { if err := app.nav.setFilter(strings.Split(filter, " ")); err != nil { app.ui.echoerrf("filter: %s", err) } else if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -570,7 +570,7 @@ func resetIncCmd(app *app) { dir.pos = app.nav.searchPos if dir.ind != app.nav.searchInd { dir.ind = app.nav.searchInd - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } else if gOpts.incfilter && app.ui.cmdPrefix == "filter: " { @@ -578,7 +578,7 @@ func resetIncCmd(app *app) { old := dir.ind app.nav.setFilter(app.nav.prevFilter) if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -612,7 +612,7 @@ func insert(app *app, arg string) { case 0: app.ui.echoerrf("find: pattern not found: %s", app.nav.find) case 1: - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) default: app.ui.cmdAccLeft = append(app.ui.cmdAccLeft, []rune(arg)...) @@ -627,7 +627,7 @@ func insert(app *app, arg string) { if moved, found := app.nav.findNext(); !found { app.ui.echoerrf("find: pattern not found: %s", app.nav.find) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -641,7 +641,7 @@ func insert(app *app, arg string) { case 0: app.ui.echoerrf("find-back: pattern not found: %s", app.nav.find) case 1: - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) default: app.ui.cmdAccLeft = append(app.ui.cmdAccLeft, []rune(arg)...) @@ -656,7 +656,7 @@ func insert(app *app, arg string) { if moved, found := app.nav.findPrev(); !found { app.ui.echoerrf("find-back: pattern not found: %s", app.nav.find) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -666,21 +666,21 @@ func insert(app *app, arg string) { normal(app) if arg == "y" { - if err := app.nav.del(app.ui); err != nil { + if err := app.nav.del(app); err != nil { app.ui.echoerrf("delete: %s", err) return } app.nav.unselect() if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("delete: %s", err) return } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case strings.HasPrefix(app.ui.cmdPrefix, "replace"): @@ -693,14 +693,14 @@ func insert(app *app, arg string) { } if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("rename: %s", err) return } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case strings.HasPrefix(app.ui.cmdPrefix, "create"): @@ -717,14 +717,14 @@ func insert(app *app, arg string) { } if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("rename: %s", err) return } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case app.ui.cmdPrefix == "mark-save: ": @@ -766,7 +766,7 @@ func insert(app *app, arg string) { app.ui.echoerrf("%s", err) return } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) if wd != path { @@ -805,7 +805,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.up(e.count) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "half-up": @@ -813,7 +813,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.up(e.count * app.nav.height / 2) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "page-up": @@ -821,7 +821,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.up(e.count * app.nav.height) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "scroll-up": @@ -829,7 +829,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.scrollUp(e.count) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "down": @@ -837,7 +837,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.down(e.count) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "half-down": @@ -845,7 +845,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.down(e.count * app.nav.height / 2) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "page-down": @@ -853,7 +853,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.down(e.count * app.nav.height) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "scroll-down": @@ -861,7 +861,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.scrollDown(e.count) { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "updir": @@ -876,7 +876,7 @@ func (e *callExpr) eval(app *app, args []string) { return } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) restartIncCmd(app) onChdir(app) @@ -898,7 +898,7 @@ func (e *callExpr) eval(app *app, args []string) { app.ui.echoerrf("opening directory: %s", err) return } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) restartIncCmd(app) onChdir(app) @@ -939,7 +939,7 @@ func (e *callExpr) eval(app *app, args []string) { for i := 0; i < e.count; i++ { app.nav.cdJumpListPrev() } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) restartIncCmd(app) onChdir(app) @@ -949,7 +949,7 @@ func (e *callExpr) eval(app *app, args []string) { for i := 0; i < e.count; i++ { app.nav.cdJumpListNext() } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) restartIncCmd(app) onChdir(app) @@ -960,7 +960,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.top() { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "bottom": @@ -968,7 +968,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.bottom() { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "high": @@ -976,7 +976,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.high() { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "middle": @@ -984,7 +984,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.middle() { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "low": @@ -992,7 +992,7 @@ func (e *callExpr) eval(app *app, args []string) { return } if app.nav.low() { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "toggle": @@ -1135,11 +1135,11 @@ func (e *callExpr) eval(app *app, args []string) { if cmd, ok := gOpts.cmds["paste"]; ok { cmd.eval(app, e.args) - } else if err := app.nav.paste(app.ui); err != nil { + } else if err := app.nav.paste(app); err != nil { app.ui.echoerrf("paste: %s", err) return } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "delete": if !app.nav.init { @@ -1151,7 +1151,7 @@ func (e *callExpr) eval(app *app, args []string) { app.nav.unselect() if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("delete: %s", err) @@ -1175,7 +1175,7 @@ func (e *callExpr) eval(app *app, args []string) { app.ui.cmdPrefix = "delete " + strconv.Itoa(len(list)) + " items? [y/N] " } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "clear": if !app.nav.init { @@ -1208,13 +1208,13 @@ func (e *callExpr) eval(app *app, args []string) { app.nav.height = app.ui.wins[0].h app.nav.regCache = make(map[string]*reg) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "load": if !app.nav.init { return } app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) case "reload": if !app.nav.init { return @@ -1222,7 +1222,7 @@ func (e *callExpr) eval(app *app, args []string) { if err := app.nav.reload(); err != nil { app.ui.echoerrf("reload: %s", err) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "read": if app.ui.cmdPrefix == ">" { @@ -1289,7 +1289,7 @@ func (e *callExpr) eval(app *app, args []string) { } } if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "find-prev": @@ -1306,7 +1306,7 @@ func (e *callExpr) eval(app *app, args []string) { } } if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "search": @@ -1346,14 +1346,14 @@ func (e *callExpr) eval(app *app, args []string) { if moved, err := app.nav.searchPrev(); err != nil { app.ui.echoerrf("search-back: %s: %s", err, app.nav.search) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } else { if moved, err := app.nav.searchNext(); err != nil { app.ui.echoerrf("search: %s: %s", err, app.nav.search) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -1367,14 +1367,14 @@ func (e *callExpr) eval(app *app, args []string) { if moved, err := app.nav.searchNext(); err != nil { app.ui.echoerrf("search-back: %s: %s", err, app.nav.search) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } else { if moved, err := app.nav.searchPrev(); err != nil { app.ui.echoerrf("search: %s: %s", err, app.nav.search) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } } @@ -1404,7 +1404,7 @@ func (e *callExpr) eval(app *app, args []string) { if err := app.nav.setFilter(e.args); err != nil { app.ui.echoerrf("filter: %s", err) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "mark-save": if app.ui.cmdPrefix == ">" { @@ -1434,7 +1434,7 @@ func (e *callExpr) eval(app *app, args []string) { cmd.eval(app, e.args) if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("rename: %s", err) @@ -1454,7 +1454,7 @@ func (e *callExpr) eval(app *app, args []string) { app.ui.cmdPrefix = "rename: " app.ui.cmdAccLeft = append(app.ui.cmdAccLeft, []rune(curr.Name())...) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "sync": if err := app.nav.sync(); err != nil { @@ -1494,7 +1494,7 @@ func (e *callExpr) eval(app *app, args []string) { return } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) if wd != path { @@ -1534,7 +1534,7 @@ func (e *callExpr) eval(app *app, args []string) { return } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) if wd != path { @@ -1773,7 +1773,7 @@ func (e *callExpr) eval(app *app, args []string) { if _, err := app.nav.searchNext(); err != nil { app.ui.echoerrf("search: %s: %s", err, app.nav.search) } else if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "?": @@ -1789,7 +1789,7 @@ func (e *callExpr) eval(app *app, args []string) { if _, err := app.nav.searchPrev(); err != nil { app.ui.echoerrf("search-back: %s: %s", err, app.nav.search) } else if old != dir.ind { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "filter: ": @@ -1798,14 +1798,14 @@ func (e *callExpr) eval(app *app, args []string) { if err := app.nav.setFilter(strings.Split(s, " ")); err != nil { app.ui.echoerrf("filter: %s", err) } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) case "find: ": app.ui.cmdPrefix = "" if moved, found := app.nav.findNext(); !found { app.ui.echoerrf("find: pattern not found: %s", app.nav.find) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "find-back: ": @@ -1813,7 +1813,7 @@ func (e *callExpr) eval(app *app, args []string) { if moved, found := app.nav.findPrev(); !found { app.ui.echoerrf("find-back: pattern not found: %s", app.nav.find) } else if moved { - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } case "rename: ": @@ -1865,7 +1865,7 @@ func (e *callExpr) eval(app *app, args []string) { if gSingleMode { app.nav.renew() - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { app.ui.echoerrf("rename: %s", err) @@ -1873,7 +1873,7 @@ func (e *callExpr) eval(app *app, args []string) { } } - app.ui.loadFile(app.nav, true) + app.ui.loadFile(app, true) app.ui.loadFileInfo(app.nav) } default: diff --git a/lf.1 b/lf.1 index 77c58d18..eed3c49e 100644 --- a/lf.1 +++ b/lf.1 @@ -205,6 +205,7 @@ The following special shell commands are used to customize the behavior of lf wh delete pre-cd on-cd + on-select on-quit .EE .PP @@ -1081,6 +1082,12 @@ This shell command can be defined to be executed before changing a directory. .PP This shell command can be defined to be executed after changing a directory. .PP +.EX + on-select +.EE +.PP +This shell command can be defined to be executed after the selection changes. +.PP .EX on-quit .EE diff --git a/nav.go b/nav.go index 00ed77df..8ec84994 100644 --- a/nav.go +++ b/nav.go @@ -1084,20 +1084,20 @@ func (nav *nav) save(cp bool) error { return nil } -func (nav *nav) copyAsync(ui *ui, srcs []string, dstDir string) { +func (nav *nav) copyAsync(app *app, srcs []string, dstDir string) { echo := &callExpr{"echoerr", []string{""}, 1} _, err := os.Stat(dstDir) if os.IsNotExist(err) { echo.args[0] = err.Error() - ui.exprChan <- echo + app.ui.exprChan <- echo return } total, err := copySize(srcs) if err != nil { echo.args[0] = err.Error() - ui.exprChan <- echo + app.ui.exprChan <- echo return } @@ -1117,7 +1117,7 @@ loop: } errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } @@ -1125,27 +1125,27 @@ loop: if gSingleMode { nav.renew() - ui.loadFile(nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } if errCount == 0 { - ui.exprChan <- &callExpr{"echo", []string{"\033[0;32mCopied successfully\033[0m"}, 1} + app.ui.exprChan <- &callExpr{"echo", []string{"\033[0;32mCopied successfully\033[0m"}, 1} } } -func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { +func (nav *nav) moveAsync(app *app, srcs []string, dstDir string) { echo := &callExpr{"echoerr", []string{""}, 1} _, err := os.Stat(dstDir) if os.IsNotExist(err) { echo.args[0] = err.Error() - ui.exprChan <- echo + app.ui.exprChan <- echo return } @@ -1159,7 +1159,7 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { if err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo continue } @@ -1169,7 +1169,7 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { if os.SameFile(srcStat, dstStat) { errCount++ echo.args[0] = fmt.Sprintf("[%d] rename %s %s: source and destination are the same file", errCount, src, dst) - ui.exprChan <- echo + app.ui.exprChan <- echo continue } else if !os.IsNotExist(err) { var newPath string @@ -1185,7 +1185,7 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { total, err := copySize([]string{src}) if err != nil { echo.args[0] = err.Error() - ui.exprChan <- echo + app.ui.exprChan <- echo continue } @@ -1205,7 +1205,7 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { } errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } @@ -1215,13 +1215,13 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { if err := os.RemoveAll(src); err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } } else { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } } @@ -1230,21 +1230,21 @@ func (nav *nav) moveAsync(ui *ui, srcs []string, dstDir string) { if gSingleMode { nav.renew() - ui.loadFile(nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } if errCount == 0 { - ui.exprChan <- &callExpr{"echo", []string{"\033[0;32mMoved successfully\033[0m"}, 1} + app.ui.exprChan <- &callExpr{"echo", []string{"\033[0;32mMoved successfully\033[0m"}, 1} } } -func (nav *nav) paste(ui *ui) error { +func (nav *nav) paste(app *app) error { srcs, cp, err := loadFiles() if err != nil { return err @@ -1257,9 +1257,9 @@ func (nav *nav) paste(ui *ui) error { dstDir := nav.currDir().path if cp { - go nav.copyAsync(ui, srcs, dstDir) + go nav.copyAsync(app, srcs, dstDir) } else { - go nav.moveAsync(ui, srcs, dstDir) + go nav.moveAsync(app, srcs, dstDir) if err := saveFiles(nil, false); err != nil { return fmt.Errorf("clearing copy/cut buffer: %s", err) } @@ -1278,7 +1278,7 @@ func (nav *nav) paste(ui *ui) error { return nil } -func (nav *nav) del(ui *ui) error { +func (nav *nav) del(app *app) error { list, err := nav.currFileOrSelections() if err != nil { return err @@ -1296,7 +1296,7 @@ func (nav *nav) del(ui *ui) error { if err := os.RemoveAll(path); err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } @@ -1304,12 +1304,12 @@ func (nav *nav) del(ui *ui) error { if gSingleMode { nav.renew() - ui.loadFile(nav, true) + app.ui.loadFile(app, true) } else { if err := remote("send load"); err != nil { errCount++ echo.args[0] = fmt.Sprintf("[%d] %s", errCount, err) - ui.exprChan <- echo + app.ui.exprChan <- echo } } }() diff --git a/ui.go b/ui.go index e2872352..984681db 100644 --- a/ui.go +++ b/ui.go @@ -486,6 +486,7 @@ type ui struct { keyCount []rune styles styleMap icons iconMap + currentFile string } func getWidths(wtot int) []int { @@ -548,6 +549,7 @@ func newUI(screen tcell.Screen) *ui { evChan: make(chan tcell.Event, 1000), styles: parseStyles(), icons: parseIcons(), + currentFile: "", menuSelected: -2, } @@ -632,28 +634,34 @@ type reg struct { lines []string } -func (ui *ui) loadFile(nav *nav, volatile bool) { - if !nav.init { +func (ui *ui) loadFile(app *app, volatile bool) { + if !app.nav.init { return } - curr, err := nav.currFile() + curr, err := app.nav.currFile() if err != nil { return } + if curr.path == ui.currentFile { + return + } + ui.currentFile = curr.path + onSelect(app) + if !gOpts.preview { return } if volatile { - nav.previewChan <- "" + app.nav.previewChan <- "" } if curr.IsDir() { - ui.dirPrev = nav.loadDir(curr.path) + ui.dirPrev = app.nav.loadDir(curr.path) } else if curr.Mode().IsRegular() { - ui.regPrev = nav.loadReg(curr.path, volatile) + ui.regPrev = app.nav.loadReg(curr.path, volatile) } }