mirror of
https://github.com/neoromantique/dotfiles.git
synced 2026-03-13 21:53:20 +03:00
295 lines
7.5 KiB
Fish
295 lines
7.5 KiB
Fish
# Man pages with bat
|
|
set -g fish_greeting
|
|
set -x MANROFFOPT "-c"
|
|
set -x MANPAGER "sh -c 'col -bx | bat -l man -p'"
|
|
|
|
# ~/.local/bin
|
|
fish_add_path -m $HOME/.local/bin
|
|
|
|
# LM Studio
|
|
fish_add_path $HOME/.lmstudio/bin
|
|
|
|
# Bun
|
|
fish_add_path ~/.bun/bin
|
|
|
|
# Backblaze B2
|
|
alias backblaze-b2=bbb2
|
|
|
|
# SSHS (optional)
|
|
if command -q sshs
|
|
alias ss=sshs
|
|
end
|
|
|
|
# Scaleway (lazy-load)
|
|
function scw --wraps=scw
|
|
functions -e scw
|
|
eval (command scw autocomplete script shell=fish)
|
|
command scw $argv
|
|
end
|
|
|
|
# Kubernetes
|
|
set -e SHOW_K8S
|
|
kubeswitch kubectl-alias kubectl
|
|
kubeswitch inherit-env
|
|
set -gx KUBECONFIG /dev/null
|
|
|
|
# History with timestamps
|
|
function history
|
|
builtin history --show-time='%F %T '
|
|
end
|
|
|
|
# Atuin history (fuzzy search + sync)
|
|
if status is-interactive; and command -q atuin
|
|
atuin init fish | source
|
|
if functions -q _atuin_search
|
|
bind \cr _atuin_search
|
|
end
|
|
end
|
|
|
|
# Ctrl+S launches sshs when available
|
|
if status is-interactive; and command -q sshs
|
|
function __sshs_launch --description "Launch sshs via keybind"
|
|
commandline -f cancel
|
|
sshs
|
|
end
|
|
bind \cs __sshs_launch
|
|
end
|
|
|
|
# Bash-style !! and !$
|
|
function __history_previous_command
|
|
switch (commandline -t)
|
|
case "!"
|
|
commandline -t $history[1]; commandline -f repaint
|
|
case "*"
|
|
commandline -i !
|
|
end
|
|
end
|
|
|
|
function __history_previous_command_arguments
|
|
switch (commandline -t)
|
|
case "!"
|
|
commandline -t ""
|
|
commandline -f history-token-search-backward
|
|
case "*"
|
|
commandline -i '$'
|
|
end
|
|
end
|
|
|
|
bind ! __history_previous_command
|
|
bind '$' __history_previous_command_arguments
|
|
|
|
# Terminal SSH background color derived from server IP (Ghostty/Foot)
|
|
if not set -q TERM_SSH_BG_RESET
|
|
# Match configured terminal background as the reset target.
|
|
set -gx TERM_SSH_BG_RESET "#141414"
|
|
end
|
|
|
|
function __term_supports_osc11 --description "Check if terminal supports OSC 11 bg color"
|
|
if not status is-interactive
|
|
return 1
|
|
end
|
|
|
|
# Ghostty
|
|
if test "$TERM_PROGRAM" = "ghostty"
|
|
return 0
|
|
else if string match -q "*ghostty*" "$TERM"
|
|
return 0
|
|
else if set -q GHOSTTY
|
|
return 0
|
|
end
|
|
|
|
# Foot
|
|
if string match -q "foot*" "$TERM"
|
|
return 0
|
|
end
|
|
|
|
return 1
|
|
end
|
|
|
|
function __term_bg_set_from_ip --description "Set terminal background derived from IP"
|
|
if not __term_supports_osc11
|
|
return
|
|
end
|
|
|
|
if test (count $argv) -lt 1
|
|
return
|
|
end
|
|
|
|
set -l server_ip $argv[1]
|
|
if test -z "$server_ip"
|
|
return
|
|
end
|
|
|
|
set -l hash (printf '%s' "$server_ip" | cksum | awk '{print $1}')
|
|
set -l base_r 20
|
|
set -l base_g 20
|
|
set -l base_b 20
|
|
set -l r_delta (math --scale 0 "($hash % 49) - 24")
|
|
set -l g_delta (math --scale 0 "(($hash / 49) % 49) - 24")
|
|
set -l b_delta (math --scale 0 "(($hash / 2401) % 49) - 24")
|
|
set -l r (math --scale 0 "$base_r + $r_delta")
|
|
set -l g (math --scale 0 "$base_g + $g_delta")
|
|
set -l b (math --scale 0 "$base_b + $b_delta")
|
|
|
|
if test $r -lt 0; set r 0; end
|
|
if test $g -lt 0; set g 0; end
|
|
if test $b -lt 0; set b 0; end
|
|
if test $r -gt 255; set r 255; end
|
|
if test $g -gt 255; set g 255; end
|
|
if test $b -gt 255; set b 255; end
|
|
|
|
printf '\e]11;#%02x%02x%02x\a' $r $g $b
|
|
set -g __term_ssh_bg_active 1
|
|
end
|
|
|
|
function __term_ssh_bg --description "Set terminal background for SSH"
|
|
if not __term_supports_osc11
|
|
return
|
|
end
|
|
|
|
if not set -q SSH_CONNECTION
|
|
return
|
|
end
|
|
|
|
set -l server_ip (string split " " -- $SSH_CONNECTION)[3]
|
|
__term_bg_set_from_ip $server_ip
|
|
end
|
|
|
|
set -g __term_ssh_in_progress 0
|
|
function __term_ssh_postexec_reset --on-event fish_postexec --description "Reset terminal background after SSH command"
|
|
if test $__term_ssh_in_progress -eq 1
|
|
__term_ssh_bg_reset --force
|
|
set -g __term_ssh_in_progress 0
|
|
end
|
|
end
|
|
|
|
function __term_ssh_prompt_reset --on-event fish_prompt --description "Reset terminal background on prompt redraw after SSH"
|
|
if test $__term_ssh_in_progress -eq 1
|
|
__term_ssh_bg_reset --force
|
|
set -g __term_ssh_in_progress 0
|
|
end
|
|
if set -q __term_ssh_bg_active; and test $__term_ssh_bg_active -eq 1
|
|
__term_ssh_bg_reset --force
|
|
end
|
|
end
|
|
|
|
function __term_ssh_ctrl_c --description "Reset terminal background before Ctrl+C"
|
|
if set -q __term_ssh_bg_active; and test $__term_ssh_bg_active -eq 1
|
|
__term_ssh_bg_reset --force
|
|
end
|
|
commandline -f cancel-commandline
|
|
end
|
|
|
|
bind \cc __term_ssh_ctrl_c
|
|
|
|
function __term_ssh_bg_reset --on-event fish_exit --description "Reset terminal background after SSH"
|
|
set -l force 0
|
|
if test (count $argv) -gt 0; and test "$argv[1]" = "--force"
|
|
set force 1
|
|
end
|
|
|
|
if not __term_supports_osc11
|
|
return
|
|
end
|
|
|
|
if test $force -ne 1; and not set -q SSH_CONNECTION
|
|
return
|
|
end
|
|
|
|
if set -q TERM_SSH_BG_RESET
|
|
printf '\e]11;%s\a' "$TERM_SSH_BG_RESET"
|
|
else
|
|
printf '\e]111\a'
|
|
end
|
|
set -g __term_ssh_bg_active 0
|
|
end
|
|
|
|
__term_ssh_bg
|
|
|
|
function __term_wrap_ssh --on-event fish_prompt --description "Wrap ssh for terminal bg color"
|
|
if functions -q __term_ssh_wrapped
|
|
return
|
|
end
|
|
|
|
if not command -q ssh
|
|
return
|
|
end
|
|
|
|
set -g __term_use_ssh_function 0
|
|
if functions -q ssh
|
|
functions -c ssh __term_ssh_orig
|
|
functions -e ssh
|
|
set -g __term_use_ssh_function 1
|
|
end
|
|
|
|
function ssh --wraps=__term_ssh_orig --description "SSH with terminal background color per target"
|
|
set -l host ""
|
|
set -l skip_next 0
|
|
set -l after_ddash 0
|
|
|
|
for arg in $argv
|
|
if test $skip_next -eq 1
|
|
set skip_next 0
|
|
continue
|
|
end
|
|
|
|
if test "$arg" = "--"
|
|
set after_ddash 1
|
|
continue
|
|
end
|
|
|
|
if test $after_ddash -eq 0; and string match -q -- "-*" $arg
|
|
switch $arg
|
|
case "-b" "-c" "-D" "-E" "-e" "-F" "-I" "-i" "-J" "-L" "-l" "-m" "-O" "-o" "-p" "-Q" "-R" "-S" "-W" "-w"
|
|
set skip_next 1
|
|
continue
|
|
case "-b*" "-c*" "-D*" "-E*" "-e*" "-F*" "-I*" "-i*" "-J*" "-L*" "-l*" "-m*" "-O*" "-o*" "-p*" "-Q*" "-R*" "-S*" "-W*" "-w*"
|
|
continue
|
|
case "-B" "-G" "-K" "-M" "-N" "-n" "-T" "-t" "-v" "-V" "-x" "-X" "-Y" "-y" "-q" "-f" "-g" "-k"
|
|
continue
|
|
end
|
|
end
|
|
|
|
if test -z "$host"
|
|
set host $arg
|
|
break
|
|
end
|
|
end
|
|
|
|
if __term_supports_osc11; and test -n "$host"
|
|
set -l host_only (string split "@" -- $host)[-1]
|
|
set -l resolved ""
|
|
|
|
if command -q getent
|
|
set resolved (getent ahosts $host_only 2>/dev/null | awk 'NR==1 {print $1}')
|
|
end
|
|
|
|
if test -z "$resolved"; and command -q host
|
|
set resolved (host $host_only 2>/dev/null | awk '/has address/ {print $4; exit}')
|
|
end
|
|
|
|
if test -n "$resolved"
|
|
__term_bg_set_from_ip $resolved
|
|
end
|
|
end
|
|
|
|
set -g __term_ssh_in_progress 1
|
|
if test $__term_use_ssh_function -eq 1
|
|
__term_ssh_orig $argv
|
|
else
|
|
command ssh $argv
|
|
end
|
|
set -l ssh_status $status
|
|
|
|
if __term_supports_osc11
|
|
__term_ssh_bg_reset --force
|
|
end
|
|
set -g __term_ssh_in_progress 0
|
|
|
|
return $ssh_status
|
|
end
|
|
|
|
function __term_ssh_wrapped --description "Marker for wrapped ssh"
|
|
end
|
|
end
|