implement editor rename

This commit is contained in:
itchyny 2020-01-08 00:55:52 +09:00
parent 949c92af35
commit 4f29c7e2ed
3 changed files with 71 additions and 2 deletions

View file

@ -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)
}

5
go.mod
View file

@ -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
)

11
go.sum
View file

@ -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=