# bvr
![BVR CLI](assets/simple.png)
Powerful pager written in rust, purpose-built for chewing through logs.
BVR (pronounced "beaver") is still under heavy development.
## Motivation
I needed a pager that could handle large log files and be fast and responsive.
I especially hated grepping a file, piping it to less, exiting and then grepping
with a different regex. I wanted to compare log files side by side. I also needed
a plethora of other features that I couldn't find in any other pager.
### Goals
* Fast and responsive
* Intuitive and easy to use
* Intuitive keybindings
* Mouse support
* Targeted use: scrolling through log files
* Multiplexing
* Built from the ground up to be modular
* Simple and easy to understand codebase
### Non-Goals
* Syntax highlighting
* Editing files
## Features
### In-Progress or Planned
| Feature | Description | Progress |
| ------------------ | ----------------------------------------- | --------- |
| Command Completion | Use tabs to complete commands. | Planned |
| Filter Presets | Add preset filters upon startup. | After MVP |
| Custom Keybindings | Customize the keybindings of the program. | After MVP |
| Word-Wrapping | Wrap long lines. | After MVP |
### Basic Support
| Feature | Description | Progress |
| -------------------- | ------------------------------------------------------------- | -------- |
| Piping Files | View piped outputs of other programs, ie. `cat file \| bvr` | Basic |
| Status Bar | View current state of the pager. | Basic |
| Commands | Use modal commands to interact with the pager. | Basic |
| Horizontal Scrolling | Pan the view horizontally. | Basic |
| Export Output | Export data of active filters to a file. | Done |
| Mouse Support | Use mouse to interact with the TUI. | Done |
| Filter (Regex) | Select and disable additive search filters. | Done |
| Filter Intersection | Compose filters by their intersection instead of their union. | Done |
| Filter Match Jumping | Jump to the next or previous line that matches a filter. | Done |
| Multiplexing | View multiple files through tabs or windows. | Done |
| Follow Output | Constantly scroll down as new data is loaded. | Done |
## Built-in Keybindings
* Custom keybindings will be added in the future.
### Normal Mode
This is the default mode. You can scroll through files.
| Keybinding | Description |
| ------------------------------- | ---------------------------------------------------- |
| `Up` and `Down` | Pan the view. |
| `n` `p` | Pan to next/previous active match. |
| `Home`/`g` | Pan the view to end of the file. |
| `End`/`G` | Pan the view to the end of the file (follow output). |
| `PageUp` and `PageDown`/`Space` | Pan the view by a page. |
| `Shift` + `Up` and `Down` | Pan the view by a half-page. |
### Command Mode
In this mode, you can enter commands to interact with the pager.
| Command | Description |
| ------------------------------------------- | ------------------------------------------------------------- |
| `:quit`
`:q` | Quit. |
| `:open `
`:o` | Open a file in a new tab/view. |
| `:close`
`:c` | Close the current tab/view. |
| `:mux`
`:m` | Toggle the multiplexer mode between windows or tabs. |
| `:mux tabs` `:mux split`
`:m t` `:m s` | Set the multiplexer to the respective mode. |
| `:pb` `pbcopy` | Copy the output of the active filters to the clipboard. |
| `:filter regex `
`:f r ` | Create a new filter searching for the regex. |
| `:filter lit `
`:f l ` | Create a new filter searching for the literal. |
| `:filter clear`
`:f c` | Clear all filters. |
| `:filter union`
`:f \|` | Use union strategy for filter composites (default). |
| `:filter intersect`
`:f &` | Use intersection strategy for filter composites. |
| `:` | Go to the specific line number (or nearest if not available). |
Note: `find` is an alias for `filter`.
### Visual Mode
In this mode, you can select lines to bookmark.
| Keybinding | Description |
| -------------------------------------- | ------------------------------------------------ |
| `Up` and `Down` | Move the select cursor. |
| `n` `p` | Select next/previous active match. |
| `Shift` + `Up` and `Down`, `n` and `p` | Expand the select cursor into a selection range. |
| `Space` and `Enter` | Toggle bookmark at current line. |
### Filter Mode
In this mode, you can toggle filters from bookmarks or searches to omit or include certain lines in the viewer.
| Keybinding | Description |
| ------------------- | ---------------------------------------- |
| `Esc` and `Tab` | Exit selection mode (enter viewer mode). |
| `:` | Enter command mode. |
| `i` | Enter selection mode. |
| `Up` and `Down` | Change which filter is selected. |
| `Space` and `Enter` | Toggle selected filter. |
### Mode-Independent
| Keybinding | Description |
| --------------- | -------------------------------------------- |
| `Esc` | Exit selection mode (enter normal mode). |
| `Ctr;` + `C` | Exit the program. |
| `:` | Enter command mode. |
| `/` | Create a new filter. |
| `?` | Create a new filter (literal). |
| `v` | Enter visual mode. |
| `Tab` | Enter filter mode. |
| `` ` `` and `~` | Switch selected view (forward and backward). |
| `1` .. `9` | Switch selected view to the `n`th buffer. |