bb/README.md

156 lines
5.5 KiB
Markdown
Raw Permalink Normal View History

2019-05-22 01:56:39 -07:00
# bb - An itty bitty browser for command line file management
2019-09-21 19:16:58 -07:00
`bb` (bitty browser) is a console file browser with a text user interface that is:
- Extremely lightweight (under 2k lines of code)
- Highly interoperable with unix pipelines
- Highly customizable and hackable
2019-06-10 22:28:09 -07:00
- Free of any build dependencies other than the C standard library (no ncurses)
- A good proof-of-concept for making a TUI from scratch
2019-07-15 22:31:42 -07:00
![BB Preview Video](https://bitbucket.org/spilt/bb/downloads/bb.gif)
2021-07-03 21:20:42 -07:00
## Building
2019-11-11 11:45:00 -08:00
`bb` has no build dependencies besides `make` and a C compiler, just:
2021-07-05 19:15:04 -07:00
```shell
make
sudo make install
```
2020-06-04 00:05:18 -07:00
To run `bb`, it's expected that you have some basic unix tools: `cat`, `cp`,
`echo`, `find`, `kill`, `less`, `ln`, `mkdir`, `more`, `mv`, `printf`, `read`,
`rm`, `sed`, `sh`, `tput`, `tr`.
2021-07-03 21:20:42 -07:00
## Usage
Run `bb` to launch the file browser. `bb` also has the flags:
2021-07-05 19:15:04 -07:00
- `-d`: when `bb` exits successfully, print the directory `bb` was browsing
(see the section on "Changing Directories with bb" in the FAQ below).
- `-s`: when `bb` exits successfully, print the files that were selected.
- `-0`: use NULL-terminated strings instead of newline-separated strings with
the `-s` flag.
- `-h`: print usage
- `-v`: print version
Within `bb`, press `?` for a full list of available key bindings. In short:
2019-11-11 11:45:00 -08:00
`h`/`j`/`k`/`l` (or arrow keys) for navigation, `q` to quit, `Enter` to open a
file, `<space>` to toggle selection, `d` to delete, `C` to copy, `Ctrl-v` to
move, `r` to rename, `Ctrl-n` to create a new file or directory, `:` to run a
command with the selected files in `$@`, and `|` to pipe the selected files to
a command. Pressing `Ctrl-c` will cause `bb` to exit with a failure status and
without printing anything.
More information about usage can also be found by running `man bb` after
installing.
2021-07-03 21:20:42 -07:00
2019-06-10 22:27:06 -07:00
## bb's Philosophy
The core idea behind `bb` is that `bb` is a file **browser**, not a file
**manager**, which means `bb` uses shell scripts to perform all modifications
to the filesystem (passing selected files as arguments), rather than
reinventing the wheel by hard-coding operations like `rm`, `mv`, `cp`, `touch`,
and so on. Shell scripts can be bound to keypresses in
2021-01-28 22:32:42 -08:00
`~/.config/bb/bbkeys`. For example, `D` is bound to a script that prints a
confirmation message, then runs `rm -rf "$@" && bbcmd deselect refresh`,
2019-11-11 11:45:00 -08:00
which means selecting `file1` and `file2`, then pressing `D` will cause `bb` to
run the shell command `rm -rf file1 file2` and then tell `bb` to deselect all
(now deleted) files and refresh.
2021-07-03 21:20:42 -07:00
## Customizing bb
When `bb` launches, it first updates `bb`'s `$PATH` environment variable to
2021-07-03 21:41:08 -07:00
include, in order, `~/.config/bb/` and `/etc/bb/`. Then, `bb` will run the
command `bbstartup` (the default implementation is found at
[scripts/bbstartup](scripts/bbstartup), along with other default `bb` commands).
2021-01-28 22:32:42 -08:00
`bbstartup` will call `bbkeys` and may also set up configuration options like
which columns to display and what sort order to use. All of these behaviors can
be customized by creating custom local versions of these files in `~/.config/bb/`.
2021-07-03 21:41:08 -07:00
The default versions can be found in `/etc/bb/`.
You can also create temporary bindings at runtime by hitting `Ctrl-b`, pressing
the key you want to bind, and then entering in a script to run (in case you
want to set up an easy way to repeat some custom workflow).
2021-07-03 21:20:42 -07:00
### API
`bb` also exposes an API that allows shell scripts to modify `bb`'s internal
state. To do this, call `bbcmd <your command>` from within `bb`. For example, by
default, `j` is bound to `bbcmd move:+1`, which has the effect of moving `bb`'s
cursor down one item. More details about the API can be found in [the API
documentation](API.md) or by running `man bbcmd` after installing.
2021-07-05 19:15:04 -07:00
## FAQ
### Using bb to Change Directory
Applications cannot change the shell's working directory on their own, but you
can define a shell function that uses the shell's builtin `cd` function on the
2021-07-05 19:17:35 -07:00
output of `bb -d` (print directory on exit). For bash or sh, you can put the
following function in your `~/.bashrc`:
2021-07-05 19:15:04 -07:00
```bash
2021-07-05 19:17:35 -07:00
function bcd() { cd "$(bb -d "$@")"; }
```
Zsh is slightly different and requires the following in your `~/.zshrc`:
```zsh
bcd() { cd "$(bb -d "$@" <$TTY)"; }
2021-07-05 19:15:04 -07:00
```
For [fish](https://fishshell.com/) (v3.0.0+), you can put this in your
`~/.config/fish/functions/`:
```fish
function bcd; cd (bb -d $argv); end
```
In both versions, the directory will not change if `bb` exits with failure
(e.g. by pressing `Ctrl-c`).
### Launching bb with a Keyboard Shortcut
Using a keyboard shortcut to launch `bb` from the shell is something that is
handled by your shell. Here are some examples for binding `Ctrl-b` to launch
`bb` and change directory to `bb`'s directory (using the `bcd` function defined
above). For sh and bash, put this in your `~/.profile`:
```bash
2021-07-05 19:17:35 -07:00
function bcd() { cd "$(bb -d "$@")"; }
2021-07-05 19:15:04 -07:00
bind '"\C-b":"bcd\n"'
```
For zsh, instead put this in your `~/.zshrc`:
```zsh
2021-07-05 19:54:49 -07:00
bcd() { # Change directory with bb
cd "$(bb -d "$@" <$TTY)"
precmd >/dev/null 2>/dev/null # If precmd sets your $PS1, you may need to re-run it
zle reset-prompt
}
2021-07-05 19:15:04 -07:00
zle -N bcd
bindkey '^B' bcd
```
For fish, put this in your `~/.config/fish/functions/fish_user_key_bindings.fish`:
```fish
function bcd; cd (bb -d $argv <$TTY); end
bind \cB 'bcd; commandline -f repaint'
```
2019-06-10 22:27:06 -07:00
## License
2021-01-28 23:00:34 -08:00
`bb` is provided under the MIT license with the [Commons Clause](https://commonsclause.com/)
(you can't sell this software without the developer's permission, but you're
otherwise free to use, modify, and redistribute it free of charge).
See [LICENSE](LICENSE) for details.