randomedit/cmd/randomedit/main.go

102 lines
2.1 KiB
Go
Raw Normal View History

2018-09-24 05:53:13 +00:00
package main
import (
2020-02-15 16:46:58 +00:00
// "flag"
2018-09-24 05:53:13 +00:00
"fmt"
2020-02-15 16:46:58 +00:00
flag "github.com/spf13/pflag"
2018-09-24 05:53:13 +00:00
"log"
2020-02-15 16:46:58 +00:00
"math/rand"
2018-09-24 05:53:13 +00:00
"os"
2020-02-15 16:46:58 +00:00
"os/exec"
"path"
2018-09-24 05:53:13 +00:00
"path/filepath"
2020-02-15 16:46:58 +00:00
"time"
2018-09-24 05:53:13 +00:00
)
2020-02-15 16:46:58 +00:00
func findFiles(dir string, patterns []string) []string {
files := []string{}
err := filepath.Walk(dir, func(walkpath string, info os.FileInfo, err error) error {
2018-09-24 05:53:13 +00:00
if err != nil {
return err
}
2020-02-15 16:46:58 +00:00
for _, pattern := range patterns {
if match, _ := path.Match(pattern, path.Base(walkpath)); match {
// fmt.Printf("Pattern %s found %s\n", pattern, walkpath)
files = append(files, walkpath)
}
}
2018-09-24 05:53:13 +00:00
return nil
})
if err != nil {
2020-02-15 16:46:58 +00:00
log.Panic(err)
2018-09-24 05:53:13 +00:00
}
2020-02-15 16:46:58 +00:00
return files
}
func main() {
var directories []string
var patterns []string
2021-07-13 12:42:29 +00:00
var verbose bool
var editor string
2020-02-15 16:46:58 +00:00
flag.StringArrayVarP(&directories, "dir", "d", []string{"."}, "Look in given directory")
flag.StringArrayVarP(&patterns, "pattern", "p", []string{}, "Match given globbing pattern")
2021-07-13 12:42:29 +00:00
flag.StringVarP(&editor, "editor", "e", "", "Use given editor command")
flag.BoolVarP(&verbose, "verbose", "v", false, "Match given globbing pattern")
2020-02-15 16:46:58 +00:00
flag.Parse()
if len(patterns) < 1 {
patterns = []string{"*.txt", "*.md"}
}
// fmt.Printf("%#v\n", directories)
2021-07-13 12:42:29 +00:00
if len(editor) < 1 {
editor = os.Getenv("EDITOR")
}
2020-02-15 16:46:58 +00:00
// walk dirs & merge result
filesSet := map[string]int{}
for _, dir := range directories {
for _, file := range findFiles(dir, patterns) {
2021-07-13 12:42:29 +00:00
if verbose {
fmt.Printf("d: Found %s\n", file)
}
2020-02-15 16:46:58 +00:00
if _, ok := filesSet[file]; !ok {
filesSet[file] = 0
}
}
}
// extract keys
files := []string{}
for k := range filesSet {
2021-07-13 12:42:29 +00:00
if verbose {
fmt.Printf("d: #%d. %s\n", len(files), k)
}
2020-02-15 16:46:58 +00:00
files = append(files, k)
}
2021-07-13 12:42:29 +00:00
if verbose {
// fmt.Printf("d: List %+v\n", files)
fmt.Printf("d: List has %d entries\n", len(files))
}
2020-02-15 16:46:58 +00:00
if len(files) < 1 {
fmt.Println("No file found")
os.Exit(1)
}
rand.Seed(time.Now().UTC().UnixNano())
choice := rand.Intn(len(files))
2021-07-13 12:42:29 +00:00
if verbose {
fmt.Printf("d: Chosen entry n°%d\n", choice)
}
2020-02-15 16:46:58 +00:00
fmt.Printf("%s %s\n", editor, files[choice])
// Run editor
cmd := exec.Command(editor, files[choice])
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.Run()
2018-09-24 05:53:13 +00:00
}