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:
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:
git diff
| riff
for example).gz
, .bz2
, .xz
, .zst
, .zstd
)--wrap
or by pressing wtail -f
For compatibility reasons, moar
uses the formats declared in these environment variables if present:
LESS_TERMCAP_md
: Man page boldLESS_TERMCAP_us
: Man page underlineLESS_TERMCAP_so
: Status bar and search hitsFor 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 beingsriff
, a diff filter highlighting which line parts have changedBoth macOS and Linux users can use Homebrew to install. See below for distro specific instructions.
brew install moar
Then whenever you want to upgrade to the latest release:
brew upgrade
sudo port install moar
More info here.
emerge --ask --verbose sys-apps/moar
More info here.
yay -S moar
More info here.
Nobody has stepped up to maintain moar
for Debian.
If you want to maintain the moar
packaging for
Debian, that would be very welcome!
Otherwise use Homebrew (see above) or read on for manual install instructions.
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
.
moar
for your platform from
https://github.com/walles/moar/releases/latestchmod a+x moar-*-*-*
sudo mv moar-*-*-* /usr/local/bin/moar
And now you can just invoke moar
from the prompt!
Try moar --help
to see options.
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'
moar
as your default pagerSet it as your default pager by adding...
export PAGER=/usr/local/bin/moar
... to your .bashrc
.
Issues are tracked here, or you can send questions to johan.walles@gmail.com.
If you package moar
, do include the man page in your package.
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()
.
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
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.
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.
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
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.