Clipvault
Clipboard history manager for Wayland, inspired by cliphist
## Features
Like `cliphist`:
- **Save history:** clipboard entries are stored in a local database
- **Recall history:** recall saved entries using any picker you like (e.g. `dmenu`, `rofi`, `wofi`, etc.)
- **Simple:** no builtin picker, only pipes - keep it simple (stupid)
- **Any data:** support for **text**, **images** and **any other** binary data
- **Preservation:** entries are preserved byte-for-byte, including leading/trailing whitespace
In addition:
- **No silent failures:** invalid arguments cause errors, and are also written to log files
- **Relative positions:** support for getting/deleting items by relative position in the saved history
- **Entry size limits**: configurable minimum and maximum size for stored entries
- **Entry age limit:** configurable max age for entries - automatically remove old clipboard entries
- **Ignore entries:** avoid storing certain text data using regex patterns, e.g. `^ [!TIP]
> Use `wl-paste --list-types` to find the available MIME types for the currently copied data in the
> Wayland clipboard.
### Image data from browsers
When copying images from browsers, `wl-paste` will usually pass the data to `clipvault` as `text/html`.
This is not ideal for copying images, and you probably want to have the raw image data copied instead.
If so, you can either *only* forward image data, or, more realistically, use the commands below to
copy the image data directly, and ignore the `text/html`:
```sh
# Forward all data, ignoring text that starts with "
dmenu
```sh
clipvault list | dmenu | clipvault get | wl-copy
```
fzf
```sh
clipvault list | fzf --no-sort -d $'\t' --with-nth 2 | clipvault get | wl-copy
```
rofi
```sh
clipvault list | rofi -dmenu -display-columns 2 | clipvault get | wl-copy
```
fuzzel
```sh
clipvault list | fuzzel --dmenu --with-nth 2 | clipvault get | wl-copy
```
wofi
```sh
clipvault list | wofi -S dmenu --pre-display-cmd "echo '%s' | cut -f 2" | clipvault get | wl-copy
```
Note also that by default `wofi` may sort entries alphabetically or by its cache. To display entries
in the order they are produced, try adding the following arguments to the `wofi` call above:
```sh
-d -k /dev/null
```
tofi
```sh
clipvault list | tofi | clipvault get | wl-copy
```
For more advanced setups, checkout some of the scripts in the [extras](./extras/) directory.
Contributions are welcome.
> [!TIP]
> To avoid proceeding with copying if no entry was selected in the picker, try replacing
> `clipvault get | wl-copy` from any of the above commands with
> `{ read -r output && clipvault get <<< "$output" | wl-copy }`
## Configuration
While there is no support for a dedicated configuration file, `clipvault` *does* support loading additional
CLI arguments from files, thanks to [argfile](https://docs.rs/argfile/latest/argfile/).
To use this functionality, create a file with one argument per line, like [this example](./extras/argfile.txt).
Then, provide its path to the CLI using:
```sh
clipvault @/path/to/argfile
```
> [!TIP]
> Most options can also be set using environment variables - check out the `help` output
> for each command to find the specific variable to set for each.
## Contributing
All contributions are welcome. If you run into any problems, or have any suggestions/feedback, feel free to open an issue.
This project is written in Rust, so for contributing code:
1. Ensure [rustup](https://rustup.rs/) is installed - this project uses the stable toolchain for
most things, but nightly for the formatting.
2. Make your changes and ensure they work as expected - `cargo run -- your_args_here`.
3. Lint + format + run tests:
```rust
cargo clippy --all -- -W clippy::all && cargo +nightly fmt && cargo test
```
4. LGTM 👍
I like [just](https://github.com/casey/just), so I keep some utility commands in the [justfile](./justfile).
Check that out for additional checks which are run in the CI.
## Similar programs
- [cliphist](https://github.com/sentriz/cliphist)
- [cliprust](https://github.com/aulimaru/cliprust)
## Acknowledgements
- [cliphist](https://github.com/sentriz/cliphist) of course
- All the [dependencies](./Cargo.toml) of this project, and all [their dependencies](./Cargo.lock) too
## License
This code is licensed under the [AGPLv3](https://www.gnu.org/licenses/agpl-3.0.en.html#license-text).
See the [LICENSE](./LICENSE) file for more details.