feat: start nushell hooks

This commit is contained in:
Conrad Ludgate 2021-09-13 08:28:08 +01:00
parent 72f2f59a11
commit 16f661cbe6
No known key found for this signature in database
GPG Key ID: 3DD1A1DB3CB4BF63
8 changed files with 62 additions and 13 deletions

View File

@ -165,6 +165,25 @@ Then setup Atuin
echo 'eval "$(atuin init bash)"' >> ~/.bashrc
```
### nushell
#### Manual
Open up your config file in your editor (run `config path` to locate the file).
Add these two items to your startup section
```
"atuin init nushell | save ~/.atuin.nu",
"source ~/.atuin.nu",
```
#### Automatic
```nu
config get startup | append 'atuin init nushell | save ~/.atuin.nu' | append 'source ~/.atuin.nu' | config set_into startup
```
## ...what's with the name?
Atuin is named after "The Great A'Tuin", a giant turtle from Terry Pratchett's

View File

@ -6,9 +6,9 @@ use eyre::Result;
use crate::history::History;
pub mod bash;
pub mod nu;
pub mod resh;
pub mod zsh;
pub mod nu;
// this could probably be sped up
fn count_lines(buf: &mut BufReader<impl Read + Seek>) -> Result<usize> {

View File

@ -35,10 +35,7 @@ impl Importer for Nu {
let mut hist = history::History::new();
hist.load(path)?;
let len = hist.len();
Ok(Self {
hist,
iter: 0..len,
})
Ok(Self { hist, iter: 0..len })
}
}

View File

@ -60,7 +60,7 @@ pub enum Cmd {
},
}
#[allow(clippy::clippy::cast_sign_loss)]
#[allow(clippy::cast_sign_loss)]
pub fn print_list(h: &[History], human: bool, cmd_only: bool) {
let mut writer = TabWriter::new(std::io::stdout()).padding(2);

View File

@ -37,8 +37,9 @@ pub enum Cmd {
#[structopt(
about="import history from the nu history file",
aliases=&["nu"],
)]
Nu,
Nushell,
}
const BATCH_SIZE: usize = 100;
@ -72,7 +73,7 @@ impl Cmd {
Self::Zsh => import::<Zsh<_>, _>(db, BATCH_SIZE).await,
Self::Bash => import::<Bash<_>, _>(db, BATCH_SIZE).await,
Self::Resh => import::<Resh, _>(db, BATCH_SIZE).await,
Self::Nu => import::<Nu, _>(db, BATCH_SIZE).await,
Self::Nushell => import::<Nu, _>(db, BATCH_SIZE).await,
}
}
}

View File

@ -7,6 +7,8 @@ pub enum Cmd {
Zsh,
#[structopt(about = "bash setup")]
Bash,
#[structopt(about = "nu setup")]
Nushell,
}
fn init_zsh() {
@ -19,11 +21,17 @@ fn init_bash() {
println!("{}", full);
}
fn init_nu() {
let full = include_str!("../shell/atuin.nu");
println!("{}", full);
}
impl Cmd {
pub fn run(&self) -> Result<()> {
match self {
Self::Zsh => init_zsh(),
Self::Bash => init_bash(),
Self::Nushell => init_nu(),
}
Ok(())
}

View File

@ -31,7 +31,7 @@ struct State {
}
impl State {
#[allow(clippy::clippy::cast_sign_loss)]
#[allow(clippy::cast_sign_loss)]
fn durations(&self) -> Vec<(String, String)> {
self.results
.iter()
@ -179,7 +179,7 @@ async fn key_handler(
app: &mut State,
) -> Option<String> {
match input {
Key::Esc | Key::Ctrl('c') | Key::Ctrl('d') | Key::Ctrl('g') => {
Key::Esc | Key::Ctrl('c' | 'd' | 'g') => {
return Some(String::from(""))
}
Key::Char('\n') => {
@ -241,7 +241,7 @@ async fn key_handler(
None
}
#[allow(clippy::clippy::cast_possible_truncation)]
#[allow(clippy::cast_possible_truncation)]
fn draw<T: Backend>(f: &mut Frame<'_, T>, history_count: i64, app: &mut State) {
let chunks = Layout::default()
.direction(Direction::Vertical)
@ -312,7 +312,7 @@ fn draw<T: Backend>(f: &mut Frame<'_, T>, history_count: i64, app: &mut State) {
// this is a big blob of horrible! clean it up!
// for now, it works. But it'd be great if it were more easily readable, and
// modular. I'd like to add some more stats and stuff at some point
#[allow(clippy::clippy::cast_possible_truncation)]
#[allow(clippy::cast_possible_truncation)]
async fn select_history(
query: &[String],
search_mode: SearchMode,
@ -350,7 +350,7 @@ async fn select_history(
// This is supposed to more-or-less mirror the command line version, so ofc
// it is going to have a lot of args
#[allow(clippy::clippy::clippy::too_many_arguments)]
#[allow(clippy::clippy::too_many_arguments)]
pub async fn run(
settings: &Settings,
cwd: Option<String>,

24
src/shell/atuin.nu Normal file
View File

@ -0,0 +1,24 @@
# Default prompt for Nushell.
def __atuin_prompt [] {
let git = $'(do -i {git rev-parse --abbrev-ref HEAD} | str trim)'
let git = (if ($git | str length) == 0 {
''
} {
build-string (char lparen) (ansi cb) $git (ansi reset) (char rparen)
})
build-string (ansi gb) (pwd) (ansi reset) $git '> '
}
# Hook to add new entries to the database.
def __atuin_hook [] {
echo command took $CMD_DURATION_MS
}
# Initialize hook.
let-env PROMPT_STRING = (
let prompt = (if ($nu.env | select PROMPT_STRING | empty?) {
if ($nu.config | select prompt | empty?) { '__atuin_prompt' } { $nu.config.prompt }
} { $nu.env.PROMPT_STRING });
if ($prompt | str contains '__atuin_hook') { $prompt } { $'__atuin_hook;($prompt)' }
)