mirror of
				https://github.com/cheat/cheat.git
				synced 2025-11-04 07:45:28 +01:00 
			
		
		
		
	feat(pagination): implement paginated output
Implement a `pager` config option. If configured, `cheat` will automatically pipe output through the configured pager (where appropriate).
This commit is contained in:
		@@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	cp "github.com/cheat/cheat/internal/cheatpath"
 | 
			
		||||
 | 
			
		||||
@@ -19,6 +20,7 @@ type Config struct {
 | 
			
		||||
	Cheatpaths []cp.Cheatpath `yaml:"cheatpaths"`
 | 
			
		||||
	Style      string         `yaml:"style"`
 | 
			
		||||
	Formatter  string         `yaml:"formatter"`
 | 
			
		||||
	Pager      string         `yaml:"pager"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New returns a new Config struct
 | 
			
		||||
@@ -111,5 +113,10 @@ func New(opts map[string]interface{}, confPath string, resolve bool) (Config, er
 | 
			
		||||
		conf.Formatter = "terminal16m"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if a pager was not provided, set a default
 | 
			
		||||
	if strings.TrimSpace(conf.Pager) == "" {
 | 
			
		||||
		conf.Pager = ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return conf, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								internal/display/display.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								internal/display/display.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
package display
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/cheat/cheat/internal/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Display writes output either directly to stdout, or through a pager,
 | 
			
		||||
// depending upon configuration.
 | 
			
		||||
func Display(out string, conf config.Config) {
 | 
			
		||||
	// if no pager was configured, print the output to stdout and exit
 | 
			
		||||
	if conf.Pager == "" {
 | 
			
		||||
		fmt.Print(out)
 | 
			
		||||
		os.Exit(0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// otherwise, pipe output through the pager
 | 
			
		||||
	parts := strings.Split(conf.Pager, " ")
 | 
			
		||||
	pager := parts[0]
 | 
			
		||||
	args := parts[1:]
 | 
			
		||||
 | 
			
		||||
	// run the pager
 | 
			
		||||
	cmd := exec.Command(pager, args...)
 | 
			
		||||
	cmd.Stdin = strings.NewReader(out)
 | 
			
		||||
	cmd.Stdout = os.Stdout
 | 
			
		||||
 | 
			
		||||
	// handle errors
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintln(os.Stderr, fmt.Sprintf("failed to write to pager: %v", err))
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user