2024-01-01 23:07:12 +03:00
< p align = "center" >
2023-12-16 12:23:31 +03:00
< picture >
< source media = "(prefers-color-scheme: dark)" srcset = "https://github.com/atuinsh/atuin/assets/53315310/13216a1d-1ac0-4c99-b0eb-d88290fe0efd" >
< img alt = "Text changing depending on mode. Light: 'So light!' Dark: 'So dark!'" src = "https://github.com/atuinsh/atuin/assets/53315310/08bc86d4-a781-4aaa-8d7e-478ae6bcd129" >
< / picture >
2022-05-10 13:47:08 +03:00
< / p >
2021-02-14 19:23:08 +03:00
2021-04-26 13:59:00 +03:00
< p align = "center" >
< em > magical shell history< / em >
< / p >
2022-05-10 13:47:08 +03:00
< hr / >
2021-02-14 19:23:08 +03:00
< p align = "center" >
2023-07-31 01:08:00 +03:00
< a href = "https://github.com/atuinsh/atuin/actions?query=workflow%3ARust" > < img src = "https://img.shields.io/github/actions/workflow/status/atuinsh/atuin/rust.yml?style=flat-square" / > < / a >
2021-02-14 19:23:08 +03:00
< a href = "https://crates.io/crates/atuin" > < img src = "https://img.shields.io/crates/v/atuin.svg?style=flat-square" / > < / a >
< a href = "https://crates.io/crates/atuin" > < img src = "https://img.shields.io/crates/d/atuin.svg?style=flat-square" / > < / a >
2023-07-31 01:08:00 +03:00
< a href = "https://github.com/atuinsh/atuin/blob/main/LICENSE" > < img src = "https://img.shields.io/crates/l/atuin.svg?style=flat-square" / > < / a >
2022-03-18 00:21:27 +03:00
< a href = "https://discord.gg/Fq8bJSKPHh" > < img src = "https://img.shields.io/discord/954121165239115808" / > < / a >
2023-03-01 01:29:34 +03:00
< a rel = "me" href = "https://hachyderm.io/@atuin" > < img src = "https://img.shields.io/mastodon/follow/109944632283122560?domain=https%3A%2F%2Fhachyderm.io&style=social" / > < / a >
2023-03-01 01:27:06 +03:00
< a href = "https://twitter.com/atuinsh" > < img src = "https://img.shields.io/twitter/follow/atuinsh?style=social" / > < / a >
2023-12-12 18:33:19 +03:00
< a href = "https://actuated.dev/" > < img alt = "Arm CI sponsored by Actuated" src = "https://docs.actuated.dev/images/actuated-badge.png" width = "120px" > < / img > < / a >
2021-02-14 19:23:08 +03:00
< / p >
2021-04-26 16:25:57 +03:00
2022-05-10 13:47:08 +03:00
[English] | [简体中文]
Atuin replaces your existing shell history with a SQLite database, and records
additional context for your commands. Additionally, it provides optional and
_fully encrypted_ synchronisation of your history between machines, via an Atuin
server.
2021-04-26 16:25:57 +03:00
< p align = "center" >
< img src = "demo.gif" alt = "animated" width = "80%" / >
< / p >
< p align = "center" >
< em > exit code, duration, time and command shown< / em >
< / p >
2022-05-01 11:25:12 +03:00
2022-05-10 13:47:08 +03:00
2021-05-07 18:58:57 +03:00
As well as the search UI, it can do things like this:
```
# search for all successful `make` commands, recorded after 3pm yesterday
atuin search --exit 0 --after "yesterday 3pm" make
```
You may use either the server I host, or host your own! Or just don't use sync
at all. As all history sync is encrypted, I couldn't access your data even if
I wanted to. And I **really** don't want to.
## Features
2022-12-24 20:18:44 +03:00
- rebind `ctrl-r` and `up` (configurable) to a full screen history search UI
2021-04-25 20:21:52 +03:00
- store shell history in a sqlite database
2021-05-07 18:58:57 +03:00
- backup and sync **encrypted** shell history
- the same history across terminals, across sessions, and across machines
2021-04-25 20:21:52 +03:00
- log exit code, cwd, hostname, session, command duration, etc
- calculate statistics such as "most used command"
- old history file is not replaced
2021-05-10 23:28:07 +03:00
- quick-jump to previous items with < kbd > Alt-\<num\></ kbd >
2022-04-22 23:05:02 +03:00
- switch filter modes via ctrl-r; search history just from the current session, directory, or globally
2024-01-10 11:18:47 +03:00
- enter to execute a command, tab to edit
2021-04-25 20:21:52 +03:00
## Documentation
- [Quickstart ](#quickstart )
- [Install ](#install )
2023-02-26 02:29:59 +03:00
- [Import ](https://atuin.sh/docs/commands/import )
- [Configuration ](https://atuin.sh/docs/config )
- [Searching history ](https://atuin.sh/docs/commands/search )
- [Cloud history sync ](https://atuin.sh/docs/commands/sync )
- [History stats ](https://atuin.sh/docs/commands/stats )
- [Self host Atuin server ](https://atuin.sh/docs/self-hosting )
2023-08-17 23:42:57 +03:00
- [Key binding ](https://atuin.sh/docs/key-binding )
2023-02-26 02:29:59 +03:00
- [Shell completions ](https://atuin.sh/docs/commands/shell-completions )
2021-02-13 23:54:35 +03:00
2021-02-16 02:33:30 +03:00
## Supported Shells
- zsh
2021-04-26 13:50:31 +03:00
- bash
2021-12-11 12:48:53 +03:00
- fish
2023-03-26 17:44:31 +03:00
- nushell
2022-03-18 00:21:27 +03:00
## Community
2023-12-13 02:42:14 +03:00
### Forum
Atuin has a community forum, please ask here for help and support: https://forum.atuin.sh/
### Discord
2023-12-31 22:14:24 +03:00
Atuin also has a community Discord, available [here ](https://discord.gg/jR3tfchVvW )
2021-02-16 02:33:30 +03:00
2021-04-25 20:21:52 +03:00
# Quickstart
2021-08-11 19:59:28 +03:00
## With the default sync server
This will sign you up for the default sync server, hosted by me. Everything is end-to-end encrypted, so your secrets are safe!
Read more below for offline-only usage, or for hosting your own server.
2021-04-25 20:21:52 +03:00
```
2023-12-14 11:19:51 +03:00
# bash/zsh/etc
2023-12-14 11:04:54 +03:00
bash < (curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh)
2021-04-25 20:21:52 +03:00
2023-12-14 11:19:51 +03:00
# fish
bash (curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh | psub)
2023-05-17 00:03:53 +03:00
atuin register -u < USERNAME > -e < EMAIL >
2021-04-25 20:21:52 +03:00
atuin import auto
atuin sync
```
2023-02-10 12:08:42 +03:00
Then restart your shell!
2021-08-11 19:59:28 +03:00
## Offline only (no sync)
```
2023-07-31 01:08:00 +03:00
bash < (curl https://raw.githubusercontent.com/atuinsh/atuin/main/install.sh)
2021-08-11 19:59:28 +03:00
atuin import auto
```
2023-05-09 14:18:04 +03:00
By default, Atuin will check for updates. You can [disable update checks by modifying ](https://atuin.sh/docs/config/#update_check ) `config.toml` .
2021-04-25 20:21:52 +03:00
2023-02-10 12:08:42 +03:00
Then restart your shell!
2021-02-13 23:54:35 +03:00
## Install
2024-01-03 19:41:25 +03:00
< details >
< summary > Packaging status< / summary >
< a href = "https://repology.org/project/atuin/versions" >
< img src = "https://repology.org/badge/vertical-allrepos/atuin.svg?columns=3" alt = "Packaging status" >
< / a >
< / details >
2021-04-26 13:50:31 +03:00
### Script (recommended)
2021-02-16 02:33:30 +03:00
2021-04-26 13:50:31 +03:00
The install script will help you through the setup, ensuring your shell is
properly configured. It will also use one of the below methods, preferring the
2021-12-10 01:51:55 +03:00
system package manager where possible (pacman, homebrew, etc etc).
2021-02-16 02:33:30 +03:00
2021-02-15 02:33:14 +03:00
```
2021-04-26 13:50:31 +03:00
# do not run this as root, root will be asked for if required
2023-07-31 01:08:00 +03:00
bash < (curl https://raw.githubusercontent.com/atuinsh/atuin/main/install.sh)
2021-02-15 02:33:14 +03:00
```
2022-10-08 06:36:49 +03:00
And then follow [the shell setup ](#shell-plugin )
2021-02-15 02:33:14 +03:00
### With cargo
2021-02-16 02:33:30 +03:00
2021-04-25 20:21:52 +03:00
It's best to use [rustup ](https://rustup.rs/ ) to get setup with a Rust
toolchain, then you can run:
2021-02-13 23:54:35 +03:00
2021-02-14 21:20:18 +03:00
```
2021-02-15 02:33:14 +03:00
cargo install atuin
2021-02-14 21:20:18 +03:00
```
2022-05-20 01:34:29 +03:00
And then follow [the shell setup ](#shell-plugin )
2021-02-14 21:20:18 +03:00
2021-05-08 17:06:40 +03:00
### Homebrew
```
brew install atuin
```
2022-04-14 01:49:38 +03:00
2022-05-20 01:34:29 +03:00
And then follow [the shell setup ](#shell-plugin )
2022-04-14 01:49:38 +03:00
### MacPorts
Atuin is also available in [MacPorts ](https://ports.macports.org/port/atuin/ )
```
sudo port install atuin
```
2022-05-20 01:34:29 +03:00
And then follow [the shell setup ](#shell-plugin )
2021-05-08 17:06:40 +03:00
2023-02-15 12:04:07 +03:00
### Nix
This repository is a flake, and can be installed using `nix profile` :
```
2023-07-31 01:08:00 +03:00
nix profile install "github:atuinsh/atuin"
2023-02-15 12:04:07 +03:00
```
Atuin is also available in [nixpkgs ](https://github.com/NixOS/nixpkgs ):
```
nix-env -f '< nixpkgs > ' -iA atuin
```
And then follow [the shell setup ](#shell-plugin )
2021-12-10 01:51:55 +03:00
### Pacman
2021-04-26 13:50:31 +03:00
2023-05-30 12:49:00 +03:00
Atuin is available in the Arch Linux [[extra] repository](https://archlinux.org/packages/extra/x86_64/atuin/):
2021-04-26 13:50:31 +03:00
```
2021-12-10 01:51:55 +03:00
pacman -S atuin
2021-04-26 13:50:31 +03:00
```
2022-05-20 01:34:29 +03:00
And then follow [the shell setup ](#shell-plugin )
2021-04-26 13:50:31 +03:00
2023-12-14 11:19:42 +03:00
### Xbps
Atuin is available in the Void Linux [repository ](https://github.com/void-linux/void-packages/tree/master/srcpkgs/atuin ):
```
sudo xbps-install atuin
```
And then follow [the shell setup ](#shell-plugin )
2022-09-25 19:14:51 +03:00
### Termux
Atuin is available in the Termux package repository:
```
pkg install atuin
```
And then follow [the shell setup ](#shell-plugin )
2021-02-15 02:33:14 +03:00
### From source
2021-02-16 02:33:30 +03:00
2021-02-13 23:54:35 +03:00
```
2023-07-31 01:08:00 +03:00
git clone https://github.com/atuinsh/atuin.git
2023-05-06 17:35:24 +03:00
cd atuin/atuin
2021-02-15 02:33:14 +03:00
cargo install --path .
2021-02-13 23:54:35 +03:00
```
2022-05-20 01:34:29 +03:00
And then follow [the shell setup ](#shell-plugin )
2021-02-13 23:54:35 +03:00
2021-04-26 13:50:31 +03:00
## Shell plugin
Once the binary is installed, the shell plugin requires installing. If you use
2023-02-10 12:08:42 +03:00
the install script, this should all be done for you! After installing, remember to restart your shell.
2021-04-26 13:50:31 +03:00
### zsh
```
echo 'eval "$(atuin init zsh)"' >> ~/.zshrc
```
2022-11-02 23:57:37 +03:00
#### Zinit
2021-05-12 23:47:06 +03:00
2022-11-02 23:57:37 +03:00
```sh
2023-07-31 01:08:00 +03:00
zinit load atuinsh/atuin
2021-05-12 23:47:06 +03:00
```
2022-11-02 23:57:37 +03:00
#### Antigen
```sh
2023-07-31 01:08:00 +03:00
antigen bundle atuinsh/atuin@main
2022-11-02 23:57:37 +03:00
```
2021-04-26 13:50:31 +03:00
### bash
2021-02-13 23:54:35 +03:00
2023-11-11 02:58:05 +03:00
#### [ble.sh](https://github.com/akinomyoga/ble.sh)
2021-02-13 23:54:35 +03:00
fix(bash): improve the support for `enter_accept` with `ble.sh` (#1465)
* feat(bash): check version of ble.sh
blehooks are only supported in ble.sh >= 0.4, so we require the ble.sh
version to be larger or equal to 0.4. We also describe the version
requirement in README.md.
* fix(bash): use ble.sh's contrib/integration/bash-preexec
ble.sh provides module "contrib/integration/bash-preexec", which can
be used with the same interface as bash-preexec. This module provides
"preexec_functions" and "precmd_functions" without requiring
bash-preexec.
This module also properly handles it when both ble.sh and bash-preexec
are loaded; the module resolves the conflicts between ble.sh and
bash-preexec, and the module also tries to support bash-preexec in the
detached state of ble.sh.
* fix(bash): use ble.sh's accept-line widget for enter_accept
In ble.sh, one can directly call the widget "accept-line" from a shell
script. The widget "accept-line" is the actual widget that reserves
the command execution in ble.sh, so calling "accept-line" is
equivalent to the normal execution. It includes all the necessary
adjustments and processing including stty and history.
In addition, the command will be executed at the top-level context
instead in a function scope. For example, without ble.sh, running
"declare -A dict=()" through enter_accept will create an associative
array in the function scope unexpectedly. With ble.sh, since the
command is executed at the top-level context, such a problem does not
happen.
When ble.sh is in a detached state, we fall back to the manual
execution of the command. In this case, we cannot assume the
existence of the shell function "__bp_set_ret_value", so we always use
__atuin_set_ret_value.
2023-12-28 23:08:45 +03:00
Atuin works best in bash when using [ble.sh ](https://github.com/akinomyoga/ble.sh ) >= 0.4.
2023-11-11 02:58:05 +03:00
fix(bash): improve the support for `enter_accept` with `ble.sh` (#1465)
* feat(bash): check version of ble.sh
blehooks are only supported in ble.sh >= 0.4, so we require the ble.sh
version to be larger or equal to 0.4. We also describe the version
requirement in README.md.
* fix(bash): use ble.sh's contrib/integration/bash-preexec
ble.sh provides module "contrib/integration/bash-preexec", which can
be used with the same interface as bash-preexec. This module provides
"preexec_functions" and "precmd_functions" without requiring
bash-preexec.
This module also properly handles it when both ble.sh and bash-preexec
are loaded; the module resolves the conflicts between ble.sh and
bash-preexec, and the module also tries to support bash-preexec in the
detached state of ble.sh.
* fix(bash): use ble.sh's accept-line widget for enter_accept
In ble.sh, one can directly call the widget "accept-line" from a shell
script. The widget "accept-line" is the actual widget that reserves
the command execution in ble.sh, so calling "accept-line" is
equivalent to the normal execution. It includes all the necessary
adjustments and processing including stty and history.
In addition, the command will be executed at the top-level context
instead in a function scope. For example, without ble.sh, running
"declare -A dict=()" through enter_accept will create an associative
array in the function scope unexpectedly. With ble.sh, since the
command is executed at the top-level context, such a problem does not
happen.
When ble.sh is in a detached state, we fall back to the manual
execution of the command. In this case, we cannot assume the
existence of the shell function "__bp_set_ret_value", so we always use
__atuin_set_ret_value.
2023-12-28 23:08:45 +03:00
With ble.sh (>= 0.4) installed, just add atuin to your .bashrc
2023-11-11 02:58:05 +03:00
```bash
echo 'eval "$(atuin init bash)"' >> ~/.bashrc
2021-02-14 00:21:00 +03:00
```
2023-11-11 02:58:05 +03:00
fix(bash): improve the support for `enter_accept` with `ble.sh` (#1465)
* feat(bash): check version of ble.sh
blehooks are only supported in ble.sh >= 0.4, so we require the ble.sh
version to be larger or equal to 0.4. We also describe the version
requirement in README.md.
* fix(bash): use ble.sh's contrib/integration/bash-preexec
ble.sh provides module "contrib/integration/bash-preexec", which can
be used with the same interface as bash-preexec. This module provides
"preexec_functions" and "precmd_functions" without requiring
bash-preexec.
This module also properly handles it when both ble.sh and bash-preexec
are loaded; the module resolves the conflicts between ble.sh and
bash-preexec, and the module also tries to support bash-preexec in the
detached state of ble.sh.
* fix(bash): use ble.sh's accept-line widget for enter_accept
In ble.sh, one can directly call the widget "accept-line" from a shell
script. The widget "accept-line" is the actual widget that reserves
the command execution in ble.sh, so calling "accept-line" is
equivalent to the normal execution. It includes all the necessary
adjustments and processing including stty and history.
In addition, the command will be executed at the top-level context
instead in a function scope. For example, without ble.sh, running
"declare -A dict=()" through enter_accept will create an associative
array in the function scope unexpectedly. With ble.sh, since the
command is executed at the top-level context, such a problem does not
happen.
When ble.sh is in a detached state, we fall back to the manual
execution of the command. In this case, we cannot assume the
existence of the shell function "__bp_set_ret_value", so we always use
__atuin_set_ret_value.
2023-12-28 23:08:45 +03:00
Please make sure that the above line comes after sourcing ble.sh so atuin knows the presence of ble.sh.
2023-11-11 02:58:05 +03:00
#### [bash-preexec](https://github.com/rcaloras/bash-preexec)
[Bash-preexec ](https://github.com/rcaloras/bash-preexec ) can also be used, but you may experience some minor problems with the recorded duration and exit status of some commands.
To use bash-preexec, download and initialize it
```bash
2021-04-26 13:50:31 +03:00
curl https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh -o ~/.bash-preexec.sh
echo '[[ -f ~/.bash-preexec.sh ]] & & source ~/.bash-preexec.sh' >> ~/.bashrc
2021-02-14 00:21:00 +03:00
```
2021-02-13 23:54:35 +03:00
2021-04-26 13:50:31 +03:00
Then setup Atuin
2023-11-11 02:58:05 +03:00
```bash
2021-04-26 13:50:31 +03:00
echo 'eval "$(atuin init bash)"' >> ~/.bashrc
```
2021-03-11 00:24:08 +03:00
2023-05-16 23:58:05 +03:00
**PLEASE NOTE**
bash-preexec currently has an issue where it will stop honoring `ignorespace` . While Atuin will ignore commands prefixed with whitespace, they may still end up in your bash history. Please check your configuration! All other shells do not have this issue.
2021-12-11 12:48:53 +03:00
### fish
Add
```
atuin init fish | source
```
to your `is-interactive` block in your `~/.config/fish/config.fish` file
2022-06-16 23:27:38 +03:00
2023-03-26 17:44:06 +03:00
### Nushell
Run in *Nushell* :
```
mkdir ~/.local/share/atuin/
2024-01-09 19:37:57 +03:00
atuin init nu | save -f ~/.local/share/atuin/init.nu
2023-03-26 17:44:06 +03:00
```
Add to `config.nu` :
```
source ~/.local/share/atuin/init.nu
```
2023-05-02 05:43:30 +03:00
2023-12-10 14:13:43 +03:00
# Contributors
< a href = "https://github.com/atuinsh/atuin/graphs/contributors" >
< img src = "https://contrib.rocks/image?repo=atuinsh/atuin&max=300" / >
< / a >
Made with [contrib.rocks ](https://contrib.rocks ).
2023-05-02 05:43:30 +03:00
[English]: ./README.md
2023-05-06 17:35:24 +03:00
[简体中文]: ./docs/zh-CN/README.md