Files
dotfiles/config/fish/config.fish
T

226 lines
7.2 KiB
Fish

# ==============================================================================
# ENVIRONMENT VARIABLES
# ==============================================================================
# Disable fish greeting
set -g fish_greeting
alias nvim='/usr/local/nvim_012/bin/nvim'
# Core settings
set -gx EDITOR nvim
set -gx VISUAL nvim
set -gx MANPAGER "nvim +Man!"
set -gx BROWSER firefox
set -gx TERM xterm-256color
set -gx COLORTERM truecolor
set -gx LANG "en_US.UTF-8"
set -gx LC_ALL "en_US.UTF-8"
# Development
set -gx DEBUG 1
set -gx GOPATH "$HOME/.go"
set -gx GOCACHE "$HOME/.go/cache"
set -gx GOROOT /usr/local/go
set -gx PATH /usr/local/go/bin $GOPATH/bin $PATH
# Direnv
direnv hook fish | source
# ==============================================================================
# FZF configuration
# ==============================================================================
set -gx FZF_DEFAULT_OPTS "
--height 40%
--layout=reverse
--border
--ansi
--preview-window=down:30%
--bind 'ctrl-d:preview-page-down,ctrl-u:preview-page-up'
--color=fg:#ffffff,header:#f38ba8,info:#cba6ac,pointer:#f5e0dc
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6ac,hl+:#f38ba8"
set -gx FZF_DEFAULT_COMMAND 'fdfind --exclude={.git,.cache,.xmake,.zig-cache,build,tmp,node_modules,elpa} --type f -H'
# ==============================================================================
# PATH CONFIGURATION
# ==============================================================================
# Fish's 'fish_add_path' is smart: it checks if the dir exists and prevents duplicates.
fish_add_path "$HOME/.local/bin"
fish_add_path "$HOME/bin"
fish_add_path /usr/local/bin
fish_add_path "$HOME/.local/apps/nvim/bin"
fish_add_path "$HOME/.npm-global/bin"
fish_add_path /var/lib/flatpak/exports/bin
fish_add_path "$HOME/.local/share/flatpak/exports/bin"
fish_add_path /usr/local/go/bin
fish_add_path $GOPATH/bin
fish_add_path "$HOME/.local/bin"
fish_add_path "$HOME/bin"
# ==============================================================================
# ALIASES & ABBREVIATIONS
# ==============================================================================
# List commands
alias ls='ls -lh --color=auto --group-directories-first'
alias ll='ls -lAh --color=auto --group-directories-first'
alias la='ls -la --color=auto --group-directories-first'
alias l='ls -CF --color=auto'
alias tree='tree -C'
# Safety aliases
alias rm='rm -I --preserve-root'
alias mv='mv -i'
alias cp='cp -i'
alias ln='ln -i'
# System information
alias df='df -h'
alias du='du -h'
alias free='free -h'
alias top='btop'
alias cat='batcat --theme="gruvbox-dark" --paging=never '
# Application shortcuts
alias vim='nvim'
alias v='nvim'
alias :q='exit'
alias files='nautilus .'
alias lg='gitu'
alias ldk='lazydocker'
# Custom shortcuts
alias uz='7z'
alias dotman='bash ~/.dotfiles/install.sh'
alias reload='source ~/.config/fish/config.fish'
alias myip='curl ipinfo.io/ip; echo ""'
alias lspmake='bear -- make -B'
alias services-up='docker compose -f /home/jason/Documents/Compose/local-services/docker-compose.yaml up -d'
alias services-down='docker compose -f /home/jason/Documents/Compose/local-services/docker-compose.yaml down'
alias tc='tmux attach'
alias td='tmux detach'
alias db='lazysql'
# ==============================================================================
# FUNCTIONS
# ==============================================================================
# Project Manager
function pp
set -l project_file "$HOME/.projects"
# Create the file if it doesn't exist
if not test -f "$project_file"
touch "$project_file"
end
if count $argv >/dev/null
# Case 1: Path provided - Add to list
set -l absolute_path (realpath $argv[1])
if grep -Fxq "$absolute_path" "$project_file"
echo "Project already exists in list."
else
echo "$absolute_path" >>"$project_file"
echo "Added: $absolute_path"
end
else
# Case 2: No arguments - Select and Open
set -l selection (cat "$project_file" | awk -F'/' '{print $NF "\t" $0}' | fzf --height 40% --reverse --header="Select Project" --with-nth=1 --delimiter=(printf '\t') | cut -f2)
if test -n "$selection"
cd "$selection"
commandline -f repaint # Ensures the prompt updates after cd
hx
end
end
end
# Extract archive
function extract
if test (count $argv) -ne 1
echo "Usage: extract <archive>"
return 1
end
if test -f $argv[1]
switch $argv[1]
case '*.tar.bz2'
tar xjf $argv[1]
case '*.tar.gz'
tar xzf $argv[1]
case '*.bz2'
bunzip2 $argv[1]
case '*.rar'
unrar x $argv[1]
case '*.gz'
gunzip $argv[1]
case '*.tar'
tar xf $argv[1]
case '*.tbz2'
tar xjf $argv[1]
case '*.tgz'
tar xzf $argv[1]
case '*.zip'
unzip $argv[1]
case '*.Z'
uncompress $argv[1]
case '*.7z'
7z x $argv[1]
case '*.xz'
unxz $argv[1]
case '*.lzma'
unlzma $argv[1]
case '*'
echo "'$argv[1]' cannot be extracted via extract()"
end
else
echo "'$argv[1]' is not a valid file"
end
end
# ==============================================================================
# PROMPT COLORS
# ==============================================================================
set -l user_color (set_color green)
set -l host_color (set_color blue)
set -l path_color (set_color cyan)
# Fish's built-in git prompt configuration
set -eg ___fish_git_prompt_char_stateseparator
set -g __fish_git_prompt_show_informative_status 1
set -g __fish_git_prompt_color_branch magenta --bold
set -g __fish_git_prompt_color_stagedstate yellow
set -g __fish_git_prompt_color_invalidstate red
set -g __fish_git_prompt_color_cleanstate green --bold
set -g __fish_git_prompt_separator ' '
set -g __fish_git_prompt_char_dirtystate '+'
set -g __fish_git_prompt_char_stagedstate '●'
set -g __fish_git_prompt_char_untrackedfiles ''
# Auto-attach to tmux on interactive shell start
# if status is-interactive && not set -q TMUX
# # Get all session names matching shell, shell-2, shell-3 etc
# set sessions (tmux list-sessions -F '#S' 2>/dev/null)
# if test (count $sessions) -eq 0
# tmux new-session -s shell
# else
# # Check if any shell session is unattached and attach it
# set target (tmux list-sessions -F '#{session_name} #{session_attached}' 2>/dev/null \
# | grep '^shell' | grep ' 0$' | head -1 | awk '{print $1}')
# if test -n "$target"
# tmux attach -t $target
# else
# # All shell sessions attached — find next number
# set nums 1
# for s in $sessions
# if string match -rq '^shell-(\d+)$' $s
# set nums $nums (string replace 'shell-' '' $s)
# end
# end
# set next (math (string join \n $nums | sort -n | tail -1) + 1)
# tmux new-session -s shell-$next
# end
# end
# end