-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
116 lines (98 loc) · 2.74 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"flag"
"fmt"
"os"
"os/exec"
"strings"
"syscall"
"github.com/iwat/qxargs/internal"
)
func checkedPrintln(a ...interface{}) {
if _, err := fmt.Fprintln(os.Stderr, a...); err != nil {
panic(err)
}
}
func init() {
flag.Usage = func() {
checkedPrintln("SYNOPSIS")
checkedPrintln(" ", os.Args[0], "[flags] command filters ...")
checkedPrintln(" ", os.Args[0], "[flags] command commandargs ... -- filters ...")
checkedPrintln()
checkedPrintln("DESCRIPTION")
checkedPrintln(" Execute command on the list of files that match the given filter.")
checkedPrintln()
checkedPrintln(" command The command to be executed with the matches files.")
checkedPrintln()
checkedPrintln(" filters There are 2 kinds of filters are supported, name filter and content filter.")
checkedPrintln(" Simple string will be treated as file name filter.")
checkedPrintln(" String with leading '?' will be treat as content filter.")
checkedPrintln(" Multiple filters will be treated as AND.")
checkedPrintln()
checkedPrintln("EXAMPLES")
checkedPrintln(" To execute vim on any file that has go in their name. ")
checkedPrintln()
checkedPrintln(" $", os.Args[0], " vim go")
checkedPrintln()
checkedPrintln(" To execute vim -p on any file that has go in their name. ")
checkedPrintln()
checkedPrintln(" $", os.Args[0], " vim -p -- go")
checkedPrintln()
checkedPrintln(" To execute vim -p on any file that has go in their name and has newGrepper in their contents. ")
checkedPrintln()
checkedPrintln(" $", os.Args[0], " vim -p -- go ?newGrepper")
flag.PrintDefaults()
}
}
func parseArgs() ([]string, []string) {
args := flag.Args()
if len(args) < 2 {
flag.Usage()
os.Exit(1)
}
dashNdx := -1
for i, arg := range args {
if arg == "--" {
dashNdx = i
break
}
}
var commandArgs []string
var queryArgs []string
if dashNdx == -1 {
commandArgs = []string{args[0]}
queryArgs = args[1:]
} else {
commandArgs = args[0:dashNdx]
queryArgs = args[dashNdx+1:]
}
return commandArgs, queryArgs
}
func main() {
flag.Parse()
commandArgs, queryArgs := parseArgs()
engine := internal.NewEngine()
results := engine.Query(queryArgs...)
if len(results) == 0 {
checkedPrintln("no files matched")
os.Exit(2)
}
console := newConsole(commandArgs, engine)
console.update(strings.Join(queryArgs, " "))
results, err := console.loop()
if err != nil {
panic(err)
}
if len(results) == 0 {
return
}
commandPath, err := exec.LookPath(commandArgs[0])
if err != nil {
panic(err)
}
commandArgs = append(commandArgs, results...)
err = syscall.Exec(commandPath, commandArgs, os.Environ())
if err != nil {
panic(err)
}
}