mirror of https://github.com/rwxrob/bonzai
parent
8174f57b2d
commit
026a0086df
@ -0,0 +1,72 @@
|
|||||||
|
package Z
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
|
||||||
|
"github.com/rwxrob/to"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NoPager disables all paging.
|
||||||
|
var NoPager bool
|
||||||
|
|
||||||
|
// FindPager returns a full path to a pager binary if it can find one on
|
||||||
|
// the system:
|
||||||
|
//
|
||||||
|
// * $PAGER
|
||||||
|
// * pager (in PATH)
|
||||||
|
//
|
||||||
|
// If neither is found returns an empty string.
|
||||||
|
func FindPager() string {
|
||||||
|
if NoPager {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
path := os.Getenv(`PAGER`)
|
||||||
|
if path == "" {
|
||||||
|
path, _ = exec.LookPath(path)
|
||||||
|
}
|
||||||
|
if path == "" {
|
||||||
|
path, _ = exec.LookPath(`pager`)
|
||||||
|
}
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// PageFile looks up the system pager and passes the first argument as
|
||||||
|
// a file argument to it. Just prints file if no pager can be found.
|
||||||
|
func PageFile(path string) error {
|
||||||
|
pager := FindPager()
|
||||||
|
if pager == "" || NoPager {
|
||||||
|
buf, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Print(string(buf))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Exec(pager, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Page writes the buf to a temporary file and passes it as first
|
||||||
|
// argument to the detected system pager. Anything that to.String
|
||||||
|
// accepts can be passed. Just prints output without paging if a pager
|
||||||
|
// cannot be found.
|
||||||
|
func Page[T any](buf T) error {
|
||||||
|
pager := FindPager()
|
||||||
|
if pager == "" || NoPager {
|
||||||
|
fmt.Print(to.String(buf))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f, err := os.CreateTemp("", `bonzai-page-*`)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
name := f.Name()
|
||||||
|
_, err = f.WriteString(to.String(buf))
|
||||||
|
defer f.Close()
|
||||||
|
defer os.Remove(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return Exec(pager, name)
|
||||||
|
}
|
Loading…
Reference in New Issue