diff --git a/dot_config/fish/config.fish b/dot_config/fish/config.fish index 2ddf29f..a9dbec7 100644 --- a/dot_config/fish/config.fish +++ b/dot_config/fish/config.fish @@ -35,6 +35,7 @@ test -s ~/.config/envman/load.fish; and source ~/.config/envman/load.fish if status is-interactive atuin init fish | source + atuin ai init fish | source end # cmux @@ -44,3 +45,52 @@ fish_add_path "/home/prad/.cache/.bun/bin" for _f in $HOME/.config/herdr/plugins/github/herdr-automatic-rename-*/shell/hook.fish test -r "$_f"; and source "$_f"; and break end + + +# Question mark at start of line - natural language mode +function _atuin_ai_question_mark + set -l buf (commandline -b) + + # If buffer is empty or just contains '?', trigger natural language mode + if test -z "$buf" -o "$buf" = "?" + commandline -r "" + + # Close the semantic prompt zone (OSC 133 C) so terminals with + # shell integration don't erase the TUI's output during their + # resize-time prompt reflow. + printf '\033]133;C\007' > /dev/tty + + # Run atuin ai inline, swapping stdout and stderr + set -l output (atuin ai inline --hook 3>&1 1>&2 2>&3 | string collect) + + if string match --quiet '__atuin_ai_print__:*' "$output" + echo (string replace "__atuin_ai_print__:" "" -- "$output" | string collect) + commandline -f repaint + else if test "$output" = "__atuin_ai_cancel__" + commandline -f repaint + else if string match --quiet '__atuin_ai_execute__:*' "$output" + # Execute the command immediately + set -l cmd (string replace "__atuin_ai_execute__:" "" -- "$output" | string collect) + commandline -r "$cmd" + commandline -f repaint + commandline -f execute + else if string match --quiet '__atuin_ai_insert__:*' "$output" + # Insert the command for editing + set -l cmd (string replace "__atuin_ai_insert__:" "" -- "$output" | string collect) + commandline -r "$cmd" + commandline -f repaint + else if test -n "$output" + # Default: insert for editing + commandline -r "$output" + commandline -f repaint + else + commandline -f repaint + end + else if not contains -- "$fish_key_bindings" fish_vi_key_bindings fish_hybrid_key_bindings + # Not at empty prompt, just insert the question mark + commandline -i "?" + end +end + +# Set up keybindings +bind "?" _atuin_ai_question_mark diff --git a/dot_config/fish/functions/ai.fish b/dot_config/fish/functions/ai.fish index dff55e5..447b452 100644 --- a/dot_config/fish/functions/ai.fish +++ b/dot_config/fish/functions/ai.fish @@ -11,3 +11,5 @@ function ai --description 'Choose and launch an AI CLI via gum' $choice end end + + diff --git a/dot_config/fish/functions/fish_user_key_bindings.fish b/dot_config/fish/functions/fish_user_key_bindings.fish index 2f1c283..a20a3c5 100644 --- a/dot_config/fish/functions/fish_user_key_bindings.fish +++ b/dot_config/fish/functions/fish_user_key_bindings.fish @@ -18,6 +18,7 @@ function fish_user_key_bindings bind -M $mode ctrl-o 'gho; commandline -f repaint' bind -M $mode ctrl-p 'pj; commandline -f repaint' bind -M $mode ctrl-a 'omp; commandline -f repaint' + bind -M $mode ctrl-w 'atuin ai inline; commandline -f repaint' # Arrow keys: atuin owns up (bound from config.fish, survives the # fish_vi_key_bindings reset above because that only erases presets),