diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2025-01-02 16:24:46 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2025-01-02 16:25:00 +0900 |
| commit | ee3916be17a340205875f9ccfaf71a1683a2fdf9 (patch) | |
| tree | 0cc0e5d4d7067f0135f01431795a9f4541f7e532 /src/options.go | |
| parent | fd513f8af8191cd60364497f4184b8accd988282 (diff) | |
| download | fzf-ee3916be17a340205875f9ccfaf71a1683a2fdf9.tar.gz | |
Border around the input section (prompt + info)
Close #4154
Diffstat (limited to 'src/options.go')
| -rw-r--r-- | src/options.go | 513 |
1 files changed, 286 insertions, 227 deletions
diff --git a/src/options.go b/src/options.go index 40a2a2e3..03749568 100644 --- a/src/options.go +++ b/src/options.go @@ -27,151 +27,152 @@ Author: Junegunn Choi <junegunn.c@gmail.com> Usage: fzf [options] Search - -x, --extended Extended-search mode - (enabled by default; +x or --no-extended to disable) - -e, --exact Enable Exact-match - -i, --ignore-case Case-insensitive match (default: smart-case match) - +i, --no-ignore-case Case-sensitive match - --scheme=SCHEME Scoring scheme [default|path|history] - --literal Do not normalize latin script letters before matching - -n, --nth=N[,..] Comma-separated list of field index expressions - for limiting search scope. Each can be a non-zero - integer or a range expression ([BEGIN]..[END]). - --with-nth=N[,..] Transform the presentation of each line using - field index expressions - -d, --delimiter=STR Field delimiter regex (default: AWK-style) - +s, --no-sort Do not sort the result - --tail=NUM Maximum number of items to keep in memory - --track Track the current selection when the result is updated - --tac Reverse the order of the input - --disabled Do not perform search - --tiebreak=CRI[,..] Comma-separated list of sort criteria to apply - when the scores are tied [length|chunk|begin|end|index] - (default: length) + -x, --extended Extended-search mode + (enabled by default; +x or --no-extended to disable) + -e, --exact Enable Exact-match + -i, --ignore-case Case-insensitive match (default: smart-case match) + +i, --no-ignore-case Case-sensitive match + --scheme=SCHEME Scoring scheme [default|path|history] + --literal Do not normalize latin script letters before matching + -n, --nth=N[,..] Comma-separated list of field index expressions + for limiting search scope. Each can be a non-zero + integer or a range expression ([BEGIN]..[END]). + --with-nth=N[,..] Transform the presentation of each line using + field index expressions + -d, --delimiter=STR Field delimiter regex (default: AWK-style) + +s, --no-sort Do not sort the result + --tail=NUM Maximum number of items to keep in memory + --track Track the current selection when the result is updated + --tac Reverse the order of the input + --disabled Do not perform search + --tiebreak=CRI[,..] Comma-separated list of sort criteria to apply + when the scores are tied [length|chunk|begin|end|index] + (default: length) Interface - -m, --multi[=MAX] Enable multi-select with tab/shift-tab - --no-mouse Disable mouse - --bind=KEYBINDS Custom key bindings. Refer to the man page. - --cycle Enable cyclic scroll - --wrap Enable line wrap - --wrap-sign=STR Indicator for wrapped lines - --no-multi-line Disable multi-line display of items when using --read0 - --gap[=N] Render empty lines between each item - --keep-right Keep the right end of the line visible on overflow - --scroll-off=LINES Number of screen lines to keep above or below when - scrolling to the top or to the bottom (default: 0) - --no-hscroll Disable horizontal scroll - --hscroll-off=COLS Number of screen columns to keep to the right of the - highlighted substring (default: 10) - --filepath-word Make word-wise movements respect path separators - --jump-labels=CHARS Label characters for jump mode + -m, --multi[=MAX] Enable multi-select with tab/shift-tab + --no-mouse Disable mouse + --bind=KEYBINDS Custom key bindings. Refer to the man page. + --cycle Enable cyclic scroll + --wrap Enable line wrap + --wrap-sign=STR Indicator for wrapped lines + --no-multi-line Disable multi-line display of items when using --read0 + --gap[=N] Render empty lines between each item + --keep-right Keep the right end of the line visible on overflow + --scroll-off=LINES Number of screen lines to keep above or below when + scrolling to the top or to the bottom (default: 0) + --no-hscroll Disable horizontal scroll + --hscroll-off=COLS Number of screen columns to keep to the right of the + highlighted substring (default: 10) + --filepath-word Make word-wise movements respect path separators + --jump-labels=CHARS Label characters for jump mode Layout - --height=[~]HEIGHT[%] Display fzf window below the cursor with the given - height instead of using fullscreen. - A negative value is calculated as the terminal height - minus the given value. - If prefixed with '~', fzf will determine the height - according to the input size. - --min-height=HEIGHT Minimum height when --height is given in percent - (default: 10) - --tmux[=OPTS] Start fzf in a tmux popup (requires tmux 3.3+) - [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]] - (default: center,50%) - --layout=LAYOUT Choose layout: [default|reverse|reverse-list] - --border[=STYLE] Draw border around the finder - [rounded|sharp|bold|block|thinblock|double|horizontal|vertical| - top|bottom|left|right|none] (default: rounded) - --border-label=LABEL Label to print on the border - --border-label-pos=COL Position of the border label - [POSITIVE_INTEGER: columns from left| - NEGATIVE_INTEGER: columns from right][:bottom] - (default: 0 or center) - --list-border[=STYLE] Draw border around the list section - [rounded|sharp|bold|block|thinblock|double|horizontal|vertical| - top|bottom|left|right|none] (default: none) - --list-label=LABEL Label to print on the list border - --list-label-pos=COL Position of the list label - [POSITIVE_INTEGER: columns from left| - NEGATIVE_INTEGER: columns from right][:bottom] - (default: 0 or center) - --margin=MARGIN Screen margin (TRBL | TB,RL | T,RL,B | T,R,B,L) - --padding=PADDING Padding inside border (TRBL | TB,RL | T,RL,B | T,R,B,L) - --info=STYLE Finder info style - [default|right|hidden|inline[-right][:PREFIX]] - --info-command=COMMAND Command to generate info line - --separator=STR String to form horizontal separator on info line - --no-separator Hide info line separator - --scrollbar[=C1[C2]] Scrollbar character(s) (each for main and preview window) - --no-scrollbar Hide scrollbar - --prompt=STR Input prompt (default: '> ') - --pointer=STR Pointer to the current line (default: '▌' or '>') - --marker=STR Multi-select marker (default: '┃' or '>') - --marker-multi-line=STR Multi-select marker for multi-line entries; - 3 elements for top, middle, and bottom (default: '╻┃╹') - --header=STR String to print as header - --header-lines=N The first N lines of the input are treated as header - --header-first Print header before the prompt line - --ellipsis=STR Ellipsis to show when line is truncated (default: '··') + --height=[~]HEIGHT[%] Display fzf window below the cursor with the given + height instead of using fullscreen. + A negative value is calculated as the terminal height + minus the given value. + If prefixed with '~', fzf will determine the height + according to the input size. + --min-height=HEIGHT Minimum height when --height is given in percent + (default: 10) + --tmux[=OPTS] Start fzf in a tmux popup (requires tmux 3.3+) + [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]] + (default: center,50%) + --layout=LAYOUT Choose layout: [default|reverse|reverse-list] + --border[=STYLE] Draw border around the finder + [rounded|sharp|bold|block|thinblock|double|horizontal|vertical| + top|bottom|left|right|none] (default: rounded) + --border-label=LABEL Label to print on the border + --border-label-pos=COL Position of the border label + [POSITIVE_INTEGER: columns from left| + NEGATIVE_INTEGER: columns from right][:bottom] + (default: 0 or center) + --list-border[=STYLE] Draw border around the list section + [rounded|sharp|bold|block|thinblock|double|horizontal|vertical| + top|bottom|left|right|none] (default: none) + --list-label=LABEL Label to print on the list border + --list-label-pos=COL Position of the list label + [POSITIVE_INTEGER: columns from left| + NEGATIVE_INTEGER: columns from right][:bottom] + (default: 0 or center) + --margin=MARGIN Screen margin (TRBL | TB,RL | T,RL,B | T,R,B,L) + --padding=PADDING Padding inside border (TRBL | TB,RL | T,RL,B | T,R,B,L) + --info=STYLE Finder info style + [default|right|hidden|inline[-right][:PREFIX]] + --info-command=COMMAND Command to generate info line + --separator=STR String to form horizontal separator on info line + --no-separator Hide info line separator + --scrollbar[=C1[C2]] Scrollbar character(s) (each for main and preview window) + --no-scrollbar Hide scrollbar + --prompt=STR Input prompt (default: '> ') + --pointer=STR Pointer to the current line (default: '▌' or '>') + --marker=STR Multi-select marker (default: '┃' or '>') + --marker-multi-line=STR Multi-select marker for multi-line entries; + 3 elements for top, middle, and bottom (default: '╻┃╹') + --header=STR String to print as header + --header-lines=N The first N lines of the input are treated as header + --header-first Print header before the prompt line + --ellipsis=STR Ellipsis to show when line is truncated (default: '··') Display - --ansi Enable processing of ANSI color codes - --tabstop=SPACES Number of spaces for a tab character (default: 8) - --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors - --highlight-line Highlight the whole current line - --no-bold Do not use bold text + --ansi Enable processing of ANSI color codes + --tabstop=SPACES Number of spaces for a tab character (default: 8) + --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors + --highlight-line Highlight the whole current line + --no-bold Do not use bold text History - --history=FILE History file - --history-size=N Maximum number of history entries (default: 1000) + --history=FILE History file + --history-size=N Maximum number of history entries (default: 1000) Preview - --preview=COMMAND Command to preview highlighted line ({}) - --preview-window=OPT Preview window layout (default: right:50%) - [up|down|left|right][,SIZE[%]] - [,[no]wrap][,[no]cycle][,[no]follow][,[no]info] - [,[no]hidden][,border-BORDER_OPT] - [,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES] - [,default][,<SIZE_THRESHOLD(ALTERNATIVE_LAYOUT)] + --preview=COMMAND Command to preview highlighted line ({}) + --preview-window=OPT Preview window layout (default: right:50%) + [up|down|left|right][,SIZE[%]] + [,[no]wrap][,[no]cycle][,[no]follow][,[no]info] + [,[no]hidden][,border-BORDER_OPT] + [,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES] + [,default][,<SIZE_THRESHOLD(ALTERNATIVE_LAYOUT)] + --preview-border[=STYLE] Short for --preview-window=border-STYLE --preview-label=LABEL - --preview-label-pos=N Same as --border-label and --border-label-pos, - but for preview window + --preview-label-pos=N Same as --border-label and --border-label-pos, + but for preview window Scripting - -q, --query=STR Start the finder with the given query - -1, --select-1 Automatically select the only match - -0, --exit-0 Exit immediately when there's no match - -f, --filter=STR Filter mode. Do not start interactive finder. - --print-query Print query as the first line - --expect=KEYS Comma-separated list of keys to complete fzf - --read0 Read input delimited by ASCII NUL characters - --print0 Print output delimited by ASCII NUL characters - --sync Synchronous search for multi-staged filtering - --with-shell=STR Shell command and flags to start child processes with - --listen[=[ADDR:]PORT] Start HTTP server to receive actions (POST /) - (To allow remote process execution, use --listen-unsafe) - - Directory traversal (Only used when $FZF_DEFAULT_COMMAND is not set) - --walker=OPTS [file][,dir][,follow][,hidden] (default: file,follow,hidden) - --walker-root=DIR [...] List of directories to walk (default: .) - --walker-skip=DIRS Comma-separated list of directory names to skip - (default: .git,node_modules) + -q, --query=STR Start the finder with the given query + -1, --select-1 Automatically select the only match + -0, --exit-0 Exit immediately when there's no match + -f, --filter=STR Filter mode. Do not start interactive finder. + --print-query Print query as the first line + --expect=KEYS Comma-separated list of keys to complete fzf + --read0 Read input delimited by ASCII NUL characters + --print0 Print output delimited by ASCII NUL characters + --sync Synchronous search for multi-staged filtering + --with-shell=STR Shell command and flags to start child processes with + --listen[=[ADDR:]PORT] Start HTTP server to receive actions (POST /) + (To allow remote process execution, use --listen-unsafe) + + Directory traversal (Only used when $FZF_DEFAULT_COMMAND is not set) + --walker=OPTS [file][,dir][,follow][,hidden] (default: file,follow,hidden) + --walker-root=DIR [...] List of directories to walk (default: .) + --walker-skip=DIRS Comma-separated list of directory names to skip + (default: .git,node_modules) Shell integration - --bash Print script to set up Bash shell integration - --zsh Print script to set up Zsh shell integration - --fish Print script to set up Fish shell integration + --bash Print script to set up Bash shell integration + --zsh Print script to set up Zsh shell integration + --fish Print script to set up Fish shell integration Help - --version Display version information and exit - --help Show this message - --man Show man page + --version Display version information and exit + --help Show this message + --man Show man page Environment variables - FZF_DEFAULT_COMMAND Default command to use when input is tty - FZF_DEFAULT_OPTS Default options (e.g. '--layout=reverse --info=inline') - FZF_DEFAULT_OPTS_FILE Location of the file to read default options from - FZF_API_KEY X-API-Key header for HTTP server (--listen) + FZF_DEFAULT_COMMAND Default command to use when input is tty + FZF_DEFAULT_OPTS Default options (e.g. '--layout=reverse --info=inline') + FZF_DEFAULT_OPTS_FILE Location of the file to read default options from + FZF_API_KEY X-API-Key header for HTTP server (--listen) ` @@ -444,102 +445,104 @@ type walkerOpts struct { // Options stores the values of command-line options type Options struct { - Input chan string - Output chan string - NoWinpty bool - Tmux *tmuxOptions - ForceTtyIn bool - ProxyScript string - Bash bool - Zsh bool - Fish bool - Man bool - Fuzzy bool - FuzzyAlgo algo.Algo - Scheme string - Extended bool - Phony bool - Case Case - Normalize bool - Nth []Range - WithNth []Range - Delimiter Delimiter - Sort int - Track trackOption - Tac bool - Tail int - Criteria []criterion - Multi int - Ansi bool - Mouse bool - Theme *tui.ColorTheme - Black bool - Bold bool - Height heightSpec - MinHeight int - Layout layoutType - Cycle bool - Wrap bool - WrapSign *string - MultiLine bool - CursorLine bool - KeepRight bool - Hscroll bool - HscrollOff int - ScrollOff int - FileWord bool - InfoStyle infoStyle - InfoPrefix string - InfoCommand string - Separator *string - JumpLabels string - Prompt string - Pointer *string - Marker *string - MarkerMulti *[3]string - Query string - Select1 bool - Exit0 bool - Filter *string - ToggleSort bool - Expect map[tui.Event]string - Keymap map[tui.Event][]*action - Preview previewOpts - PrintQuery bool - ReadZero bool - Printer func(string) - PrintSep string - Sync bool - History *History - Header []string - HeaderLines int - HeaderFirst bool - Gap int - Ellipsis *string - Scrollbar *string - Margin [4]sizeSpec - Padding [4]sizeSpec - BorderShape tui.BorderShape - ListBorderShape tui.BorderShape - BorderLabel labelOpts - ListLabel labelOpts - PreviewLabel labelOpts - Unicode bool - Ambidouble bool - Tabstop int - WithShell string - ListenAddr *listenAddress - Unsafe bool - ClearOnExit bool - WalkerOpts walkerOpts - WalkerRoot []string - WalkerSkip []string - Version bool - Help bool - CPUProfile string - MEMProfile string - BlockProfile string - MutexProfile string + Input chan string + Output chan string + NoWinpty bool + Tmux *tmuxOptions + ForceTtyIn bool + ProxyScript string + Bash bool + Zsh bool + Fish bool + Man bool + Fuzzy bool + FuzzyAlgo algo.Algo + Scheme string + Extended bool + Phony bool + Case Case + Normalize bool + Nth []Range + WithNth []Range + Delimiter Delimiter + Sort int + Track trackOption + Tac bool + Tail int + Criteria []criterion + Multi int + Ansi bool + Mouse bool + Theme *tui.ColorTheme + Black bool + Bold bool + Height heightSpec + MinHeight int + Layout layoutType + Cycle bool + Wrap bool + WrapSign *string + MultiLine bool + CursorLine bool + KeepRight bool + Hscroll bool + HscrollOff int + ScrollOff int + FileWord bool + InfoStyle infoStyle + InfoPrefix string + InfoCommand string + Separator *string + JumpLabels string + Prompt string + Pointer *string + Marker *string + MarkerMulti *[3]string + Query string + Select1 bool + Exit0 bool + Filter *string + ToggleSort bool + Expect map[tui.Event]string + Keymap map[tui.Event][]*action + Preview previewOpts + PrintQuery bool + ReadZero bool + Printer func(string) + PrintSep string + Sync bool + History *History + Header []string + HeaderLines int + HeaderFirst bool + Gap int + Ellipsis *string + Scrollbar *string + Margin [4]sizeSpec + Padding [4]sizeSpec + BorderShape tui.BorderShape + ListBorderShape tui.BorderShape + InputBorderShape tui.BorderShape + InputLabel labelOpts + BorderLabel labelOpts + ListLabel labelOpts + PreviewLabel labelOpts + Unicode bool + Ambidouble bool + Tabstop int + WithShell string + ListenAddr *listenAddress + Unsafe bool + ClearOnExit bool + WalkerOpts walkerOpts + WalkerRoot []string + WalkerSkip []string + Version bool + Help bool + CPUProfile string + MEMProfile string + BlockProfile string + MutexProfile string } func filterNonEmpty(input []string) []string { @@ -1168,7 +1171,7 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) (*tui.ColorTheme, erro } } switch components[0] { - case "query", "input": + case "query", "input", "input-fg": mergeAttr(&theme.Input) case "disabled": mergeAttr(&theme.Disabled) @@ -1220,6 +1223,12 @@ func parseTheme(defaultTheme *tui.ColorTheme, str string) (*tui.ColorTheme, erro mergeAttr(&theme.PreviewLabel) case "prompt": mergeAttr(&theme.Prompt) + case "input-bg": + mergeAttr(&theme.InputBg) + case "input-border": + mergeAttr(&theme.InputBorder) + case "input-label": + mergeAttr(&theme.InputLabel) case "spinner": mergeAttr(&theme.Spinner) case "info": @@ -1283,7 +1292,7 @@ const ( func init() { executeRegexp = regexp.MustCompile( - `(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:header|query|prompt|border-label|list-label|preview-label)|transform|change-(?:preview-window|preview|multi)|(?:re|un)bind|pos|put|print)`) + `(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:header|query|prompt|border-label|list-label|preview-label|input-label)|transform|change-(?:preview-window|preview|multi)|(?:re|un)bind|pos|put|print)`) splitRegexp = regexp.MustCompile("[,:]+") actionNameRegexp = regexp.MustCompile("(?i)^[a-z-]+") } @@ -1639,14 +1648,16 @@ func isExecuteAction(str string) actionType { return actRebind case "preview": return actPreview + case "change-header": + return actChangeHeader case "change-list-label": return actChangeListLabel case "change-border-label": return actChangeBorderLabel - case "change-header": - return actChangeHeader case "change-preview-label": return actChangePreviewLabel + case "change-input-label": + return actChangeInputLabel case "change-preview-window": return actChangePreviewWindow case "change-preview": @@ -1677,6 +1688,8 @@ func isExecuteAction(str string) actionType { return actTransformBorderLabel case "transform-preview-label": return actTransformPreviewLabel + case "transform-input-label": + return actTransformInputLabel case "transform-header": return actTransformHeader case "transform-prompt": @@ -2453,6 +2466,13 @@ func parseOptions(index *int, opts *Options, allArgs []string) error { if err := parsePreviewWindow(&opts.Preview, str); err != nil { return err } + case "--no-preview-border": + opts.Preview.border = tui.BorderNone + case "--preview-border": + hasArg, arg := optionalNextString(allArgs, &i) + if opts.Preview.border, err = parseBorder(arg, !hasArg); err != nil { + return err + } case "--height": str, err := nextString(allArgs, &i, "height required: [~]HEIGHT[%]") if err != nil { @@ -2500,6 +2520,27 @@ func parseOptions(index *int, opts *Options, allArgs []string) error { if err := parseLabelPosition(&opts.ListLabel, pos); err != nil { return err } + case "--no-input-border": + opts.InputBorderShape = tui.BorderNone + case "--input-border": + hasArg, arg := optionalNextString(allArgs, &i) + if opts.InputBorderShape, err = parseBorder(arg, !hasArg); err != nil { + return err + } + case "--no-input-label": + opts.InputLabel.label = "" + case "--input-label": + if opts.InputLabel.label, err = nextString(allArgs, &i, "input label required"); err != nil { + return err + } + case "--input-label-pos": + pos, err := nextString(allArgs, &i, "input label position required (positive or negative integer or 'center')") + if err != nil { + return err + } + if err := parseLabelPosition(&opts.InputLabel, pos); err != nil { + return err + } case "--no-border-label": opts.BorderLabel.label = "" case "--border-label": @@ -2637,6 +2678,10 @@ func parseOptions(index *int, opts *Options, allArgs []string) error { if opts.BorderShape, err = parseBorder(value, false); err != nil { return err } + } else if match, value := optString(arg, "--preview-border="); match { + if opts.Preview.border, err = parseBorder(value, false); err != nil { + return err + } } else if match, value := optString(arg, "--list-border="); match { if opts.ListBorderShape, err = parseBorder(value, false); err != nil { return err @@ -2647,6 +2692,16 @@ func parseOptions(index *int, opts *Options, allArgs []string) error { if err := parseLabelPosition(&opts.ListLabel, value); err != nil { return err } + } else if match, value := optString(arg, "--input-border="); match { + if opts.InputBorderShape, err = parseBorder(value, false); err != nil { + return err + } + } else if match, value := optString(arg, "--input-label="); match { + opts.InputLabel.label = value + } else if match, value := optString(arg, "--input-label-pos="); match { + if err := parseLabelPosition(&opts.InputLabel, value); err != nil { + return err + } } else if match, value := optString(arg, "--border-label="); match { opts.BorderLabel.label = value } else if match, value := optString(arg, "--border-label-pos="); match { @@ -2922,6 +2977,10 @@ func postProcessOptions(opts *Options) error { opts.ListBorderShape = tui.BorderNone } + if opts.InputBorderShape == tui.BorderUndefined { + opts.InputBorderShape = tui.BorderNone + } + if opts.Pointer == nil { defaultPointer := "▌" if !opts.Unicode { |
