Add $FZF_DEFAULT_OPTS_FILE (#3618)

For those who prefer to manage default options in a file.
If the file is not found, fzf will exit with an error.

We're not setting a default value for it because:

1. it's hard to find a default value that can be universally agreed upon
2. to avoid fzf having to check for the existence of the file even when it's not used
This commit is contained in:
Junegunn Choi authored and GitHub committed 2024-02-29 09:49:33 +09:00
1 parent 3dd42f5aa2
commit 1833670fb9
5 files changed
+50 -7

No files matched your search

+31 -6
View File
@@ -126,8 +126,8 @@ const usage = `usage: fzf [options]
Environment variables
FZF_DEFAULT_COMMAND Default command to use when input is tty
FZF_DEFAULT_OPTS Default options
(e.g. '--layout=reverse --inline-info')
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)
`
@@ -421,8 +421,10 @@ func help(code int) {
os.Exit(code)
}
var errorContext = ""
func errorExit(msg string) {
os.Stderr.WriteString(msg + "\n")
os.Stderr.WriteString(errorContext + msg + "\n")
os.Exit(exitError)
}
@@ -2167,13 +2169,36 @@ func ParseOptions() *Options {
}
}
// Options from Env var
words, _ := shellwords.Parse(os.Getenv("FZF_DEFAULT_OPTS"))
// 1. Options from $FZF_DEFAULT_OPTS_FILE
if path := os.Getenv("FZF_DEFAULT_OPTS_FILE"); path != "" {
bytes, err := os.ReadFile(path)
if err != nil {
errorContext = "$FZF_DEFAULT_OPTS_FILE: "
errorExit(err.Error())
}
words, parseErr := shellwords.Parse(string(bytes))
if parseErr != nil {
errorContext = path + ": "
errorExit(parseErr.Error())
}
if len(words) > 0 {
parseOptions(opts, words)
}
}
// 2. Options from $FZF_DEFAULT_OPTS string
words, parseErr := shellwords.Parse(os.Getenv("FZF_DEFAULT_OPTS"))
errorContext = "$FZF_DEFAULT_OPTS: "
if parseErr != nil {
errorExit(parseErr.Error())
}
if len(words) > 0 {
parseOptions(opts, words)
}
// Options from command-line arguments
// 3. Options from command-line arguments
errorContext = ""
parseOptions(opts, os.Args[1:])
postProcessOptions(opts)