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