From 4f29c7e2ed9e517790548c713a98cd4f1bb65eb5 Mon Sep 17 00:00:00 2001 From: itchyny Date: Wed, 8 Jan 2020 00:55:52 +0900 Subject: [PATCH] implement editor rename --- cmd/mmv/main.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++- go.mod | 5 ++++- go.sum | 11 ++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/cmd/mmv/main.go b/cmd/mmv/main.go index bd889b0..cae0320 100644 --- a/cmd/mmv/main.go +++ b/cmd/mmv/main.go @@ -1,10 +1,16 @@ package main import ( + "errors" "flag" "fmt" + "io/ioutil" "os" + "os/exec" "runtime" + "strings" + + "github.com/mattn/go-tty" "github.com/itchyny/mmv" ) @@ -57,9 +63,58 @@ Options: fmt.Printf("usage: %s files ...\n", name) return exitCodeErr } - if err := mmv.Rename(nil); err != nil { + if err := rename(args); err != nil { fmt.Fprintf(os.Stderr, "%s: %s\n", name, err) return exitCodeErr } return exitCodeOK } + +func rename(args []string) error { + f, err := ioutil.TempFile("", name+"-") + if err != nil { + return err + } + defer func() { + f.Close() + os.Remove(f.Name()) + }() + for _, arg := range args { + f.WriteString(arg) + f.WriteString("\n") + } + editor := os.Getenv("EDITOR") + if editor != "" { + editor = "vi" + } + tty, err := tty.Open() + if err != nil { + return err + } + defer tty.Close() + cmd := exec.Command(editor, f.Name()) + cmd.Stdin = tty.Input() + cmd.Stdout = tty.Output() + cmd.Stderr = tty.Output() + if err := cmd.Run(); err != nil { + return err + } + if err := f.Close(); err != nil { + return err + } + cnt, err := ioutil.ReadFile(f.Name()) + if err != nil { + return err + } + got := strings.Split(strings.TrimSpace(string(cnt)), "\n") + if len(args) != len(got) { + return errors.New("do not delete or add lines") + } + files := make(map[string]string, len(args)) + for i, src := range args { + if dst := got[i]; src != dst { + files[src] = dst + } + } + return mmv.Rename(files) +} diff --git a/go.mod b/go.mod index fbb76ee..567b71d 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/itchyny/mmv go 1.13 -require github.com/stretchr/testify v1.4.0 +require ( + github.com/mattn/go-tty v0.0.3 + github.com/stretchr/testify v1.4.0 +) diff --git a/go.sum b/go.sum index e863f51..6aab83f 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,21 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= +github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=