# ============================================================================== # ENVIRONMENT VARIABLES # ============================================================================== # Disable fish greeting set -g fish_greeting # Core settings set -gx EDITOR "/usr/local/nvim_012/bin/nvim" set -gx VISUAL "/usr/local/nvim_012/bin/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 /var/lib/flatpak/exports/bin fish_add_path /usr/local/bin fish_add_path /usr/local/go/bin fish_add_path $GOPATH/bin fish_add_path "$HOME/bin" fish_add_path "$HOME/.local/bin" fish_add_path "$HOME/.local/share/flatpak/exports/bin" fish_add_path "$HOME/.npm-global/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 bat='batcat --theme="gruvbox-dark" --paging=never ' # Application shortcuts alias nvim='/usr/local/nvim_012/bin/nvim' alias vim='nvim' alias vi='nvim' alias v='nvim' alias :q='exit' alias files='nemo .' alias lg='gitu' alias ldk='lazydocker' # Custom shortcuts alias reload='source ~/.config/fish/config.fish' alias dotman='bash ~/.dotfiles/install.sh' alias myip='curl ipinfo.io/ip; echo ""' alias lspmake='bear -- make -B' alias tc='tmux attach' alias td='tmux detach' alias db='lazysql' # Docker shortcuts 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' # ============================================================================== # 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" clear cd "$selection" commandline -f repaint # Ensures the prompt updates after cd end 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