glob-select implementation (#184)

* glob-select logical implementation

* documentation

* indentation

* indentation

* indentation

* save

* merge glob selects

* check if selected before toggling

* glob-unselect

* identation ...

* return early
This commit is contained in:
Juris Arturs Majors 2019-06-20 17:17:47 +02:00 committed by gokcehan
parent eb8e516cfb
commit bf39c7c63b
6 changed files with 53 additions and 0 deletions

View File

@ -58,6 +58,8 @@ var (
"echoerr", "echoerr",
"cd", "cd",
"select", "select",
"glob-select",
"glob-unselect",
"source", "source",
"push", "push",
} }

2
doc.go
View File

@ -62,6 +62,8 @@ The following commands are provided by lf without default keybindings:
echoerr same as echomsg but red color echoerr same as echomsg but red color
cd change working directory to the argument cd change working directory to the argument
select change current file selection to the argument select change current file selection to the argument
glob-select select files that match the given glob
glob-unselect unselect files that match the given glob
source read the configuration file in the argument source read the configuration file in the argument
push simulate key pushes given in the argument push simulate key pushes given in the argument
delete remove the current file or selected file(s) delete remove the current file or selected file(s)

View File

@ -65,6 +65,8 @@ The following commands are provided by lf without default keybindings:
echoerr same as echomsg but red color echoerr same as echomsg but red color
cd change working directory to the argument cd change working directory to the argument
select change current file selection to the argument select change current file selection to the argument
glob-select select files that match the given glob
glob-unselect unselect files that match the given glob
source read the configuration file in the argument source read the configuration file in the argument
push simulate key pushes given in the argument push simulate key pushes given in the argument
delete remove the current file or selected file(s) delete remove the current file or selected file(s)

21
eval.go
View File

@ -833,6 +833,27 @@ func (e *callExpr) eval(app *app, args []string) {
if wd != path { if wd != path {
app.nav.marks["'"] = wd app.nav.marks["'"] = wd
} }
case "glob-select":
if len(e.args) != 1 {
app.ui.echoerr("glob-select: requires a pattern to match")
return
}
if err := app.nav.globSel(e.args[0], false); err != nil {
app.ui.echoerrf("%s", err)
return
}
case "glob-unselect":
if len(e.args) != 1 {
app.ui.echoerr("glob-unselect: requires a pattern to match")
return
}
if err := app.nav.globSel(e.args[0], true); err != nil {
app.ui.echoerrf("%s", err)
return
}
case "source": case "source":
if len(e.args) != 1 { if len(e.args) != 1 {
app.ui.echoerr("source: requires an argument") app.ui.echoerr("source: requires an argument")

2
lf.1
View File

@ -74,6 +74,8 @@ The following commands are provided by lf without default keybindings:
echoerr same as echomsg but red color echoerr same as echomsg but red color
cd change working directory to the argument cd change working directory to the argument
select change current file selection to the argument select change current file selection to the argument
glob-select select files that match the given glob
glob-unselect unselect files that match the given glob
source read the configuration file in the argument source read the configuration file in the argument
push simulate key pushes given in the argument push simulate key pushes given in the argument
delete remove the current file or selected file(s) delete remove the current file or selected file(s)

24
nav.go
View File

@ -794,6 +794,30 @@ func (nav *nav) sel(path string) error {
return nil return nil
} }
func (nav *nav) globSel(pattern string, invert bool) error {
curDir := nav.currDir()
anyMatches := false
for i := 0; i < len(curDir.files); i++ {
match, err := filepath.Match(pattern, curDir.files[i].Name())
if err != nil {
return fmt.Errorf("glob-select: %s", err)
}
if match {
anyMatches = true
fpath := filepath.Join(curDir.path, curDir.files[i].Name())
if _, ok := nav.selections[fpath]; ok == invert {
nav.toggleSelection(fpath)
}
}
}
if !anyMatches {
return fmt.Errorf("glob-select: pattern not found: %s", pattern)
}
return nil
}
func findMatch(name, pattern string) bool { func findMatch(name, pattern string) bool {
if gOpts.ignorecase { if gOpts.ignorecase {
lpattern := strings.ToLower(pattern) lpattern := strings.ToLower(pattern)