1
1
mirror of https://github.com/walles/moar.git synced 2024-11-22 03:14:56 +03:00
Moar is a pager. It's designed to just do the right thing without any configuration.
Go to file
Johan Walles f4fed36bfd Fix a hang
Before this change, if select() returned EINTR we would hang.

This change:
* Makes us ignore EINTRs and try again
* Makes sure to not hang, even if the twin main loop would fail for some
  other reason.
2024-07-15 20:30:47 +02:00
.github/workflows Release only releases 2024-05-09 16:31:24 +02:00
m Fix a bytes counting race condition 2024-07-15 07:03:06 +02:00
releases Move historical releases into their own directory 2020-12-30 18:43:25 +01:00
sample-files Make the tests pass 2024-04-07 08:25:07 +02:00
scripts On --help, print all *PAGER env vars 2024-01-29 23:38:20 +01:00
twin Fix a hang 2024-07-15 20:30:47 +02:00
.dockerignore Enable running tests in 32 bit mode 2023-07-08 09:53:11 +02:00
.gitignore Test case for #166 2023-12-01 06:57:08 +01:00
.golangci.yaml Enable revive for unused parameters check 2024-01-01 13:30:25 +01:00
.whitesource Reboot in Go 2019-06-08 22:12:52 +02:00
build.sh Fix a hang 2024-07-15 20:30:47 +02:00
Dockerfile-test-386 Enable running tests in 32 bit mode 2023-07-08 09:53:11 +02:00
go.mod Implement jumping to marks 2024-01-09 15:26:16 +01:00
go.sum Implement jumping to marks 2024-01-09 15:26:16 +01:00
install.sh Add two comments 2019-07-08 08:58:53 +02:00
LICENSE Reboot in Go 2019-06-08 22:12:52 +02:00
manual-test.sh Add a manual test suite 2024-06-30 09:29:10 +02:00
moar_test.go Fix a linter complaint 2024-02-16 12:50:58 +01:00
moar.1 Add --lang to the man page 2024-01-02 16:14:19 +01:00
moar.go Fix executability check on Windows 2024-06-29 08:36:13 +02:00
moar.sh Make moar.sh runnable from any directory 2020-11-07 13:57:50 +01:00
MOUSE.md Mouse copying in VSCode and IntelliJ 2024-05-06 06:48:59 +02:00
README.md Add go install to the manual install instructions 2024-07-12 07:02:21 +02:00
release.sh Improve marketing value 2024-03-18 19:20:51 +01:00
screenshot.png Update screenshot 2021-05-22 15:59:26 +02:00
test.sh Fix crash on --quit-if-one-screen by dupping stdout 2024-06-24 07:26:42 +02:00

Linux CI Windows CI

Moar is a pager. It reads and displays UTF-8 encoded text from files or pipelines.

moar is designed to just do the right thing without any configuration:

Moar displaying its own source code

The intention is that Moar should be trivial to get into if you have previously been using Less. If you come from Less and find Moar confusing or hard to migrate to, please report it!

Doing the right thing includes:

  • Syntax highlight source code by default using Chroma
  • Search is incremental / find-as-you-type just like in Chrome or Emacs
  • Search becomes case sensitive if you add any UPPER CASE characters to your search terms, just like in Emacs
  • Regexp search if your search string is a valid regexp
  • Supports displaying ANSI color coded texts (like the output from git diff | riff for example)
  • Supports UTF-8 input and output
  • Automatic decompression when viewing compressed text files (.gz, .bz2, .xz, .zst, .zstd)
  • The position in the file is always shown
  • Supports word wrapping (on actual word boundaries) if requested using --wrap or by pressing w
  • Follows output as long as you are on the last line, just like tail -f
  • Renders terminal hyperlinks properly
  • Mouse Scrolling works out of the box (but look here for tradeoffs)

For compatibility reasons, moar uses the formats declared in these environment variables if present:

For configurability reasons, moar reads extra command line options from the MOAR environment variable.

Moar is used as the default pager by:

  • px / ptop, ps and top for human beings
  • riff, a diff filter highlighting which line parts have changed

Installing

Using Homebrew

brew install moar

Then whenever you want to upgrade to the latest release:

brew upgrade

Using MacPorts

sudo port install moar

More info here.

Using Gentoo

emerge --ask --verbose sys-apps/moar

More info here.

Using Arch Linux

yay -S moar

More info here.

Debian / Ubuntu

Nobody has stepped up and packaged moar for Debian.

If you want to package moar for Debian, that would be very welcome!

Otherwise read on for manual install instructions.

Manual Install

Using go

This will install moar into $GOPATH/bin :

go install github.com/walles/moar@latest

NOTE: If you got here because there is no binary for your platform, please consider packaging moar.

Downloading binaries

  1. Download moar for your platform from https://github.com/walles/moar/releases/latest
  2. chmod a+x moar-*-*-*
  3. sudo mv moar-*-*-* /usr/local/bin/moar

And now you can just invoke moar from the prompt!

Try moar --help to see options.

Configuring

Do moar --help for an up to date list of options.

Environment variable MOAR can be used to set default options.

For example:

export MOAR='--statusbar=bold --no-linenumbers'

Setting moar as your default pager

Set it as your default pager by adding...

export PAGER=/usr/local/bin/moar

... to your .bashrc.

Issues

Issues are tracked here, or you can send questions to johan.walles@gmail.com.

Packaging

If you package moar, do include the man page in your package.

Embedding

Here's one way to embed moar in your app:

package main

import (
	"bytes"
	"fmt"

	"github.com/walles/moar/m"
)

func main() {
	buf := new(bytes.Buffer)
	for range [99]struct{}{} {
		fmt.Fprintln(buf, "Moar")
	}

	err := m.NewPager(m.NewReaderFromStream("Moar", buf)).Page()
	if err != nil {
		// Handle paging problems
		panic(err)
	}
}

m.Reader can also be initialized using NewReaderFromText() or NewReaderFromFilename().

Developing

You need the go tools.

Run tests:

./test.sh

Launch the manual test suite:

./manual-test.sh

To run tests in 32 bit mode, either do GOARCH=386 ./test.sh if you're on Linux, or docker build . -f Dockerfile-test-386 (tested on macOS).

Run microbenchmarks:

go test -benchmem -run='^$' -bench=. . ./...

Profiling BenchmarkPlainTextSearch(). Try replacing -alloc_objects with -alloc_space or change the -focus function:

go test -memprofilerate 1 -memprofile profile.out -benchmem -run='^$' -bench '^BenchmarkPlainTextSearch$' github.com/walles/moar/m && go tool pprof -alloc_objects -focus findFirstHit -relative_percentages -web profile.out

Build + run:

./moar.sh ...

Install (into /usr/local/bin) from source:

./install.sh

Making a new Release

Make sure that screenshot.png matches moar's current UI. If it doesn't, scale a window to 81x16 characters and make a new one.

Execute release.sh and follow instructions.

TODO

  • Enable exiting using ^c (without restoring the screen).

  • Start at a certain line if run as moar file.txt:42

  • Handle search hits to the right of the right screen edge. Searching forwards should move first right, then to the left edge and down. Searching backwards should move first left, then up and to the right edge (if needed for showing search hits).

  • Support viewing multiple files by pushing them in reverse order on the view stack.

  • Retain the search string when pressing / to search a second time.

Done

  • Add > markers at the end of lines being cut because they are too long

  • Doing moar on an arbitrary binary (like /bin/ls) should put all line-continuation markers at the rightmost column. This really means our truncation code must work even with things like tabs and various control characters.

  • Make sure search hits are highlighted even when we have to scroll right to see them

  • Change out-of-file visualization to writing --- after the end of the file and leaving the rest of the screen blank.

  • Exit search on pressing up / down / pageup / pagedown keys and scroll. I attempted to do that spontaneously, so it's probably a good idea.

  • Remedy all FIXMEs in this README file

  • Release the go version as the new moar, replacing the previous Ruby implementation

  • Add licensing information (same as for the Ruby branch)

  • Make sure git grep output gets highlighted properly.

  • Handle all kinds of line endings.

  • Make sure version information is printed if there are warnings.

  • Add spinners while file is still loading

  • Make tail -f /dev/null exit properly, fix https://github.com/walles/moar/issues/7.

  • Showing unicode search hits should highlight the correct chars

  • Word wrap text rather than character wrap it.

  • Arrow keys up / down while in line wrapping mode should scroll by screen line, not by input file line.

  • Define 'g' to prompt for a line number to go to.