package main import ( "flag" "fmt" "os" "os/signal" "syscall" "time" "github.com/mattn/go-isatty" ) var ( Version = "0.0.0" Build = "alpha" local string flagTick string flagVer bool ) func main() { 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") flag.PrintDefaults() } flag.Parse() if flagVer { fmt.Printf("%v - %v\n", Version, Build) return } l, err := time.LoadLocation(local) if err != nil { panic(err) } time.Local = l watch() } 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() <-time.After(time.Until(time.Now().Truncate(time.Second).Add(time.Second))) tick := time.Tick(interval) if color { fmt.Printf("\n") } for { 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: 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 } } }