diff --git a/go.mod b/go.mod index 4bcb5e4..a273d99 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,8 @@ module kumoly.io/tools/kclock go 1.17 + +require ( + github.com/mattn/go-isatty v0.0.14 // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..cb37ebd --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go index b32668c..ec64c58 100644 --- a/main.go +++ b/main.go @@ -7,18 +7,23 @@ import ( "os/signal" "syscall" "time" + + "github.com/mattn/go-isatty" ) var ( Version = "0.0.0" Build = "alpha" + + local string + flagTick string + flagVer bool ) func main() { - var local string - var flagVer bool flag.StringVar(&local, "local", fmt.Sprint(time.Local), "set local manually") + flag.StringVar(&flagTick, "tick", "1s", "ticking interval") flag.BoolVar(&flagVer, "v", false, "show version") flag.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: kclock [options]\n") @@ -43,20 +48,37 @@ func main() { } func watch() { + interval, err := time.ParseDuration(flagTick) + if err != nil { + panic(err) + } + color := isatty.IsTerminal(os.Stdout.Fd()) + if !color { + color = isatty.IsCygwinTerminal(os.Stdout.Fd()) + } quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) start := time.Now() - next := time.Now().Truncate(time.Second).Add(time.Second) - <-time.After(time.Until(next)) - tick := time.Tick(time.Second) - fmt.Printf("\n") + <-time.After(time.Until(time.Now().Truncate(time.Second).Add(time.Second))) + tick := time.Tick(interval) + if color { + fmt.Printf("\n") + } for { - fmt.Printf("\r\033[1A\033[0K\033[92m%v\033[0m\n", time.Now().Truncate(time.Second)) + if color { + fmt.Printf("\r\033[1A\033[0K\033[32m%v\033[0m\n", time.Now().Truncate(time.Second)) + } else { + fmt.Printf("%v\n", time.Now().Truncate(time.Second)) + } select { case <-tick: case <-quit: - fmt.Printf("\r\033[0Ktime elapsed: \033[94m%v\033[0m\n", time.Since(start)) + if color { + fmt.Printf("\r\033[0Ktime elapsed: \033[34m%v\033[0m\n", time.Since(start)) + } else { + fmt.Printf("time elapsed: %v\n", time.Since(start)) + } return }