Embed man page in the binary and show it on 'fzf --man'

This commit is contained in:
Junegunn Choi 2024-05-20 19:33:46 +09:00
parent 7b0c9e04d3
commit 076b3d0a9a
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
7 changed files with 40 additions and 5 deletions

View File

@ -4,7 +4,7 @@ GOOS ?= $(shell $(GO) env GOOS)
MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST)))
ROOT_DIR := $(shell dirname $(MAKEFILE))
SOURCES := $(wildcard *.go src/*.go src/*/*.go shell/*sh) $(MAKEFILE)
SOURCES := $(wildcard *.go src/*.go src/*/*.go shell/*sh man/man1/*.1) $(MAKEFILE)
ifdef FZF_VERSION
VERSION := $(FZF_VERSION)

18
main.go
View File

@ -4,6 +4,7 @@ import (
_ "embed"
"fmt"
"os"
"os/exec"
"strings"
fzf "github.com/junegunn/fzf/src"
@ -28,6 +29,9 @@ var zshCompletion []byte
//go:embed shell/key-bindings.fish
var fishKeyBindings []byte
//go:embed man/man1/fzf.1
var manPage []byte
func printScript(label string, content []byte) {
fmt.Println("### " + label + " ###")
fmt.Println(strings.TrimSpace(string(content)))
@ -76,6 +80,20 @@ func main() {
}
return
}
if options.Man {
file := fzf.WriteTemporaryFile([]string{string(manPage)}, "\n")
if len(file) == 0 {
fmt.Print(string(manPage))
return
}
defer os.Remove(file)
cmd := exec.Command("man", file)
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
fmt.Print(string(manPage))
}
return
}
code, err := fzf.Run(options)
exit(code, err)

View File

@ -898,9 +898,16 @@ e.g.
# Choose port automatically and export it as $FZF_PORT to the child process
fzf --listen --bind 'start:execute-silent:echo $FZF_PORT > /tmp/fzf-port'
\fR
.SS Help
.TP
.B "--version"
Display version information and exit
.TP
.B "--help"
Show help message
.TP
.B "--man"
Show man page
.SS Directory traversal
.TP

View File

@ -6,7 +6,7 @@ import (
"unsafe"
)
func writeTemporaryFile(data []string, printSep string) string {
func WriteTemporaryFile(data []string, printSep string) string {
f, err := os.CreateTemp("", "fzf-temp-*")
if err != nil {
// Unable to create temporary file

View File

@ -127,7 +127,6 @@ const Usage = `usage: fzf [options]
--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)
--version Display version information and exit
Directory traversal (Only used when $FZF_DEFAULT_COMMAND is not set)
--walker=OPTS [file][,dir][,follow][,hidden] (default: file,follow,hidden)
@ -140,6 +139,11 @@ const Usage = `usage: fzf [options]
--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
Environment variables
FZF_DEFAULT_COMMAND Default command to use when input is tty
FZF_DEFAULT_OPTS Default options (e.g. '--layout=reverse --info=inline')
@ -387,6 +391,7 @@ type Options struct {
Bash bool
Zsh bool
Fish bool
Man bool
Fuzzy bool
FuzzyAlgo algo.Algo
Scheme string
@ -493,6 +498,7 @@ func defaultOptions() *Options {
Bash: false,
Zsh: false,
Fish: false,
Man: false,
Fuzzy: true,
FuzzyAlgo: algo.FuzzyMatchV2,
Scheme: "default",
@ -1865,10 +1871,14 @@ func parseOptions(opts *Options, allArgs []string) error {
opts.Fish = false
opts.Help = false
opts.Version = false
opts.Man = false
}
for i := 0; i < len(allArgs); i++ {
arg := allArgs[i]
switch arg {
case "--man":
clearExitingOpts()
opts.Man = true
case "--bash":
clearExitingOpts()
opts.Bash = true

View File

@ -98,7 +98,7 @@ func runProxy(commandPrefix string, cmdBuilder func(temp string) *exec.Cmd, opts
exports[idx] = fmt.Sprintf("export %s=%s", pair[0], escapeSingleQuote(pair[1]))
}
}
temp := writeTemporaryFile(append(exports, command), "\n")
temp := WriteTemporaryFile(append(exports, command), "\n")
defer os.Remove(temp)
cmd := cmdBuilder(temp)

View File

@ -2840,7 +2840,7 @@ func replacePlaceholder(params replacePlaceholderParams) (string, []string) {
}
if flags.file {
file := writeTemporaryFile(replacements, params.printsep)
file := WriteTemporaryFile(replacements, params.printsep)
tempFiles = append(tempFiles, file)
return file
}