From 77d6198480801cc6ba0fd982208ccb7c9185f1ea Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Mon, 18 Aug 2025 12:40:41 +0200 Subject: [PATCH] Remove Oh My ZSH dependency of my ZSH configuration --- zsh/.profile.d/runwm.sh | 57 +++ zsh/.profile.d/ssh-agent.sh | 25 ++ zsh/.zsh/plugins/colored-man-pages.plugin.zsh | 54 +++ zsh/.zsh/plugins/command-not-found.plugin.zsh | 70 ++++ zsh/.zsh/plugins/fzf-git.sh | 385 ++++++++++++++++++ zsh/.zsh/plugins/zoxide.plugin.zsh | 5 + zsh/.zsh/plugins/zsh-autosuggestions | 1 + zsh/.zsh/plugins/zsh-syntax-highlighting | 1 + zsh/.zshenv | 78 ++-- zsh/.zshrc | 211 +++++----- 10 files changed, 737 insertions(+), 150 deletions(-) create mode 100755 zsh/.profile.d/runwm.sh create mode 100755 zsh/.profile.d/ssh-agent.sh create mode 100755 zsh/.zsh/plugins/colored-man-pages.plugin.zsh create mode 100755 zsh/.zsh/plugins/command-not-found.plugin.zsh create mode 100755 zsh/.zsh/plugins/fzf-git.sh create mode 100755 zsh/.zsh/plugins/zoxide.plugin.zsh create mode 160000 zsh/.zsh/plugins/zsh-autosuggestions create mode 160000 zsh/.zsh/plugins/zsh-syntax-highlighting diff --git a/zsh/.profile.d/runwm.sh b/zsh/.profile.d/runwm.sh new file mode 100755 index 0000000..659dd45 --- /dev/null +++ b/zsh/.profile.d/runwm.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then + if [ -n "$DBUS_SESSION_BUS_ADDRESS" ]; then + # XDG Settings Basic + export XDG_CONFIG_HOME=${HOME}/.config + export XDG_DATA_HOME=${HOME}/.local/share + export XDG_CACHE_HOME=${HOME}/.local/cache + export XDG_STATE_HOME=${HOME}/.local/state + + # XDG_CONFIG_HOME + export GTK2_RC_FILES=${XDG_CONFIG_HOME}/gtk-2.0/gtkrc-2.0 + + # Reduces crashs for some gdk apps, like evolution + # ! Do not set as global variable. Electron Apps will not start ! + # export GDK_BACKEND=wayland + + # Required for tray icons on waybar + export XDG_CURRENT_DESKTOP=sway + + # Enable QT apps to have gtk theme + export QT_QPA_PLATFORMTHEME=qt5ct + + # Force wayland on qt apps + export QT_QPA_PLATFORM=wayland + + export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 + # Explicitly set to '96' instead of 'physical' because some apps have problems + # Looking at you nextcloud client! + # https://github.com/nextcloud/desktop/issues/1079 + # https://github.com/swaywm/sway/issues/2424 + export QT_WAYLAND_FORCE_DPI=96 + + # Make Qt apps honour DPI settings. + export QT_AUTO_SCREEN_SCALE_FACTOR=1 + + # Mozilla Wayland support + hardware video decoding + export MOZ_ENABLE_WAYLAND=1 + export MOZ_WAYLAND_USE_VAAPI=1 + + # SDL + export SDL_VIDEODRIVER=wayland + + # Java under Xwayland + export _JAVA_AWT_WM_NONREPARENTING=1 + + # Session Type for later screensharing + export XDG_SESSION_TYPE=wayland + + # SSH socket + export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gcr/ssh" + + exec dbus-launch --exit-with-session sway + else + echo "Cannot found dbus session: Sway don't work" + fi +fi diff --git a/zsh/.profile.d/ssh-agent.sh b/zsh/.profile.d/ssh-agent.sh new file mode 100755 index 0000000..789fbe3 --- /dev/null +++ b/zsh/.profile.d/ssh-agent.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +start_keychain() { + local ssh_key="$1" + local gpg_key="$2" + # Check if keychain is installed + if command -v keychain >/dev/null 2>&1; then + SHORT_HOST=${SHORT_HOST:-${(%):-%m}} + + # Start keychain quietly with no GUI prompts for ssh agents + eval "$(keychain --quiet --nogui $ssh_key $gpg_key)" + + # Get the filenames to store/lookup the environment from + _keychain_env_sh="$HOME/.keychain/$SHORT_HOST-sh" + _keychain_env_sh_gpg="$HOME/.keychain/$SHORT_HOST-sh-gpg" + + # Source environment settings. + [ -f "$_keychain_env_sh" ] && . "$_keychain_env_sh" + [ -f "$_keychain_env_sh_gpg" ] && . "$_keychain_env_sh_gpg" + else + echo "Warning: keychain is not installed. Please install keychain to manage ssh/gpg agents." + fi +} + +# start_keychain "$HOME/.ssh/id_ed25519_nymph" diff --git a/zsh/.zsh/plugins/colored-man-pages.plugin.zsh b/zsh/.zsh/plugins/colored-man-pages.plugin.zsh new file mode 100755 index 0000000..57facbb --- /dev/null +++ b/zsh/.zsh/plugins/colored-man-pages.plugin.zsh @@ -0,0 +1,54 @@ +# Requires colors autoload. +# See termcap(5). + +# Set up once, and then reuse. This way it supports user overrides after the +# plugin is loaded. +typeset -AHg less_termcap + +# bold & blinking mode +less_termcap[mb]="${fg_bold[red]}" +less_termcap[md]="${fg_bold[red]}" +less_termcap[me]="${reset_color}" +# standout mode +less_termcap[so]="${fg_bold[yellow]}${bg[blue]}" +less_termcap[se]="${reset_color}" +# underlining +less_termcap[us]="${fg_bold[green]}" +less_termcap[ue]="${reset_color}" + +# Handle $0 according to the standard: +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" +0="${${(M)0:#/*}:-$PWD/$0}" + +# Absolute path to this file's directory. +typeset -g __colored_man_pages_dir="${0:A:h}" + +function colored() { + local -a environment + + # Convert associative array to plain array of NAME=VALUE items. + local k v + for k v in "${(@kv)less_termcap}"; do + environment+=( "LESS_TERMCAP_${k}=${v}" ) + done + + # Prefer `less` whenever available, since we specifically configured + # environment for it. + environment+=( PAGER="${commands[less]:-$PAGER}" ) + environment+=( GROFF_NO_SGR=1 ) + + # See ./nroff script. + if [[ "$OSTYPE" = solaris* ]]; then + environment+=( PATH="${__colored_man_pages_dir}:$PATH" ) + fi + + command env $environment "$@" +} + +# Colorize man and dman/debman (from debian-goodies) +function man \ + dman \ + debman { + colored $0 "$@" +} diff --git a/zsh/.zsh/plugins/command-not-found.plugin.zsh b/zsh/.zsh/plugins/command-not-found.plugin.zsh new file mode 100755 index 0000000..c741e18 --- /dev/null +++ b/zsh/.zsh/plugins/command-not-found.plugin.zsh @@ -0,0 +1,70 @@ +## Platforms with a built-in command-not-found handler init file + +for file ( + # Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found + /usr/share/doc/pkgfile/command-not-found.zsh + # Homebrew: https://github.com/Homebrew/homebrew-command-not-found + /opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh + /usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh + /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh +); do + if [[ -r "$file" ]]; then + source "$file" + unset file + return 0 + fi +done +unset file + + +## Platforms with manual command_not_found_handler() setup + +# Debian and derivatives: https://launchpad.net/ubuntu/+source/command-not-found +if [[ -x /usr/lib/command-not-found || -x /usr/share/command-not-found/command-not-found ]]; then + command_not_found_handler() { + if [[ -x /usr/lib/command-not-found ]]; then + /usr/lib/command-not-found -- "$1" + return $? + elif [[ -x /usr/share/command-not-found/command-not-found ]]; then + /usr/share/command-not-found/command-not-found -- "$1" + return $? + else + printf "zsh: command not found: %s\n" "$1" >&2 + return 127 + fi + } +fi + +# Fedora: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound +if [[ -x /usr/libexec/pk-command-not-found ]]; then + command_not_found_handler() { + if [[ -S /var/run/dbus/system_bus_socket && -x /usr/libexec/packagekitd ]]; then + /usr/libexec/pk-command-not-found "$@" + return $? + fi + + printf "zsh: command not found: %s\n" "$1" >&2 + return 127 + } +fi + +# NixOS: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found +if [[ -x /run/current-system/sw/bin/command-not-found ]]; then + command_not_found_handler() { + /run/current-system/sw/bin/command-not-found "$@" + } +fi + +# Termux: https://github.com/termux/command-not-found +if [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; then + command_not_found_handler() { + /data/data/com.termux/files/usr/libexec/termux/command-not-found "$1" + } +fi + +# SUSE and derivates: https://www.unix.com/man-page/suse/1/command-not-found/ +if [[ -x /usr/bin/command-not-found ]]; then + command_not_found_handler() { + /usr/bin/command-not-found "$1" + } +fi diff --git a/zsh/.zsh/plugins/fzf-git.sh b/zsh/.zsh/plugins/fzf-git.sh new file mode 100755 index 0000000..31122e4 --- /dev/null +++ b/zsh/.zsh/plugins/fzf-git.sh @@ -0,0 +1,385 @@ +# The MIT License (MIT) +# +# Copyright (c) 2024 Junegunn Choi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# shellcheck disable=SC2039 +[[ $0 = - ]] && return + +__fzf_git_color() { + if [[ -n $NO_COLOR ]]; then + echo never + elif [[ $# -gt 0 ]] && [[ -n $FZF_GIT_PREVIEW_COLOR ]]; then + echo "$FZF_GIT_PREVIEW_COLOR" + else + echo "${FZF_GIT_COLOR:-always}" + fi +} + +__fzf_git_cat() { + if [[ -n $FZF_GIT_CAT ]]; then + echo "$FZF_GIT_CAT" + return + fi + + # Sometimes bat is installed as batcat + _fzf_git_bat_options="--style='${BAT_STYLE:-full}' --color=$(__fzf_git_color .) --pager=never" + if command -v batcat > /dev/null; then + echo "batcat $_fzf_git_bat_options" + elif command -v bat > /dev/null; then + echo "bat $_fzf_git_bat_options" + else + echo cat + fi +} + +__fzf_git_pager() { + local pager + pager="${FZF_GIT_PAGER:-${GIT_PAGER:-$(git config --get core.pager 2>/dev/null)}}" + echo "${pager:-cat}" +} + +if [[ $1 = --list ]]; then + shift + if [[ $# -eq 1 ]]; then + branches() { + git branch "$@" --sort=-committerdate --sort=-HEAD --format=$'%(HEAD) %(color:yellow)%(refname:short) %(color:green)(%(committerdate:relative))\t%(color:blue)%(subject)%(color:reset)' --color=$(__fzf_git_color) | column -ts$'\t' + } + refs() { + git for-each-ref "$@" --sort=-creatordate --sort=-HEAD --color=$(__fzf_git_color) --format=$'%(if:equals=refs/remotes)%(refname:rstrip=-2)%(then)%(color:magenta)remote-branch%(else)%(if:equals=refs/heads)%(refname:rstrip=-2)%(then)%(color:brightgreen)branch%(else)%(if:equals=refs/tags)%(refname:rstrip=-2)%(then)%(color:brightcyan)tag%(else)%(if:equals=refs/stash)%(refname:rstrip=-2)%(then)%(color:brightred)stash%(else)%(color:white)%(refname:rstrip=-2)%(end)%(end)%(end)%(end)\t%(color:yellow)%(refname:short) %(color:green)(%(creatordate:relative))\t%(color:blue)%(subject)%(color:reset)' | column -ts$'\t' + } + hashes() { + git log --date=short --format="%C(green)%C(bold)%cd %C(auto)%h%d %s (%an)" --graph --color=$(__fzf_git_color) "$@" $LIST_OPTS + } + case "$1" in + branches) + echo 'CTRL-O (open in browser) ╱ ALT-A (show all branches)' + echo 'ALT-H (list commit hashes)' + branches + ;; + all-branches) + echo 'CTRL-O (open in browser) ╱ ALT-ENTER (accept without remote)' + echo 'ALT-H (list commit hashes)' + branches -a + ;; + hashes) + echo 'CTRL-O (open in browser) ╱ CTRL-D (diff)' + echo 'CTRL-S (toggle sort) ╱ ALT-A (show all hashes)' + hashes + ;; + all-hashes) + echo 'CTRL-O (open in browser) ╱ CTRL-D (diff)' + echo 'CTRL-S (toggle sort)' + hashes --all + ;; + refs) + echo 'CTRL-O (open in browser) ╱ ALT-E (examine in editor) ╱ ALT-A (show all refs)' + refs --exclude='refs/remotes' + ;; + all-refs) + echo 'CTRL-O (open in browser) ╱ ALT-E (examine in editor)' + refs + ;; + *) exit 1 ;; + esac + elif [[ $# -gt 1 ]]; then + set -e + + branch=$(git rev-parse --abbrev-ref HEAD 2> /dev/null) + if [[ $branch = HEAD ]]; then + branch=$(git describe --exact-match --tags 2> /dev/null || git rev-parse --short HEAD) + fi + + # Only supports GitHub for now + case "$1" in + commit) + hash=$(grep -o "[a-f0-9]\{7,\}" <<< "$2" | head -n 1) + path=/commit/$hash + ;; + branch|remote-branch) + branch=$(sed 's/^[* ]*//' <<< "$2" | cut -d' ' -f1) + remote=$(git config branch."${branch}".remote || echo 'origin') + branch=${branch#$remote/} + path=/tree/$branch + ;; + remote) + remote=$2 + path=/tree/$branch + ;; + file) path=/blob/$branch/$(git rev-parse --show-prefix)$2 ;; + tag) path=/releases/tag/$2 ;; + *) exit 1 ;; + esac + + remote=${remote:-$(git config branch."${branch}".remote || echo 'origin')} + remote_url=$(git remote get-url "$remote" 2> /dev/null || echo "$remote") + + if [[ $remote_url =~ ^git@ ]]; then + url=${remote_url%.git} + url=${url#git@} + url=https://${url/://} + elif [[ $remote_url =~ ^http ]]; then + url=${remote_url%.git} + fi + + case "$(uname -sr)" in + Darwin*) + open "$url$path" + ;; + *microsoft* | *Microsoft*) + explorer.exe "$url$path" + ;; + *) + xdg-open "$url$path" + ;; + esac + exit 0 + fi +fi + +if [[ $- =~ i ]] || [[ $1 = --run ]]; then # ---------------------------------- + +if [[ $__fzf_git_fzf ]]; then + eval "$__fzf_git_fzf" +else + # Redefine this function to change the options + _fzf_git_fzf() { + fzf --height 50% --tmux 90%,70% \ + --layout reverse --multi --min-height 20+ --border \ + --no-separator --header-border horizontal \ + --border-label-pos 2 \ + --color 'label:blue' \ + --preview-window 'right,50%' --preview-border line \ + --bind 'ctrl-/:change-preview-window(down,50%|hidden|)' "$@" + } +fi + +_fzf_git_check() { + git rev-parse HEAD > /dev/null 2>&1 && return + + [[ -n $TMUX ]] && tmux display-message "Not in a git repository" + return 1 +} + +__fzf_git=${BASH_SOURCE[0]:-${(%):-%x}} +__fzf_git=$(readlink -f "$__fzf_git" 2> /dev/null || /usr/bin/ruby --disable-gems -e 'puts File.expand_path(ARGV.first)' "$__fzf_git" 2> /dev/null) + +_fzf_git_files() { + _fzf_git_check || return + local root query + root=$(git rev-parse --show-toplevel) + [[ $root != "$PWD" ]] && query='!../ ' + + (git -c color.status=$(__fzf_git_color) status --short --no-branch + git ls-files "$root" | grep -vxFf <(git status -s | grep '^[^?]' | cut -c4-; echo :) | sed 's/^/ /') | + _fzf_git_fzf -m --ansi --nth 2..,.. \ + --border-label '📁 Files ' \ + --header 'CTRL-O (open in browser) ╱ ALT-E (open in editor)' \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list file {-1}" \ + --bind "alt-e:execute:${EDITOR:-vim} {-1} > /dev/tty" \ + --query "$query" \ + --preview "git diff --no-ext-diff --color=$(__fzf_git_color .) -- {-1} | $(__fzf_git_pager); $(__fzf_git_cat) {-1}" "$@" | + cut -c4- | sed 's/.* -> //' +} + +_fzf_git_branches() { + _fzf_git_check || return + + local shell + [[ -n "${BASH_VERSION:-}" ]] && shell=bash || shell=zsh + + bash "$__fzf_git" --list branches | + __fzf_git_fzf=$(declare -f _fzf_git_fzf) _fzf_git_fzf --ansi \ + --border-label '🌲 Branches ' \ + --header-lines 2 \ + --tiebreak begin \ + --preview-window down,border-top,40% \ + --color hl:underline,hl+:underline \ + --no-hscroll \ + --bind 'ctrl-/:change-preview-window(down,70%|hidden|)' \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list branch {}" \ + --bind "alt-a:change-border-label(🌳 All branches)+reload:bash \"$__fzf_git\" --list all-branches" \ + --bind "alt-h:become:LIST_OPTS=\$(cut -c3- <<< {} | cut -d' ' -f1) $shell \"$__fzf_git\" --run hashes" \ + --bind "alt-enter:become:printf '%s\n' {+} | cut -c3- | sed 's@[^/]*/@@'" \ + --preview "git log --oneline --graph --date=short --color=$(__fzf_git_color .) --pretty='format:%C(auto)%cd %h%d %s' \$(cut -c3- <<< {} | cut -d' ' -f1) --" "$@" | + sed 's/^\* //' | awk '{print $1}' # Slightly modified to work with hashes as well +} + +_fzf_git_tags() { + _fzf_git_check || return + git tag --sort -version:refname | + _fzf_git_fzf --preview-window right,70% \ + --border-label '📛 Tags ' \ + --header 'CTRL-O (open in browser)' \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list tag {}" \ + --preview "git show --color=$(__fzf_git_color .) {} | $(__fzf_git_pager)" "$@" +} + +_fzf_git_hashes() { + _fzf_git_check || return + bash "$__fzf_git" --list hashes | + _fzf_git_fzf --ansi --no-sort --bind 'ctrl-s:toggle-sort' \ + --border-label '🍡 Hashes ' \ + --header-lines 2 \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list commit {}" \ + --bind "ctrl-d:execute:grep -o '[a-f0-9]\{7,\}' <<< {} | head -n 1 | xargs git diff --color=$(__fzf_git_color) > /dev/tty" \ + --bind "alt-a:change-border-label(🍇 All hashes)+reload:bash \"$__fzf_git\" --list all-hashes" \ + --color hl:underline,hl+:underline \ + --preview "grep -o '[a-f0-9]\{7,\}' <<< {} | head -n 1 | xargs git show --color=$(__fzf_git_color .) | $(__fzf_git_pager)" "$@" | + awk 'match($0, /[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]*/) { print substr($0, RSTART, RLENGTH) }' +} + +_fzf_git_remotes() { + _fzf_git_check || return + git remote -v | awk '{print $1 "\t" $2}' | uniq | + _fzf_git_fzf --tac \ + --border-label '📡 Remotes ' \ + --header 'CTRL-O (open in browser)' \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list remote {1}" \ + --preview-window right,70% \ + --preview "git log --oneline --graph --date=short --color=$(__fzf_git_color .) --pretty='format:%C(auto)%cd %h%d %s' '{1}/$(git rev-parse --abbrev-ref HEAD)' --" "$@" | + cut -d$'\t' -f1 +} + +_fzf_git_stashes() { + _fzf_git_check || return + git stash list | _fzf_git_fzf \ + --border-label '🥡 Stashes ' \ + --header 'CTRL-X (drop stash)' \ + --bind 'ctrl-x:reload(git stash drop -q {1}; git stash list)' \ + -d: --preview "git show --color=$(__fzf_git_color .) {1} | $(__fzf_git_pager)" "$@" | + cut -d: -f1 +} + +_fzf_git_lreflogs() { + _fzf_git_check || return + git reflog --color=$(__fzf_git_color) --format="%C(blue)%gD %C(yellow)%h%C(auto)%d %gs" | _fzf_git_fzf --ansi \ + --border-label '📒 Reflogs ' \ + --preview "git show --color=$(__fzf_git_color .) {1} | $(__fzf_git_pager)" "$@" | + awk '{print $1}' +} + +_fzf_git_each_ref() { + _fzf_git_check || return + bash "$__fzf_git" --list refs | _fzf_git_fzf --ansi \ + --nth 2,2.. \ + --tiebreak begin \ + --border-label '☘️ Each ref ' \ + --header-lines 1 \ + --preview-window down,border-top,40% \ + --color hl:underline,hl+:underline \ + --no-hscroll \ + --bind 'ctrl-/:change-preview-window(down,70%|hidden|)' \ + --bind "ctrl-o:execute-silent:bash \"$__fzf_git\" --list {1} {2}" \ + --bind "alt-e:execute:${EDITOR:-vim} <(git show {2}) > /dev/tty" \ + --bind "alt-a:change-border-label(🍀 Every ref)+reload:bash \"$__fzf_git\" --list all-refs" \ + --preview "git log --oneline --graph --date=short --color=$(__fzf_git_color .) --pretty='format:%C(auto)%cd %h%d %s' {2} --" "$@" | + awk '{print $2}' +} + +_fzf_git_worktrees() { + _fzf_git_check || return + git worktree list | _fzf_git_fzf \ + --border-label '🌴 Worktrees ' \ + --header 'CTRL-X (remove worktree)' \ + --bind 'ctrl-x:reload(git worktree remove {1} > /dev/null; git worktree list)' \ + --preview " + git -c color.status=$(__fzf_git_color .) -C {1} status --short --branch + echo + git log --oneline --graph --date=short --color=$(__fzf_git_color .) --pretty='format:%C(auto)%cd %h%d %s' {2} -- + " "$@" | + awk '{print $1}' +} + +_fzf_git_list_bindings(){ + cat <<'EOF' + +CTRL-G ? to show this list +CTRL-G CTRL-F for Files +CTRL-G CTRL-B for Branches +CTRL-G CTRL-T for Tags +CTRL-G CTRL-R for Remotes +CTRL-G CTRL-H for commit Hashes +CTRL-G CTRL-S for Stashes +CTRL-G CTRL-L for reflogs +CTRL-G CTRL-W for Worktrees +CTRL-G CTRL-E for Each ref (git for-each-ref) +EOF +} + +fi # -------------------------------------------------------------------------- + +if [[ $1 = --run ]]; then + shift + type=$1 + shift + eval "_fzf_git_$type" "$@" + +elif [[ $- =~ i ]]; then # ------------------------------------------------------ +if [[ -n "${BASH_VERSION:-}" ]]; then + __fzf_git_init() { + bind -m emacs-standard '"\er": redraw-current-line' + bind -m emacs-standard '"\C-z": vi-editing-mode' + bind -m vi-command '"\C-z": emacs-editing-mode' + bind -m vi-insert '"\C-z": emacs-editing-mode' + + local o c + for o in "$@"; do + c=${o:0:1} + if [[ $c == '?' ]]; then + bind -x '"\C-g'$c'": _fzf_git_list_bindings' + continue + fi + bind -m emacs-standard '"\C-g\C-'$c'": " \C-u \C-a\C-k`_fzf_git_'$o'`\e\C-e\C-y\C-a\C-y\ey\C-h\C-e\er \C-h"' + bind -m vi-command '"\C-g\C-'$c'": "\C-z\C-g\C-'$c'\C-z"' + bind -m vi-insert '"\C-g\C-'$c'": "\C-z\C-g\C-'$c'\C-z"' + bind -m emacs-standard '"\C-g'$c'": " \C-u \C-a\C-k`_fzf_git_'$o'`\e\C-e\C-y\C-a\C-y\ey\C-h\C-e\er \C-h"' + bind -m vi-command '"\C-g'$c'": "\C-z\C-g'$c'\C-z"' + bind -m vi-insert '"\C-g'$c'": "\C-z\C-g'$c'\C-z"' + done + } +elif [[ -n "${ZSH_VERSION:-}" ]]; then + __fzf_git_join() { + local item + while read item; do + echo -n "${(q)item} " + done + } + + __fzf_git_init() { + setopt localoptions nonomatch + local m o + for o in "$@"; do + if [[ ${o[1]} == "?" ]];then + eval "fzf-git-$o-widget() { zle -M '$(_fzf_git_list_bindings)' }" + else + eval "fzf-git-$o-widget() { local result=\$(_fzf_git_$o | __fzf_git_join); zle reset-prompt; LBUFFER+=\$result }" + fi + eval "zle -N fzf-git-$o-widget" + for m in emacs vicmd viins; do + eval "bindkey -M $m '^g^${o[1]}' fzf-git-$o-widget" + eval "bindkey -M $m '^g${o[1]}' fzf-git-$o-widget" + done + done + } +fi +__fzf_git_init files branches tags remotes hashes stashes lreflogs each_ref worktrees '?list_bindings' + +fi # -------------------------------------------------------------------------- diff --git a/zsh/.zsh/plugins/zoxide.plugin.zsh b/zsh/.zsh/plugins/zoxide.plugin.zsh new file mode 100755 index 0000000..25d2e83 --- /dev/null +++ b/zsh/.zsh/plugins/zoxide.plugin.zsh @@ -0,0 +1,5 @@ +if (( $+commands[zoxide] )); then + eval "$(zoxide init --cmd ${ZOXIDE_CMD_OVERRIDE:-z} zsh)" +else + echo '[oh-my-zsh] zoxide not found, please install it from https://github.com/ajeetdsouza/zoxide' +fi diff --git a/zsh/.zsh/plugins/zsh-autosuggestions b/zsh/.zsh/plugins/zsh-autosuggestions new file mode 160000 index 0000000..85919cd --- /dev/null +++ b/zsh/.zsh/plugins/zsh-autosuggestions @@ -0,0 +1 @@ +Subproject commit 85919cd1ffa7d2d5412f6d3fe437ebdbeeec4fc5 diff --git a/zsh/.zsh/plugins/zsh-syntax-highlighting b/zsh/.zsh/plugins/zsh-syntax-highlighting new file mode 160000 index 0000000..5eb677b --- /dev/null +++ b/zsh/.zsh/plugins/zsh-syntax-highlighting @@ -0,0 +1 @@ +Subproject commit 5eb677bb0fa9a3e60f0eff031dc13926e093df92 diff --git a/zsh/.zshenv b/zsh/.zshenv index b0311f0..9c2e959 100644 --- a/zsh/.zshenv +++ b/zsh/.zshenv @@ -1,38 +1,18 @@ -# Add ~/.local/bin if not exists -case ":$PATH:" in - *":$HOME/.local/bin:"*) ;; - *) export PATH="$HOME/.local/bin:$PATH" ;; -esac - -if [ -f "/home/linuxbrew/.linuxbrew/bin/brew" ]; then - # Initialize Homebrew - export HOMEBREW_NO_ENV_HINTS=1 - eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" -fi - -if command -v starship > /dev/null 2>&1; then - # Initialize Starship - eval "$(starship init zsh)" -fi - -if [ -e "$HOME/.cargo" ]; then - source "$HOME/.cargo/env" -fi - -export EDITOR="nvim" -export MANPAGER="nvim +Man!" +# XDG Settings Basic +export XDG_CONFIG_HOME=${HOME}/.config +export XDG_DATA_HOME=${HOME}/.local/share +export XDG_CACHE_HOME=${HOME}/.local/cache +export XDG_STATE_HOME=${HOME}/.local/state export DOTFILES="$HOME/.dotfiles" -export GOPATH="$HOME/.local/share/Go" -export GOBIN=$GOPATH/bin -export GRAALVM_HOME="${HOME}/.local/share/mise/installs/java/graalvm-community-23.0.1" +export EDITOR=nvim export HELPDIR=/usr/share/zsh/"${ZSH_VERSION}"/help -export JAVA_HOME="${HOME}/.local/share/mise/installs/java/23.0.1" -export VIRTUAL_ENV_DISABLE_PROMPT=1 -export JMETER_HOME="$(which jmeter)" -export FZF_DEFAULT_COMMAND="fdfind --type f --hidden --strip-cwd-prefix --exclude .git" +export MISE_HOME=$HOME/.local/share/mise/installs + +# fzf +export FZF_DEFAULT_COMMAND="fdfind --hidden --type file --strip-cwd-prefix --exclude .git" export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" -export FZF_ALT_C_COMMAND="fdfind --type d --hidden --strip-cwd-prefix --exclude .git" -# Catppuccin Mocha theme for FZF +export FZF_ALT_C_COMMAND="fdfind --hidden --type directory --strip-cwd-prefix --exclude .git" +# Export Catppuccin Mocha theme for FZF export FZF_DEFAULT_OPTS=" \ --height 60% --layout=reverse --border \ --color=bg+:#313244,bg:#1E1E2E,spinner:#F5E0DC,hl:#F38BA8 \ @@ -40,13 +20,31 @@ export FZF_DEFAULT_OPTS=" \ --color=marker:#B4BEFE,fg+:#CDD6F4,prompt:#CBA6F7,hl+:#F38BA8 \ --color=selected-bg:#45475A \ --color=border:#313244,label:#CDD6F4" -export FZF_TMUX_OPTS=" -p90%,70% " -export FZF_CTRL_T_OPTS="--preview 'batcat --color=always -n --line-range :500 {}'" -export FZF_ALT_C_OPTS="--preview 'eza --tree --color=always {} | head -200'" +export FZF_TMUX_OPTS=" -p90%,70%" -source <(fzf --zsh) +# Homebrew +if [ -f "/home/linuxbrew/.linuxbrew/bin/brew" ]; then + # Initialize Homebrew + export HOMEBREW_NO_ENV_HINTS=1 + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" +fi + +# Mise +if command -v mise >/dev/null 2>&1; then + eval "$(mise activate zsh)" +fi + +# Golang +if command -v go >/dev/null 2>&1; then + export GOPATH="$HOME/.local/share/Go" + export GOBIN="$GOPATH/bin" +fi + +# Java +if command -v java >/dev/null 2>&1; then + export JAVA_HOME="$(dirname $(mise bin-paths | grep -i java))" +fi + +# Python +export VIRTUAL_ENV_DISABLE_PROMPT=1 -# Launch tmux in the default session -# if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then -# tmux attach-session -t default || tmux new-session -s default -# fi diff --git a/zsh/.zshrc b/zsh/.zshrc index 0522096..8fe4d90 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -1,122 +1,113 @@ -# If you come from bash you might have to change your $PATH. -# export PATH=$HOME/bin:/usr/local/bin:$PATH +# main zsh settings. env in ~/.zprofile +# read second -# Path to your oh-my-zsh installation. -export ZSH="$HOME/.oh-my-zsh" +export ZSH_HOME="$HOME/.zsh" +# source global shell alias & variables files [[ ! -f ~/.zshenv ]] || source ~/.zshenv -# Set name of the theme to load --- if set to "random", it will -# load a random theme each time oh-my-zsh is loaded, in which case, -# to know which specific one was loaded, run: echo $RANDOM_THEME -# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes -# ZSH_THEME="robbyrussell" +# load modules +zmodload zsh/complist +autoload -U compinit && compinit +autoload -U colors && colors +# autoload -U tetris # main attraction of zsh, obviously -# Set list of themes to pick from when loading at random -# Setting this variable when ZSH_THEME=random will cause zsh to load -# a theme from this variable instead of looking in $ZSH/themes/ -# If set to an empty array, this variable will have no effect. -# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" ) +# cmp opts +zstyle ':completion:*' menu select # tab opens cmp menu +zstyle ':completion:*' special-dirs true # force . and .. to show in cmp menu +zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} ma=0\;33 # colorize cmp menu +# zstyle ':completion:*' file-list true # more detailed list +zstyle ':completion:*' squeeze-slashes false # explicit disable to allow /*/ expansion -# Uncomment the following line to use case-sensitive completion. -# CASE_SENSITIVE="true" +# main opts +setopt append_history inc_append_history share_history # better history +# on exit, history appends rather than overwrites; history is appended as soon as cmds executed; history shared across sessions +setopt auto_menu menu_complete # autocmp first menu match +setopt autocd # type a dir to cd +setopt auto_param_slash # when a dir is completed, add a / instead of a trailing space +setopt no_case_glob no_case_match # make cmp case insensitive +setopt globdots # include dotfiles +setopt extended_glob # match ~ # ^ +setopt interactive_comments # allow comments in shell +unsetopt prompt_sp # don't autoclean blanklines +stty stop undef # disable accidental ctrl s -# Uncomment the following line to use hyphen-insensitive completion. -# Case-sensitive completion must be off. _ and - will be interchangeable. -# HYPHEN_INSENSITIVE="true" - -# Uncomment one of the following lines to change the auto-update behavior -# zstyle ':omz:update' mode disabled # disable automatic updates -# zstyle ':omz:update' mode auto # update automatically without asking -# zstyle ':omz:update' mode reminder # just remind me to update when it's time - -# Uncomment the following line to change how often to auto-update (in days). -# zstyle ':omz:update' frequency 13 - -# Uncomment the following line if pasting URLs and other text is messed up. -# DISABLE_MAGIC_FUNCTIONS="true" - -# Uncomment the following line to disable colors in ls. -# DISABLE_LS_COLORS="true" - -# Uncomment the following line to disable auto-setting terminal title. -# DISABLE_AUTO_TITLE="true" - -# Uncomment the following line to enable command auto-correction. -# ENABLE_CORRECTION="true" - -# Uncomment the following line to display red dots whilst waiting for completion. -# You can also set it to another string to have that shown instead of the default red dots. -# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f" -# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765) -# COMPLETION_WAITING_DOTS="true" - -# Uncomment the following line if you want to disable marking untracked files -# under VCS as dirty. This makes repository status check for large repositories -# much, much faster. -# DISABLE_UNTRACKED_FILES_DIRTY="true" - -# Uncomment the following line if you want to change the command execution time -# stamp shown in the history command output. -# You can set one of the optional three formats: -# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" -# or set a custom format using the strftime function format specifications, -# see 'man strftime' for details. -# HIST_STAMPS="mm/dd/yyyy" - -# Would you like to use another custom folder than $ZSH/custom? -ZSH_CUSTOM=$ZSH/custom - -# Which plugins would you like to load? -# Standard plugins can be found in $ZSH/plugins/ -# Custom plugins may be added to $ZSH_CUSTOM/plugins/ -# Example format: plugins=(rails git textmate ruby lighthouse) -# Add wisely, as too many plugins slow down shell startup. -plugins=( - aws - command-not-found - gitignore - mise - zoxide - zsh-autosuggestions - zsh-interactive-cd - zsh-navigation-tools - zsh-syntax-highlighting -) - -source $ZSH/oh-my-zsh.sh - -# User configuration - -# export MANPATH="/usr/local/man:$MANPATH" - -# You may need to manually set your language environment -# export LANG=en_US.UTF-8 - -# Preferred editor for local and remote sessions -# if [[ -n $SSH_CONNECTION ]]; then -# export EDITOR='vim' -# else -# export EDITOR='mvim' -# fi - -# Compilation flags -# export ARCHFLAGS="-arch x86_64" - -# Set personal aliases, overriding those provided by oh-my-zsh libs, -# plugins, and themes. Aliases can be placed here, though oh-my-zsh -# users are encouraged to define aliases within the ZSH_CUSTOM folder. -# For a full list of active aliases, run `alias`. -# -# Example aliases -# alias zshconfig="mate ~/.zshrc" -# alias ohmyzsh="mate ~/.oh-my-zsh" - -# Setup Emacs keymap -bindkey -e +# history opts +HISTSIZE=1000000 +SAVEHIST=1000000 +# HISTFILE="$XDG_CACHE_HOME/zsh_history" # move histfile to cache +HISTCONTROL=ignoreboth # consecutive duplicates & commands starting with space are not saved fpath=(~/.zsh $fpath) autoload run-help -autoload -Uz compinit && compinit -u +# fzf setup +source <(fzf --zsh) # allow for fzf history widget + +# binds +bindkey "^a" beginning-of-line +bindkey "^e" end-of-line +bindkey "^k" kill-line +bindkey "^j" backward-word +bindkey "^k" forward-word +bindkey "^H" backward-kill-word +# ctrl J & K for going up and down in prev commands +bindkey "^J" history-search-forward +bindkey "^K" history-search-backward +bindkey '^R' fzf-history-widget + +# set up prompt +NEWLINE=$'\n' +PROMPT='%F{blue}%B%~%b%f %F{green}❯%f ' + +# load plugins +ZSH_PLUGINS_DIR="$ZSH_HOME/plugins" +[ -e "$ZSH_PLUGINS_DIR/colored-man-pages.plugin.zsh" ] && source "$ZSH_PLUGINS_DIR/colored-man-pages.plugin.zsh" +[ -e "$ZSH_PLUGINS_DIR/command-not-found-plugin.zsh" ] && source "$ZSH_PLUGINS_DIR/command-not-found-plugin.zsh" +[ -e "$ZSH_PLUGINS_DIR/mise.plugin.zsh" ] && source "$ZSH_PLUGINS_DIR/mise.plugin.zsh" +[ -e "$ZSH_PLUGINS_DIR/zoxide.plugin.zsh" ] && source "$ZSH_PLUGINS_DIR/zoxide.plugin.zsh" +[ -e "$ZSH_PLUGINS_DIR/fzf-git.sh" ] && source "$ZSH_PLUGINS_DIR/fzf-git.sh" +[ -e "$ZSH_PLUGINS_DIR/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ] && source "$ZSH_PLUGINS_DIR/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" +[ -e "$ZSH_PLUGINS_DIR/zsh-autosuggestions/zsh-autosuggestions.zsh" ] && source "$ZSH_PLUGINS_DIR/zsh-autosuggestions/zsh-autosuggestions.zsh" + +# define user aliases +pbcopy() { + if [ -f "$1" ]; then + mime_type=$(file --mime-type -b "$1") + wl-copy --type "$mime_type" < "$1" + else + printf "%s" "$*" | wl-copy + fi +} + +alias pbpaste='wl-paste --no-newline' +alias ls='ls --color=auto --group-directories-first' + +# Replace Vim implementation +alias vi='nvim' +alias vim='nvim' + +# Replace grep command tool +alias grep='grep --color=auto' +alias egrep='grep -E' +alias fgrep='grep -F' + +# Other aliases +alias paths='echo -e ${PATH//:/\\n}' # path: Echo all executable Paths +alias userlist="cut -d: -f1 /etc/passwd | sort" +alias ip='ip -color' +alias stow='stow -d $DOTFILES ' + +case ":$PATH:" in + *":$HOME/.local/bin:"*) ;; + *) export PATH="$HOME/.local/bin:$PATH" ;; +esac + +if [ -e "$HOME/.cargo" ]; then + source "$HOME/.cargo/env" +fi + +if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then + tmux attach-session -t default || tmux new-session -s default +fi