diff --git a/README.md b/README.md index d81a281..fa5864f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ https://github.com/user-attachments/assets/1fd0f3be-e83f-4d1c-9e4f-16cc77e3981b - OS: **Archlinux** - WM: Hyprland | **Niri** - Bar: Waybar | **Quickshell** -- Shell: **Fish** +- Shell: (bash & fish) | **Zsh** - Prompt: **Oh My Posh** - Terminal: **Kitty** & (**WezTerm** | Ghostty) - Power Menu: **Wlogout** & Quickshell diff --git a/config/ghostty/.config/ghostty/config b/config/ghostty/.config/ghostty/config index c5aab42..3dde1b0 100644 --- a/config/ghostty/.config/ghostty/config +++ b/config/ghostty/.config/ghostty/config @@ -12,7 +12,7 @@ keybind = ctrl+shift+h=write_screen_file:copy keybind = ctrl+shift+j=text:ghostty-capture\n keybind = ctrl+enter=unbind -command = exec fish +command = exec /bin/zsh confirm-close-surface = false diff --git a/config/kitty/.config/.alt/kitty-default/kitty.conf b/config/kitty/.config/.alt/kitty-default/kitty.conf index 5c71470..435b782 100755 --- a/config/kitty/.config/.alt/kitty-default/kitty.conf +++ b/config/kitty/.config/.alt/kitty-default/kitty.conf @@ -14,8 +14,8 @@ mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output # disable the stupid notification confirm_os_window_close 0 -# set shell to fish -shell fish +# set shell to zsh +shell /bin/zsh # hide_window_decorations yes window_padding_width 10 @@ -45,4 +45,4 @@ map ctrl+minus change_font_size all -1 map ctrl+kp_subtract change_font_size all -1 map ctrl+0 change_font_size all 0 -map ctrl+kp_0 change_font_size all 0 \ No newline at end of file +map ctrl+kp_0 change_font_size all 0 diff --git a/config/kitty/.config/.alt/kitty-niri/kitty.conf b/config/kitty/.config/.alt/kitty-niri/kitty.conf index 9fca55c..d7ddb18 100755 --- a/config/kitty/.config/.alt/kitty-niri/kitty.conf +++ b/config/kitty/.config/.alt/kitty-niri/kitty.conf @@ -14,8 +14,8 @@ mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output # disable the stupid notification confirm_os_window_close 0 -# set shell to fish -shell fish +# set shell to zsh +shell /bin/zsh # hide_window_decorations yes window_padding_width 10 diff --git a/config/quickshell/.config/quickshell/Modules/Bar/Modules/Ip.qml b/config/quickshell/.config/quickshell/Modules/Bar/Modules/Ip.qml index 33bae41..d542cda 100644 --- a/config/quickshell/.config/quickshell/Modules/Bar/Modules/Ip.qml +++ b/config/quickshell/.config/quickshell/Modules/Bar/Modules/Ip.qml @@ -18,7 +18,7 @@ UProgressExpand { onClicked: (mouse) => { WriteClipboard.write(displayText); - SendNotification.show("Copied to clipboard", displayText); + SendNotification.show("Copied to clipboard", displayText, true); } onRightClicked: { diff --git a/config/quickshell/.config/quickshell/Services/SendNotification.qml b/config/quickshell/.config/quickshell/Services/SendNotification.qml index 18c1afa..b524784 100644 --- a/config/quickshell/.config/quickshell/Services/SendNotification.qml +++ b/config/quickshell/.config/quickshell/Services/SendNotification.qml @@ -6,11 +6,17 @@ pragma Singleton Singleton { id: root - function show(title, message, icon = "", urgency = "normal") { + function show(title, message, nohistory = false, icon = "", urgency = "normal") { + const cmds = ["notify-send", "-u", urgency, "-a", "quickshell"]; if (icon) - Quickshell.execDetached(["notify-send", "-u", urgency, "-i", icon, title, message, "-a", "quickshell"]); - else - Quickshell.execDetached(["notify-send", "-u", urgency, title, message, "-a", "quickshell"]); + cmds.push("-i", icon); + + if (nohistory) { + cmds.push("--hint", "int:transient:1"); + cmds.push("--expire-time", "3000"); + } + cmds.push(title, message); + Quickshell.execDetached(cmds); } } diff --git a/config/shell/.bash_profile b/config/shell/.bash_profile index f2d5028..136117d 100644 --- a/config/shell/.bash_profile +++ b/config/shell/.bash_profile @@ -26,10 +26,10 @@ prepend_path() { [ -f "$HOME/.profile" ] && . "$HOME/.profile" # Better than nothing -export XDG_CONFIG_HOME="$HOME/.config" -export XDG_DATA_HOME="$HOME/.local/share" -export XDG_STATE_HOME="$HOME/.local/state" -export XDG_CACHE_HOME="$HOME/.cache" +export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +export XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} +export XDG_STATE_HOME=${XDG_STATE_HOME:-$HOME/.local/state} +export XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache} # Better than nothing if [[ -z "$LANG" ]]; then diff --git a/config/shell/.config/zsh/.gitignore b/config/shell/.config/zsh/.gitignore new file mode 100644 index 0000000..ae0c608 --- /dev/null +++ b/config/shell/.config/zsh/.gitignore @@ -0,0 +1,3 @@ +# antidote generated/cache files +.zsh_plugins.zsh +.antidote/ diff --git a/config/shell/.config/zsh/.zsh_plugins.txt b/config/shell/.config/zsh/.zsh_plugins.txt new file mode 100644 index 0000000..2d297c3 --- /dev/null +++ b/config/shell/.config/zsh/.zsh_plugins.txt @@ -0,0 +1,13 @@ +# Syntax highlighting +zsh-users/zsh-syntax-highlighting + +# Catppuccin Mocha theme for syntax highlighting +catppuccin/zsh-syntax-highlighting path:themes/catppuccin_mocha-zsh-syntax-highlighting.zsh + +# Fish-like autosuggestions +zsh-users/zsh-autosuggestions + +# Additional completions +zsh-users/zsh-completions + +# Long command done notification — handled by conf.d/10-done.zsh diff --git a/config/shell/.config/zsh/conf.d/.gitignore b/config/shell/.config/zsh/conf.d/.gitignore new file mode 100644 index 0000000..91122be --- /dev/null +++ b/config/shell/.config/zsh/conf.d/.gitignore @@ -0,0 +1,12 @@ +* +!.gitignore +!01-options.zsh +!02-completions.zsh +!03-plugins.zsh +!10-done.zsh +!10-env.zsh +!10-oops.zsh +!10-sshs.zsh +!50-prompt.zsh +!60-alias.zsh +!60-fetch.zsh diff --git a/config/shell/.config/zsh/conf.d/01-options.zsh b/config/shell/.config/zsh/conf.d/01-options.zsh new file mode 100644 index 0000000..a60293d --- /dev/null +++ b/config/shell/.config/zsh/conf.d/01-options.zsh @@ -0,0 +1,23 @@ +# History + +HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/history" +HISTSIZE=100000 +SAVEHIST=100000 +setopt APPEND_HISTORY SHARE_HISTORY +setopt HIST_IGNORE_DUPS HIST_SAVE_NO_DUPS HIST_FIND_NO_DUPS +setopt HIST_IGNORE_SPACE HIST_REDUCE_BLANKS INC_APPEND_HISTORY +setopt HIST_VERIFY + +# Shell options + +setopt AUTO_CD EXTENDED_GLOB NOTIFY INTERACTIVE_COMMENTS +bindkey -e + +# Allow word-based navigation and deletion to work on paths + +WORDCHARS=${WORDCHARS//\//} + +# Rookie keybindings :) +bindkey '^[[1;5D' backward-word # C-Left +bindkey '^[[1;5C' forward-word # C-Right +bindkey '^H' backward-kill-word # C-Backspace diff --git a/config/shell/.config/zsh/conf.d/02-completions.zsh b/config/shell/.config/zsh/conf.d/02-completions.zsh new file mode 100644 index 0000000..3d234d2 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/02-completions.zsh @@ -0,0 +1,16 @@ +fpath=(~/.zfunc $fpath) + +# Cache compinit: only regenerate dump once daily +autoload -Uz compinit +if [[ -n ${ZDOTDIR:-$HOME}/.zcompdump(#qN.mh+24) ]]; then + compinit +else + compinit -C +fi + +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' +zstyle ':completion:*' menu select +zstyle ':completion:*' squeeze-slashes true +zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" +zstyle ':completion:*:descriptions' format '%F{cyan}-- %d --%f' +zstyle ':completion:*:warnings' format '%F{red}-- no matches --%f' diff --git a/config/shell/.config/zsh/conf.d/03-plugins.zsh b/config/shell/.config/zsh/conf.d/03-plugins.zsh new file mode 100644 index 0000000..dfcd972 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/03-plugins.zsh @@ -0,0 +1,20 @@ +_uy_antidote_dir="${XDG_DATA_HOME:-$HOME/.local/share}/antidote" + +# Find antidote: system package → user-local clone → auto-bootstrap +if [[ -f /usr/share/zsh-antidote/antidote.zsh ]]; then + source /usr/share/zsh-antidote/antidote.zsh +elif [[ -f "$_uy_antidote_dir/antidote.zsh" ]]; then + source "$_uy_antidote_dir/antidote.zsh" +elif (( $+commands[git] )); then + git clone --depth=1 https://github.com/mattmc3/antidote.git "$_uy_antidote_dir" + source "$_uy_antidote_dir/antidote.zsh" +fi + +if (( $+functions[antidote] )); then + _uy_zsh_plugins="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/.zsh_plugins.txt" + if [[ -f "$_uy_zsh_plugins" ]]; then + antidote load "$_uy_zsh_plugins" + fi +fi + +unset _uy_antidote_dir _uy_zsh_plugins diff --git a/config/shell/.config/zsh/conf.d/10-done.zsh b/config/shell/.config/zsh/conf.d/10-done.zsh new file mode 100644 index 0000000..3fb12c0 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/10-done.zsh @@ -0,0 +1,67 @@ +# Long command done notification for Niri (Wayland) +# Sends notify-send when a command takes longer than $uy_done_min_cmd_duration +# seconds and the terminal window is not focused. + +(( $+commands[notify-send] )) && [[ -n "$NIRI_SOCKET" ]] || return + +zmodload zsh/datetime + +: ${uy_done_min_cmd_duration:=10} +: ${uy_done_exclude:='^(nvim|helix|hx|vim|vi|nano|less|more|man|ssh|top|htop|btop)$'} + +uy_done_get_focused_window_id() { + (( $+commands[jq] )) || return + niri msg --json focused-window 2>/dev/null | jq -r '.id // empty' +} + +uy_done_preexec() { + uy_done_cmd="$1" + uy_done_start=$EPOCHSECONDS + uy_done_window_id=$(uy_done_get_focused_window_id) +} + +uy_done_precmd() { + local exit_status=$? + [[ -n "$uy_done_start" ]] || return + + local elapsed=$(( EPOCHSECONDS - uy_done_start )) + unset uy_done_start + + (( elapsed >= uy_done_min_cmd_duration )) || return + + # skip excluded commands + local cmd_name="${uy_done_cmd%% *}" + [[ "$cmd_name" =~ $uy_done_exclude ]] && return + + # skip if window is still focused + local current_id + current_id=$(uy_done_get_focused_window_id) + [[ -n "$uy_done_window_id" && "$uy_done_window_id" = "$current_id" ]] && return + + # humanize duration + local title duration="" urgency=low + local minutes=$(( elapsed / 60 )) seconds=$(( elapsed % 60 )) + local hours=$(( elapsed / 3600 )) + (( hours > 0 )) && duration+="${hours}h " + (( minutes > 0 )) && duration+="$(( minutes % 60 ))m " + duration+="${seconds}s" + + local wd="${PWD/#$HOME/~}" + if (( exit_status == 0 )); then + title="Done in $duration" + else + title="Failed ($exit_status) after $duration" + urgency=critical + fi + + notify-send \ + --hint=int:transient:1 \ + --urgency="$urgency" \ + --icon=utilities-terminal \ + --app-name=zsh \ + "$title" "$wd/ $uy_done_cmd" +} + +autoload -Uz add-zsh-hook +add-zsh-hook preexec uy_done_preexec +add-zsh-hook precmd uy_done_precmd diff --git a/config/shell/.config/zsh/conf.d/10-env.zsh b/config/shell/.config/zsh/conf.d/10-env.zsh new file mode 100644 index 0000000..c2e97f1 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/10-env.zsh @@ -0,0 +1,31 @@ +# MANPAGER + +if (( $+commands[bat] )); then + export MANPAGER="sh -c 'col -bx | bat -l man -p'" + export MANROFFOPT=-c +fi + +# Editor + +for _uy_app in nvim helix vim vi nano; do + if (( $+commands[$_uy_app] )); then + export EDITOR=$_uy_app + export VISUAL=$_uy_app + break + fi +done +unset _uy_app + +if (( $+commands[helix] )) && ! (( $+commands[hx] )); then + alias hx=helix +fi + +# GPG + +if (( $+commands[gpg] )); then + export GPG_TTY=$(tty) +fi + +# Catppuccin Mocha — autosuggestions color + +ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#6c7086" diff --git a/config/shell/.config/zsh/conf.d/10-oops.zsh b/config/shell/.config/zsh/conf.d/10-oops.zsh new file mode 100644 index 0000000..aec3a21 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/10-oops.zsh @@ -0,0 +1,29 @@ +_oops_confirm() { + if [[ ! -f "$HISTFILE" ]]; then + print -P "%F{red}Failed to locate history file: $HISTFILE%f" + return 1 + fi + + local last_line=$(tail -n 1 "$HISTFILE") + + if [[ -z "$last_line" ]]; then + print -P "%F{yellow}History file is empty, nothing to clean. %f" + return 0 + fi + + print -P "About to permanently delete the last command from history:" + print -P "%F{red} $last_line%f" + + local reply + echo -n "Proceed? [Y/n] " + read -r reply + + if [[ -z "$reply" || "$reply" == [yY]* ]]; then + sed -i '$d' "$HISTFILE" + print -P "%F{green}Command removed from history.%f" + else + print -P "%F{yellow}Operation cancelled.%f" + fi +} + +alias oops=' _oops_confirm' diff --git a/config/shell/.config/zsh/conf.d/10-sshs.zsh b/config/shell/.config/zsh/conf.d/10-sshs.zsh new file mode 100644 index 0000000..f338f7e --- /dev/null +++ b/config/shell/.config/zsh/conf.d/10-sshs.zsh @@ -0,0 +1,19 @@ +# ssh with encrypted private keys +# $uy_ssh_keys should be set in a device-specific file or left empty for defaults + +if [[ "${UY_ENABLE_GPG_AGENT_SSH:-0}" = "1" ]] && + (( $+commands[gpg-init] )) && (( $+commands[gpgconf] )); then + : # GPG agent handles SSH — nothing to do + +elif [[ "${UY_USING_SSH_AGENT:-0}" = "1" ]]; then + sshs() { + if ! ssh-add -l &>/dev/null; then + if [[ -n "${uy_ssh_keys[*]}" ]]; then + ssh-add "${uy_ssh_keys[@]}" + else + ssh-add + fi + fi + ssh "$@" + } +fi diff --git a/config/shell/.config/zsh/conf.d/50-prompt.zsh b/config/shell/.config/zsh/conf.d/50-prompt.zsh new file mode 100644 index 0000000..6141439 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/50-prompt.zsh @@ -0,0 +1,7 @@ +# Fallback prompt (if oh-my-posh is not available) +PROMPT='%F{blue}%n@%m%f %F{cyan}%~%f > ' + +# oh-my-posh +if [[ -f "$HOME/.config/posh_theme.omp.json" ]] && (( $+commands[oh-my-posh] )); then + eval "$(oh-my-posh init zsh --config "$HOME/.config/posh_theme.omp.json")" +fi diff --git a/config/shell/.config/zsh/conf.d/60-alias.zsh b/config/shell/.config/zsh/conf.d/60-alias.zsh new file mode 100644 index 0000000..bc8d1f1 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/60-alias.zsh @@ -0,0 +1,187 @@ +# fzf + +if (( $+commands[fzf] )); then + source <(fzf --zsh) + + # auto copy fzf's output + if (( $+commands[wl-copy] )); then + alias fzf="fzf --bind 'enter:execute-silent(echo {+} | wl-copy --trim-newline)+accept'" + fi + + # fzh: history + alias fzh="history -1 0 | fzf" + + # fz: fuzzy find a file and preview + if (( $+commands[bat] )); then + alias fz="fzf --preview 'bat --style=numbers --color=always {}'" + else + alias fz="fzf --preview 'cat -n {}'" + fi + + # fe: fuzzy find a file and edit using $EDITOR + fe() { + local file + file=$(fz "$@") + [[ -n "$file" ]] && $EDITOR "$file" + } + + # fkill: fuzzy find a process and kill with SIGKILL + fkill() { + local pids + pids=$(ps -ef | sed 1d | fzf -m --preview 'pstree -p $(echo {} | awk "{print \$2}")' | awk '{print $2}') + [[ -n "$pids" ]] && kill -9 ${=pids} + } + + if (( $+commands[yay] )); then + # fyq: fuzzy yay query + alias fyq="yay -Qq | fzf --preview 'yay -Qi {}'" + + # fyi: fuzzy yay install + fyi() { + local pkg + pkg=$(yay -Sl | awk '{print $1"/"$2}' | fzf -m --preview 'yay -Si {}' "$@") + [[ -n "$pkg" ]] && yay -S ${=pkg} + } + + # fyr: fuzzy yay remove + fyr() { + local pkg + pkg=$(yay -Qq | fzf -m --preview 'yay -Qi {}' "$@") + [[ -n "$pkg" ]] && yay -Rn ${=pkg} + } + fi +fi + +# cd (zoxide) + +if (( $+commands[zoxide] )); then + eval "$(zoxide init zsh)" + alias cd=z +fi + +# ls + +if (( $+commands[eza] )); then + alias ll="eza -lh --group-directories-first --icons=auto" + alias la="eza -lh --group-directories-first --icons=auto --all" + alias lt="eza --tree --level=2 --long --icons --git" +else + alias ls="ls --color=auto" + alias ll="ls -lh --group-directories-first --color=auto" + alias la="ls -lah --group-directories-first --color=auto" +fi + +# directories + +alias ..='cd ..' +alias ...='cd ../..' +alias ....='cd ../../..' + +# colorize + +alias grep="grep --color=auto" +alias dir="dir --color=auto" +alias vdir="vdir --color=auto" +alias fgrep="fgrep --color=auto" +alias egrep="egrep --color=auto" + +# copy + +copy() { + if [[ $# -eq 2 && -d "$1" ]]; then + command cp -r "${1%/}" "$2" + else + command cp "$@" + fi +} + +# wget + +if (( $+commands[wget] )); then + alias wget="wget -c " +fi + +# pacman + +if (( $+commands[expac] )); then + alias big="expac -H M '%m\t%n' | sort -h | nl" +fi + +# clock + +if (( $+commands[tty-clock] )); then + alias clock="tty-clock -c -C 4" +fi + +# journalctl + +alias jctl="journalctl -p 3 -xb" + +# nohup + +nh() { + nohup "$@" >/dev/null 2>&1 & + disown +} + +# ffmpeg + +alias ffmpeg="ffmpeg -hide_banner -nostdin" +alias ffprobe="ffprobe -hide_banner" + +# git + +if (( $+commands[git] )); then + gcp() { + git add -A || return 1 + if [[ $# -eq 0 ]]; then + git commit -m "👐 foo: too lazy to come up with a helpful commit message :)" || return 1 + else + git commit -m "$*" || return 1 + fi + git push + } + + if (( $+commands[wl-paste] )); then + # Get a git repo URL from clipboard, prompting if invalid + uy_git_repo_from_clipboard() { + local repo + repo=$(wl-paste) + if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then + echo "Error: Clipboard does not contain a valid git repository URL." >&2 + echo "Error: Clipboard content: $repo" >&2 + read "repo?Enter a valid git repository URL: " + if [[ ! "$repo" =~ '^(http|https|git|ssh)://|^git@' ]]; then + echo "Error: Invalid git repository URL." >&2 + return 1 + fi + fi + print -r -- "$repo" + } + + gc() { + local repo + repo=$(uy_git_repo_from_clipboard) || return 1 + git clone "$repo" + } + + pingo() { + cd "$HOME/Repositories/PGdP" || return 1 + local repo + repo=$(uy_git_repo_from_clipboard) || return 1 + local dir_name="${repo:t:r}" + if [[ ! -d "$dir_name" ]]; then + git clone "$repo" || return 1 + fi + local app="$1" + if [[ -n "$app" ]] && (( $+commands[$app] )); then + echo "Opening project with $app" + nohup "$app" "$dir_name" >/dev/null 2>&1 & + disown + else + echo "Opening method missing or invalid" + cd "$dir_name" + fi + } + fi +fi diff --git a/config/shell/.config/zsh/conf.d/60-fetch.zsh b/config/shell/.config/zsh/conf.d/60-fetch.zsh new file mode 100644 index 0000000..ebf9bd4 --- /dev/null +++ b/config/shell/.config/zsh/conf.d/60-fetch.zsh @@ -0,0 +1,54 @@ +# Detect logo capability + +if [[ -z "$uy_fetch_logo_type" ]]; then + if (( $+commands[kgp-query] )) && kgp-query 2>/dev/null; then + uy_fetch_logo_type=kitty + elif (( $+commands[sixel-query] )) && sixel-query 2>/dev/null; then + uy_fetch_logo_type=sixel + elif (( $+commands[kgp-query] )) || (( $+commands[sixel-query] )); then + uy_fetch_logo_type=logo + else + uy_fetch_logo_type=auto + fi +fi + +: ${uy_fetch_color:="38;2;137;180;250"} + +# Build fastfetch args (arrays to handle paths with spaces safely) + +case "$uy_fetch_logo_type" in +symbols) + uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.symbols" --color "$uy_fetch_color") + uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.symbols" --color "$uy_fetch_color") + ;; +logo) + uy_fetch_args=(--logo-type builtin) + uy_fetch_args_brief=(--logo-type small) + ;; +sixel) + uy_fetch_args=(--logo-type raw --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/42x.sixel" --color "$uy_fetch_color") + uy_fetch_args_brief=(--logo-type raw --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/28x.sixel" --color "$uy_fetch_color") + ;; +*) # kitty, auto, etc. + uy_fetch_args=(--logo-type "$uy_fetch_logo_type" --logo-width 42 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color") + uy_fetch_args_brief=(--logo-type "$uy_fetch_logo_type" --logo-width 28 --logo "$HOME/.config/fastfetch/logo_ros/ros.png" --color "$uy_fetch_color") + ;; +esac + +# Functions + +if (( $+commands[fastfetch] )); then + ff() { fastfetch -c "$HOME/.config/fastfetch/config.jsonc" "${uy_fetch_args[@]}" "$@"; } + + if [[ -f "$HOME/.config/fastfetch/brief.jsonc" ]]; then + ffb() { fastfetch -c "$HOME/.config/fastfetch/brief.jsonc" "${uy_fetch_args_brief[@]}" "$@"; } + else + ffb() { ff "$@"; } + fi +fi + +# Auto-fetch on startup + +if [[ -z "$uy_no_fetch" ]] && (( $+functions[ffb] )); then + ffb +fi diff --git a/config/shell/.zprofile b/config/shell/.zprofile new file mode 100644 index 0000000..e7f93ef --- /dev/null +++ b/config/shell/.zprofile @@ -0,0 +1,79 @@ +#!/bin/zsh + +# Login shell only — runs once per session (like .bash_profile) + +# Path helpers (needed before sourcing .profile) + +append_path() { + [[ -z "$1" ]] && return + [[ -d "$1" ]] || return + case ":$PATH:" in + *:"$1":*) ;; + *) + PATH="${PATH:+$PATH:}$1" + ;; + esac +} +prepend_path() { + [[ -z "$1" ]] && return + [[ -d "$1" ]] || return + case ":$PATH:" in + *:"$1":*) ;; + *) + PATH="$1${PATH:+:$PATH}" + ;; + esac +} + +# XDG, better than not set + +export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +export XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} +export XDG_STATE_HOME=${XDG_STATE_HOME:-$HOME/.local/state} +export XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache} + +# Locale, better than not set + +if [[ -z "$LANG" ]]; then + export LANG="en_US.UTF-8" +fi + +# .profile is not included in the repo (private / per-device) +[[ -f "$HOME/.profile" ]] && . "$HOME/.profile" + +# Paths + +[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env" +prepend_path "$HOME/go/bin" +prepend_path "$HOME/.local/bin" +prepend_path "$HOME/.local/scripts" +prepend_path "$HOME/.local/share/fnm" +export PATH + +# fnm + +if (( $+commands[fnm] )); then + eval "$(fnm env --shell zsh)" +fi + +# GPG agent for SSH + +if (( $+commands[gpgconf] )) && (( $+commands[gpg-connect-agent] )) && + [[ -x "$HOME/.local/scripts/gpg-init" ]] && + [[ "${UY_ENABLE_GPG_AGENT_SSH:-0}" = "1" ]]; then + eval "$($HOME/.local/scripts/gpg-init 2>/dev/null)" &>/dev/null +fi + +# SSH agent + +if (( $+commands[ssh-add] )) && (( $+commands[ssh-agent] )) && + { [[ -z "$SSH_AUTH_SOCK" ]] || + { ssh-add -l &>/dev/null; [[ $? -eq 2 ]]; } } && + [[ -x "$HOME/.local/scripts/ssh-init" ]]; then + unset SSH_AUTH_SOCK + eval "$($HOME/.local/scripts/ssh-init 2>/dev/null)" &>/dev/null + export UY_USING_SSH_AGENT=1 +fi + +unfunction append_path +unfunction prepend_path diff --git a/config/shell/.zshrc b/config/shell/.zshrc new file mode 100644 index 0000000..d09b3a5 --- /dev/null +++ b/config/shell/.zshrc @@ -0,0 +1,8 @@ +#!/bin/zsh + +[[ $- != *i* ]] && return + +for _f in "${XDG_CONFIG_HOME:-$HOME/.config}"/zsh/conf.d/*.zsh(N); do + source "$_f" +done +unset _f diff --git a/config/wezterm/.config/wezterm/wezterm.lua b/config/wezterm/.config/wezterm/wezterm.lua index e1f9cab..843d12a 100644 --- a/config/wezterm/.config/wezterm/wezterm.lua +++ b/config/wezterm/.config/wezterm/wezterm.lua @@ -13,7 +13,7 @@ config.hide_tab_bar_if_only_one_tab = true config.window_background_opacity = 0.95 -config.default_prog = { "/usr/bin/fish" } +config.default_prog = { "/usr/bin/zsh" } config.window_close_confirmation = "NeverPrompt"