diff options
Diffstat (limited to 'src/options.go')
-rw-r--r-- | src/options.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/options.go b/src/options.go index 983a7d3d..b2360a10 100644 --- a/src/options.go +++ b/src/options.go @@ -38,6 +38,7 @@ const usage = `usage: fzf [options] --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors --black Use black background --reverse Reverse orientation + --margin=MARGIN Screen margin (TRBL / TB,RL / T,RL,B / T,R,B,L) --cycle Enable cyclic scroll --no-hscroll Disable horizontal scroll --inline-info Display finder info inline with the query @@ -93,6 +94,10 @@ const ( byIndex ) +func defaultMargin() [4]string { + return [4]string{"0", "0", "0", "0"} +} + // Options stores the values of command-line options type Options struct { Mode Mode @@ -127,6 +132,7 @@ type Options struct { History *History Header []string HeaderLines int + Margin [4]string Version bool } @@ -171,6 +177,7 @@ func defaultOptions() *Options { History: nil, Header: make([]string, 0), HeaderLines: 0, + Margin: defaultMargin(), Version: false} } @@ -218,6 +225,14 @@ func atoi(str string) int { return num } +func atof(str string) float64 { + num, err := strconv.ParseFloat(str, 64) + if err != nil { + errorExit("not a valid number: " + str) + } + return num +} + func nextInt(args []string, i *int, message string) int { if len(args) > *i+1 { *i++ @@ -592,6 +607,48 @@ func readHeaderFile(filename string) []string { return strings.Split(strings.TrimSuffix(string(content), "\n"), "\n") } +func parseMargin(margin string) [4]string { + margins := strings.Split(margin, ",") + checked := func(str string) string { + if strings.HasSuffix(str, "%") { + val := atof(str[:len(str)-1]) + if val < 0 { + errorExit("margin must be non-negative") + } + if val > 100 { + errorExit("margin too large") + } + } else { + val := atoi(str) + if val < 0 { + errorExit("margin must be non-negative") + } + } + return str + } + switch len(margins) { + case 1: + m := checked(margins[0]) + return [4]string{m, m, m, m} + case 2: + tb := checked(margins[0]) + rl := checked(margins[1]) + return [4]string{tb, rl, tb, rl} + case 3: + t := checked(margins[0]) + rl := checked(margins[1]) + b := checked(margins[2]) + return [4]string{t, rl, b, rl} + case 4: + return [4]string{ + checked(margins[0]), checked(margins[1]), + checked(margins[2]), checked(margins[3])} + default: + errorExit("invalid margin: " + margin) + } + return defaultMargin() +} + func parseOptions(opts *Options, allArgs []string) { keymap := make(map[int]actionType) var historyMax int @@ -743,6 +800,11 @@ func parseOptions(opts *Options, allArgs []string) { opts.Header = []string{} opts.HeaderLines = atoi( nextString(allArgs, &i, "number of header lines required")) + case "--no-margin": + opts.Margin = defaultMargin() + case "--margin": + opts.Margin = parseMargin( + nextString(allArgs, &i, "margin required (TRBL / TB,RL / T,RL,B / T,R,B,L)")) case "--version": opts.Version = true default: @@ -782,6 +844,8 @@ func parseOptions(opts *Options, allArgs []string) { } else if match, value := optString(arg, "--header-lines="); match { opts.Header = []string{} opts.HeaderLines = atoi(value) + } else if match, value := optString(arg, "--margin="); match { + opts.Margin = parseMargin(value) } else { errorExit("unknown option: " + arg) } |