add builtin 'select' command to change selection

This commit is contained in:
Gokcehan 2018-03-27 20:47:17 +03:00
parent 32d729eac1
commit 4f05975e77
5 changed files with 39 additions and 0 deletions

View File

@ -46,6 +46,7 @@ var (
"sync",
"echo",
"cd",
"select",
"push",
}

1
doc.go
View File

@ -47,6 +47,7 @@ The following commands are provided by lf without default keybindings:
sync synchronizes yanked/deleted files with server
echo prints its arguments to the message line
cd changes working directory to its argument
select changes current file selection to its argument
push simulate key pushes given in its argument
The following command line commands are provided by lf with default

View File

@ -51,6 +51,7 @@ The following commands are provided by lf without default keybindings:
sync synchronizes yanked/deleted files with server
echo prints its arguments to the message line
cd changes working directory to its argument
select changes current file selection to its argument
push simulate key pushes given in its argument
The following command line commands are provided by lf with default

11
eval.go
View File

@ -387,6 +387,17 @@ func (e *callExpr) eval(app *app, args []string) {
}
app.ui.loadFile(app.nav)
app.ui.loadFileInfo(app.nav)
case "select":
if len(e.args) != 1 {
app.ui.print("select: requires an argument")
return
}
if err := app.nav.find(e.args[0]); err != nil {
app.ui.printf("%s", err)
return
}
app.ui.loadFile(app.nav)
app.ui.loadFileInfo(app.nav)
case "push":
if len(e.args) > 0 {
log.Println("pushing keys", e.args[0])

25
nav.go
View File

@ -260,6 +260,7 @@ func (nav *nav) getDirs(wd string) {
for curr, base := wd, ""; !isRoot(base); curr, base = filepath.Dir(curr), filepath.Base(curr) {
dir := nav.loadDir(curr)
dir.find(base, nav.height)
dirs = append(dirs, dir)
}
@ -618,6 +619,30 @@ func (nav *nav) cd(wd string) error {
return nil
}
func (nav *nav) find(path string) error {
lstat, err := os.Stat(path)
if err != nil {
return fmt.Errorf("select: %s", err)
}
dir := filepath.Dir(path)
if err := nav.cd(dir); err != nil {
return fmt.Errorf("select: %s", err)
}
base := filepath.Base(path)
last := nav.dirs[len(nav.dirs)-1]
if last.loading {
last.fi = append(last.fi, &file{FileInfo: lstat})
} else {
last.find(base, nav.height)
}
return nil
}
func match(pattern, name string) (matched bool, err error) {
if gOpts.ignorecase {
lpattern := strings.ToLower(pattern)