markbt / streampager

A pager for command output or large files
MIT License
45 stars 11 forks source link

[Feature] Sticky headers #35

Open quark-zju opened 3 years ago

quark-zju commented 3 years ago

Just log the idea while I encounter it (again). When running git log -p I sometimes find the change I want and wanted to get back to the commit hash. It would be nice to have some sort of "sticky header" so it looks like:

commit deadbeef (sticky header level 1)
diff --git a/filename... (sticky header level 2)
(scroll-able text)

I don't know how to express it exactly. Potentially we can use some kind of ANSI sequences to define "header 1", "header 2" etc that are otherwise no-ops? I'm no expert on ANSI sequences. But if we define it here, I'm interested in implementing it except others beat me on it.

EDIT: Probably should try the new "discussions" GitHub feature for this.

markbt commented 3 years ago

This is a great idea. I already had a similar idea where a static banner could be added to the file which gets shown at the top. I was anticipating using that for showing titles, which would be particularly useful for controlled mode.

This is subtly different: my proposed banners would be entirely static, whereas (I assume) these sticky header lines would scroll left and right with the content. You could also use it, e.g. for showing large tables of SQL output, where you can make the first 3 lines sticky and only the data scrolls.

I'm not sure custom ANSI sequences would work so well, as I'm not sure what they'd mean anywhere but at the top. Instead I propose the following (defining some terms while I'm at it):

markbt commented 3 years ago

If you think an escape sequence might be useful (e.g. because you want a template to print it out to get the right line), then perhaps we could use an OSC sequence. Something like:

ESC ] streampager ; set-end-of-header BEL

This should be ignored by terminals, I believe.

In termwiz it gets parsed as OperatingSystemCommand::Unspecified(["streampager", "set-end-of-header"]) which should make it easy enough to parse out in line.rs.

martinvonz commented 3 years ago

Once this feature is in, it would be nice to also have keyboard shortcuts to scroll between the headers. I often review a series of patches by running hg log -pvr <some revset>. It would be nice to be able to press some key(s) to get the next/previous changeset/file header at the top of the screen.