Add init command (#12)

* Add init command

This makes setting up the shell part of A'tuin much easier. Eval the
output of "atuin init".

* Update readme, add up binding
This commit is contained in:
Ellie Huxtable 2021-02-15 23:33:30 +00:00 committed by GitHub
parent e980973ba0
commit 41f072a8b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 115 additions and 17 deletions

2
Cargo.lock generated
View file

@ -106,7 +106,7 @@ dependencies = [
[[package]] [[package]]
name = "atuin" name = "atuin"
version = "0.3.1" version = "0.3.2"
dependencies = [ dependencies = [
"chrono", "chrono",
"chrono-english", "chrono-english",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "atuin" name = "atuin"
version = "0.3.1" version = "0.3.2"
authors = ["Ellie Huxtable <e@elm.sh>"] authors = ["Ellie Huxtable <e@elm.sh>"]
edition = "2018" edition = "2018"
license = "MIT" license = "MIT"

View file

@ -25,15 +25,26 @@ As well as the expected command, A'tuin stores
- time - time
- a unique session ID - a unique session ID
## Supported Shells
- zsh
## Requirements
- [fzf](https://github.com/junegunn/fzf)
## Install ## Install
### AUR ### AUR
A'tuin is available on the [AUR](https://aur.archlinux.org/packages/atuin/) A'tuin is available on the [AUR](https://aur.archlinux.org/packages/atuin/)
``` ```
yay -S atuin # or your AUR helper of choice yay -S atuin # or your AUR helper of choice
``` ```
### With cargo ### With cargo
`atuin` needs a nightly version of Rust + Cargo! It's best to use `atuin` needs a nightly version of Rust + Cargo! It's best to use
[rustup](https://rustup.rs/) for getting set up there. [rustup](https://rustup.rs/) for getting set up there.
@ -44,6 +55,7 @@ cargo install atuin
``` ```
### From source ### From source
``` ```
rustup default nightly rustup default nightly
git clone https://github.com/ellie/atuin.git git clone https://github.com/ellie/atuin.git
@ -52,25 +64,51 @@ cargo install --path .
``` ```
### Shell plugin ### Shell plugin
Once the binary is installed, the shell plugin requires installing:
zplug: Once the binary is installed, the shell plugin requires installing. Add
``` ```
zplug "ellie/atuin", at:main eval "$(atuin init)"
``` ```
otherwise, clone the repo and `source /path/to/repo/atuin.plugin.zsh` in your `.zshrc` to your `.zshrc`/`.bashrc`/whatever your shell uses.
## Usage ## Usage
By default A'tuin will rebind ctrl-r to use fzf to fuzzy search your history. You ### History search
can specify a different fuzzy tool by changing the value of `ATUIN_FUZZY`:
By default A'tuin will rebind ctrl-r to use fzf to fuzzy search your history.
It will also rebind the up arrow to use fzf, just without sorting. You can
prevent this by putting
``` ```
export ATUIN_FUZZY=fzy export ATUIN_BINDKEYS="false"
``` ```
into your shell config.
You may also change the default history selection. The default behaviour will search your entire history, however
```
export ATUIN_HISTORY="atuin history list --cwd"
```
will switch to only searching history for the current directory.
Similarly,
```
export ATUIN_HISTORY="atuin history list --session"
```
will search for the current session only, and
```
export ATUIN_HISTORY="atuin history list --session --cwd"
```
will do both!
### Import history ### Import history
``` ```
@ -83,10 +121,28 @@ atuin import zsh # specify shell
### List history ### List history
List all history
``` ```
atuin history list atuin history list
``` ```
List history for the current directory
```
atuin history list --cwd
atuin h l -c # alternative, shorter version
```
List history for the current session
```
atuin history list --session
atuin h l -s # similarly short
```
### Stats ### Stats
A'tuin can calculate statistics for a single day, and accepts "natural language" style date input, as well as absolute dates: A'tuin can calculate statistics for a single day, and accepts "natural language" style date input, as well as absolute dates:

View file

@ -30,7 +30,7 @@ pub enum Cmd {
)] )]
List { List {
#[structopt(long, short)] #[structopt(long, short)]
dir: bool, cwd: bool,
#[structopt(long, short)] #[structopt(long, short)]
session: bool, session: bool,
@ -77,13 +77,13 @@ impl Cmd {
Ok(()) Ok(())
} }
Self::List { session, dir, .. } => { Self::List { session, cwd, .. } => {
const QUERY_SESSION: &str = "select * from history where session = ?;"; const QUERY_SESSION: &str = "select * from history where session = ?;";
const QUERY_DIR: &str = "select * from history where cwd = ?;"; const QUERY_DIR: &str = "select * from history where cwd = ?;";
const QUERY_SESSION_DIR: &str = const QUERY_SESSION_DIR: &str =
"select * from history where cwd = ?1 and session = ?2;"; "select * from history where cwd = ?1 and session = ?2;";
let params = (session, dir); let params = (session, cwd);
let cwd = env::current_dir()?.display().to_string(); let cwd = env::current_dir()?.display().to_string();
let session = env::var("ATUIN_SESSION")?; let session = env::var("ATUIN_SESSION")?;

19
src/command/init.rs Normal file
View file

@ -0,0 +1,19 @@
use std::env;
use eyre::{eyre, Result};
fn init_zsh() {
let full = include_str!("../shell/atuin.zsh");
println!("{}", full);
}
pub fn init() -> Result<()> {
let shell = env::var("SHELL")?;
if shell.ends_with("zsh") {
init_zsh();
Ok(())
} else {
Err(eyre!("Could not detect shell, or shell unsupported"))
}
}

View file

@ -6,6 +6,7 @@ use crate::local::database::Database;
mod history; mod history;
mod import; mod import;
mod init;
mod server; mod server;
mod stats; mod stats;
@ -26,6 +27,9 @@ pub enum AtuinCmd {
#[structopt(about = "calculate statistics for your history")] #[structopt(about = "calculate statistics for your history")]
Stats(stats::Cmd), Stats(stats::Cmd),
#[structopt(about = "output shell setup")]
Init,
#[structopt(about = "generates a UUID")] #[structopt(about = "generates a UUID")]
Uuid, Uuid,
} }
@ -41,6 +45,7 @@ impl AtuinCmd {
Self::Import(import) => import.run(db), Self::Import(import) => import.run(db),
Self::Server(server) => server.run(), Self::Server(server) => server.run(),
Self::Stats(stats) => stats.run(db), Self::Stats(stats) => stats.run(db),
Self::Init => init::init(),
Self::Uuid => { Self::Uuid => {
println!("{}", uuid_v4()); println!("{}", uuid_v4());

View file

@ -25,7 +25,7 @@ mod remote;
#[derive(StructOpt)] #[derive(StructOpt)]
#[structopt( #[structopt(
author = "Ellie Huxtable <e@elm.sh>", author = "Ellie Huxtable <e@elm.sh>",
version = "0.3.1", version = "0.3.2",
about = "Magical shell history" about = "Magical shell history"
)] )]
struct Atuin { struct Atuin {

View file

@ -1,6 +1,7 @@
# Source this in your ~/.zshrc # Source this in your ~/.zshrc
export ATUIN_SESSION=$(atuin uuid) export ATUIN_SESSION=$(atuin uuid)
export ATUIN_FUZZY=fzf export ATUIN_HISTORY="atuin history list"
export ATUIN_BINDKEYS="true"
_atuin_preexec(){ _atuin_preexec(){
id=$(atuin history start $1) id=$(atuin history start $1)
@ -19,10 +20,23 @@ _atuin_search(){
emulate -L zsh emulate -L zsh
zle -I zle -I
output=$(atuin history list --distinct | $ATUIN_FUZZY) output=$(eval $ATUIN_HISTORY | fzf)
if [[ -n $output ]] ; then if [[ -n $output ]] ; then
LBUFFER=$output BUFFER=$output
fi
zle reset-prompt
}
_atuin_up_search(){
emulate -L zsh
zle -I
output=$(eval $ATUIN_HISTORY | fzf --no-sort --tac)
if [[ -n $output ]] ; then
BUFFER=$output
fi fi
zle reset-prompt zle reset-prompt
@ -32,5 +46,9 @@ add-zsh-hook preexec _atuin_preexec
add-zsh-hook precmd _atuin_precmd add-zsh-hook precmd _atuin_precmd
zle -N _atuin_search_widget _atuin_search zle -N _atuin_search_widget _atuin_search
zle -N _atuin_up_search_widget _atuin_up_search
bindkey '^r' _atuin_search_widget if [[ $ATUIN_BINDKEYS == "true" ]]; then
bindkey '^r' _atuin_search_widget
bindkey '^[[A' _atuin_up_search_widget
fi