summaryrefslogtreecommitdiff
path: root/mac/.config/zsh/scripts.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/zsh/scripts.zsh')
-rw-r--r--mac/.config/zsh/scripts.zsh865
1 files changed, 865 insertions, 0 deletions
diff --git a/mac/.config/zsh/scripts.zsh b/mac/.config/zsh/scripts.zsh
new file mode 100644
index 0000000..7f31426
--- /dev/null
+++ b/mac/.config/zsh/scripts.zsh
@@ -0,0 +1,865 @@
+#!/bin/zsh
+
+###########################################################################################
+###########################################################################################
+### --- ALIAS --- ###
+# find aliases
+alias ali=fzf_aliases
+function fzf_aliases() {
+ local aliases=$(alias)
+ local max_length=$(echo "$aliases" | cut -d'=' -f1 | awk '{print length}' | sort -nr | head -n 1)
+ [ "$max_length" -gt 20 ] && max_length=20
+ format_aliases() {
+ echo "$aliases" | while IFS= read -r line; do
+ alias_name=$(echo "$line" | cut -d'=' -f1)
+ alias_command=$(echo "$line" | cut -d'=' -f2- | sed "s/^'//;s/'$//")
+ printf "%-${max_length}s = %s\n" "$alias_name" "$alias_command"
+ done
+ }
+ alias_file="${XDG_CONFIG_HOME:-${HOME}/.config}/shell/aliasrc"
+ selected_alias=$(format_aliases | fzf --header="select an alias")
+ # check if an alias was selected
+ if [ -n "$selected_alias" ]; then
+ # extract the alias name
+ alias_name=$(echo "$selected_alias" | cut -d'=' -f1 | xargs)
+
+ # get the line number from the alias file
+ line_number=$(grep -n "^alias $alias_name=" "$alias_file" | cut -d':' -f1)
+
+ # open nvim at the specified line
+ if [ -n "$line_number" ]; then
+ nvim "+$line_number" "$alias_file"
+ else
+ scripts_file="${ZDOTDIR:-${XDG_CONFIG_HOME:-${HOME}/.config}/zsh}/7-scripts.zsh"
+ line_number=$(grep -n "^alias $alias_name=" "$scripts_file" | cut -d':' -f1)
+ nvim "+$line_number" "$scripts_file"
+ fi
+ fi
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- CHEAT.SH --- ###
+function cht() {
+ if [ -z "$1" ]; then
+ printf "Enter program name: "
+ read prog
+ curl cht.sh/"$prog"
+ else
+ curl cht.sh/"$1"
+ fi
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- COLOR --- ###
+# print color
+alias pcol=print_col
+function print_col() {
+ awk 'BEGIN{
+s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
+for (colnum = 0; colnum<77; colnum++) {
+ r = 255-(colnum*255/76);
+ g = (colnum*510/76);
+ b = (colnum*255/76);
+ if (g>255) g = 510-g;
+ printf "\033[48;2;%d;%d;%dm", r,g,b;
+ printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
+ printf "%s\033[0m", substr(s,colnum+1,1);
+}
+printf "\n";
+ }'
+}
+function colors() {
+ curl -s https://gist.githubusercontent.com/HaleTom/89ffe32783f89f403bba96bd7bcd1263/raw/ | zsh
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- COMMAND OUTPUT --- ###
+# print last command output
+alias ilco=insert_last_command_output
+function insert_last_command_output() { LBUFFER+="$(eval $history[$((HISTCMD-1))])"; }
+
+
+###########################################################################################
+###########################################################################################
+### --- CONFIG --- ###
+# fzf config
+alias fcfg=fzf_config
+function fzf_config() {
+ [ $# -gt 0 ] && zoxide query -i "$1" | xargs "${EDITOR}" && return
+ local file
+ file="$(zoxide query -l | fzf --cycle -1 -0 --no-sort +m)" && cd "${file}" || return 1
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- COPY --- ###
+# copy file name to clipboard
+alias cpfn=copy_filename
+function copy_filename() {
+ if ! command -v xclip >/dev/null; then
+ echo "Error: 'xclip' is not installed." >&2
+ return 1
+ fi
+
+ if ! command -v fzf >/dev/null; then
+ echo "Error: 'fzf' is not installed." >&2
+ return 1
+ fi
+
+ local file="$1"
+
+ # If no argument is provided, use fzf to select a file
+ if [ -z "$file" ]; then
+ file=$(fzf --cycle --preview "cat {}")
+ fi
+
+ # Check if a file was found or selected
+ if [ -n "$file" ]; then
+ local filename=$(basename "$file")
+ echo -n "$filename" | xclip -selection clipboard
+ echo "Filename copied to clipboard: $filename"
+ else
+ echo "No file selected."
+ fi
+}
+
+# copy file contents
+alias cpfc=copy_contents
+function copy_contents() {
+ if ! command -v xclip >/dev/null; then
+ echo "Error: 'xclip' is not installed." >&2
+ return 1
+ fi
+
+ if ! command -v fzf >/dev/null; then
+ echo "Error: 'fzf' is not installed." >&2
+ return 1
+ fi
+
+ local file="$1"
+
+ # If no argument is provided, use fzf to select a file
+ if [ -z "$file" ]; then
+ file=$(fzf --cycle --preview "cat {}")
+ fi
+
+ # Check if a file was found or selected
+ if [ -n "$file" ]; then
+ # Use `sed` to delete only the last newline character
+ cat "$file" | sed ':a;N;$!ba;s/\n$//' | xclip -selection clipboard
+ echo "Contents of '$file' copied to clipboard."
+ else
+ echo "No file selected."
+ fi
+}
+
+# copy the current working directory path to the clipboard
+alias cpcp=copy_current_path
+function copy_current_path() {
+ if command -v xclip >/dev/null; then
+ printf "%s" "$PWD" | xclip -selection clipboard
+ printf "%s\n" "Current working directory '$(basename "$PWD")' path copied to clipboard."
+ else
+ printf "%s\n" "Error: 'xclip' command not found. Please install 'xclip' to use this function."
+ fi
+}
+
+# copy file real path
+alias cprp=copy_real_path
+function copy_real_path() {
+ if ! command -v xclip >/dev/null; then
+ echo "Error: 'xclip' is not installed." >&2
+ return 1
+ fi
+
+ if ! command -v fzf >/dev/null; then
+ echo "Error: 'fzf' is not installed." >&2
+ return 1
+ fi
+
+ local file="$1"
+
+ # If no argument is provided, use fzf to select a file
+ if [ -z "$file" ]; then
+ file=$(fzf --cycle --preview "cat {}")
+ fi
+
+ # Check if a file was found or selected
+ if [ -n "$file" ]; then
+ local full_path=$(realpath "$file")
+ echo -n "$full_path" | xclip -selection clipboard
+ echo "File path copied to clipboard: $full_path"
+ else
+ echo "No file selected."
+ fi
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- CREATE --- ###
+# mkdir && cd
+alias mc=mkcd
+function mkcd() { mkdir -p "$@" && cd "$_"; }
+
+# create dir with current date
+function mkdt () { mkdir -p ${1:+$1$prefix_separator}"$(date +%F)"; }
+
+
+###########################################################################################
+###########################################################################################
+### --- DOCKER --- ###
+# select a docker container to start and attach to
+alias doca=docker_container_init
+function docker_container_init() {
+ local cid
+ cid=$(docker ps -a | sed 1d | fzf --cycle -1 -q "$1" | awk '{print $1}')
+
+ [ -n "$cid" ] && docker start "$cid" && docker attach "$cid"
+}
+
+# select a running docker container to stop
+alias docs=docker_stop
+function docker_stop() {
+ local cid
+ cid=$(docker ps | sed 1d | fzf --cycle -q "$1" | awk '{print $1}')
+
+ [ -n "$cid" ] && docker stop "$cid"
+}
+
+# select a docker container or containers to remove
+alias docrmc=docker_remove_containers
+function docker_remove_containers() { docker ps -a | sed 1d | fzf --cycle -q "$1" --no-sort -m --tac | awk '{ print $1 }' | xargs -r docker rm; }
+
+# select a docker image or images to remove
+alias docrmi=docker_remove_images
+function docker_remove_images() { docker images | sed 1d | fzf --cycle -q "$1" --no-sort -m --tac | awk '{ print $3 }' | xargs -r docker rmi; }
+
+
+###########################################################################################
+###########################################################################################
+### --- ECRYPTFS --- ###
+# mount ecryptfs
+alias emt=ecryptfs_mount
+function ecryptfs_mount() {
+ ! mount | grep -q " $1 " && echo "$(pass show encryption/ecryptfs)" | sudo mount -t ecryptfs "$1" "$2" \
+ -o ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=yes,ecryptfs_sig="$(sudo cat /root/.ecryptfs/sig-cache.txt)",ecryptfs_fnek_sig="$(sudo cat /root/.ecryptfs/sig-cache.txt)",passwd="$(pass show encryption/ecryptfs)" >/dev/null 2>&1 &&
+ echo "'$2' folder is mounted!"
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- GIT --- ###
+# TheSiahxyz's git repos
+alias gcggg=thesiahxyz_git
+function thesiahxyz_git() {
+ choice=$(ssh "$THESIAH_GIT" "ls -a | grep -i \".*\\.git$\"" | fzf --cycle --prompt="  " --height=50% --layout=reverse --border --exit-0)
+ [ -n "$choice" ] && [ -n "$1" ] && git clone "${THESIAH_GIT:-git@${THESIAH:-thesiah.xyz}}":"$choice" "$1" ||
+ [ -n "$choice" ] && git clone "${THESIAH_GIT:-git@${THESIAH:-thesiah.xyz}}":"$choice"
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- GOTO --- ###
+# go to the path stored in the clipboard
+alias cdp=cd_clipboard_path
+function cd_clipboard_path() {
+ if command -v xclip >/dev/null; then
+ local target_dir
+ target_dir="$(xclip -o -sel clipboard)"
+ if [[ -d "${target_dir}" ]]; then
+ cd "${target_dir}" && printf "%s\n" "Changed directory to: ${target_dir}"
+ else
+ printf "%s\n" "Error: Invalid directory path or directory does not exist."
+ fi
+ else
+ printf "%s\n" "Error: 'xclip' command not found. Please install 'xclip' to use this function."
+ fi
+}
+
+# fzf directory and go to the parent directory
+alias fD=fzf_directory
+function fzf_directory() {
+ dirs="$(find "$HOME" -type d \( -path "**/.git/*" -o -path "**/.cache/*" -o -path "**/yay/*" -o -path "$HOME/.local/bin/zsh" \) -prune -o -type d -print | fzf --multi)"
+ [ -d "$dirs" ] && cd "$dirs" && ls -A || opensessions "$dirs"
+}
+
+# search scripts in ~/.local/bin
+alias sscs=search_scripts
+function search_scripts() {
+ choice="$(find ${HOME}/.local/bin -mindepth 1 -not -path "${HOME}/.local/bin/zsh" -not -path "${HOME}/.local/bin/zsh/*" -printf '%P\n' | fzf)"
+ [ -f "$HOME/.local/bin/$choice" ] && $EDITOR "$HOME/.local/bin/$choice"
+}
+
+# check git status by directories in specific path
+alias fgst=fetch_git_repos_status
+function fetch_git_repos_status() {
+ SELECTED_DIRS=$(bash << 'EOF'
+ # Source the Git prompt script to get access to __git_ps1
+ source /usr/share/git/completion/git-prompt.sh
+
+ # Enable symbols for dirty state, untracked files, and branch ahead/behind
+ export GIT_PS1_SHOWDIRTYSTATE="auto"
+ export GIT_PS1_SHOWUNTRACKEDFILES="auto"
+ export GIT_PS1_SHOWUPSTREAM="auto"
+
+ # Define an array of target directories
+ TARGET_DIRECTORIES=(
+ "$HOME/.dotfiles"
+ "$HOME/.local/share/.password-store"
+ "$HOME/.local/src/suckless"
+ )
+
+ # Check the directories under the paths. eg. ../repos/*
+ GIT_DIRS=("$HOME/Private/repos" "$HOME/Public/repos")
+
+ # Append all subdirectories under GIT_DIRS that are Git repositories
+ for GIT_DIR in "${GIT_DIRS[@]}"; do
+ if [ -d "$GIT_DIR" ]; then
+ for SUBDIR in "$GIT_DIR"/*; do
+ if [ -d "$SUBDIR/.git" ]; then
+ TARGET_DIRECTORIES+=("$SUBDIR")
+ fi
+ done
+ fi
+ done
+
+ # Create an array to store the output
+ OUTPUT=()
+
+ # Function to colorize only the Git status symbols
+ colorize_git_status() {
+ local status="$1"
+ # Colorize the entire status with a single color
+ echo -e "\033[33m${status}\033[0m" # Apply yellow color to the status
+ }
+
+ update_time() {
+ timestamp_file="${HOME}/.cache/gitreposupdate"
+ current_time=$(date +%s)
+ if [[ -f "$timestamp_file" ]] && (($(cat "$timestamp_file") > (current_time - 86400))); then
+ return 1 # No update needed
+ else
+ echo "$current_time" >"$timestamp_file"
+ return 0 # Update needed
+ fi
+ }
+ update_time && update=true || update=false
+
+ # Loop through each directory and get the Git status
+ for DIR in "${TARGET_DIRECTORIES[@]}"; do
+ if [ -d "$DIR/.git" ]; then
+ cd "$DIR" || continue
+
+ if $update; then
+ if [ "$(dirname $DIR)" = ".password-store" ]; then
+ pass git fetch >/dev/null 2>&1
+ else
+ git fetch --all --prune --jobs=10 >/dev/null 2>&1
+ fi
+ fi
+
+ # Get Git branch and status using __git_ps1
+ GIT_STATUS=$(__git_ps1 "%s")
+
+ # Colorize the Git status
+ COLORED_GIT_STATUS=$(colorize_git_status "$GIT_STATUS")
+
+ # Add formatted output with colored Git status and directory
+ OUTPUT+=("$(printf "%-20s %s" "$COLORED_GIT_STATUS" "$DIR")")
+ fi
+ done
+
+ # Pass the output to fzf with multi-select enabled (-m)
+ SELECTED=$(printf "%s\n" "${OUTPUT[@]}" | fzf -m --ansi --layout=reverse)
+
+ # Filter out lines that do not end with a valid directory path and are not empty
+ echo "$SELECTED" | awk '{if (NF > 1 && system("[ -d \""$NF"\" ]") == 0) print $NF}'
+EOF
+ )
+ [[ -z "${SELECTED_DIRS// }" ]] && return
+ if [[ "$(echo "$SELECTED_DIRS" | wc -l)" -eq 1 ]]; then
+ cd "$SELECTED_DIRS"
+ if [[ -n "$(git -C "$SELECTED_DIRS" status --porcelain)" ]]; then
+ git status --porcelain 2>/dev/null
+ fi
+ else
+ opensessions "$SELECTED_DIRS"
+ fi
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- HELP --- ###
+# help opt colored by bat
+alias bathelp='bat --plain --language=help'
+function help() { "$@" --help 2>&1 | bathelp; }
+
+
+###########################################################################################
+###########################################################################################
+### --- KEYS --- ###
+# list setxkbmap options
+alias xkey=xset_options
+function xset_options() { grep --color -E "$1" /usr/share/X11/xkb/rules/base.lst; }
+
+# print raw xev key events
+alias keys=xev_raw_key_event
+function xev_raw_key_event() {
+ xev -event keyboard | awk '
+ /^KeyPress/,/^KeyRelease/ {
+ if ($0 ~ /keysym/) print $0
+ }'
+}
+
+# print aligned xev key events
+alias key=xev_aligned_key_event
+function xev_aligned_key_event() {
+ xev -event keyboard | awk '
+ /^(KeyPress|KeyRelease)/ {
+ event_type = $1
+ }
+ /keysym/ {
+ gsub(/\),$/, "", $7)
+ printf "%-12s %-3s %s\n", event_type, $4, $7
+ }'
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- KILL --- ###
+# kill process
+alias fpkill=fzf_kill_process
+function fzf_kill_process() {
+ ps aux | grep -e "^$(whoami)" |
+ fzf --height 40% \
+ --layout=reverse \
+ --header-lines=1 \
+ --prompt="Select process to kill: " \
+ --preview 'echo {}' \
+ --preview-window up:3:hidden:wrap \
+ --bind 'F2:toggle-preview' |
+ awk '{print $2}' |
+ xargs -r bash -c '
+ if ! kill -9 "$1" 2>/dev/null; then
+ echo "Regular kill failed. Attempting with sudo..."
+ sudo kill -9 "$1" || echo "Failed to kill process $1" >&2
+ fi
+ ' --
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- LF --- ###
+# open lf and cd to the file path
+function lfcd () {
+ tmp="$(mktemp -uq)"
+ trap 'rm -f $tmp >/dev/null 2>&1 && trap - HUP INT QUIT TERM PWR EXIT' HUP INT QUIT TERM PWR EXIT
+ lf -last-dir-path="$tmp" "$@"
+ if [ -f "$tmp" ]; then
+ dir="$(cat "$tmp")"
+ [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir"
+ fi
+}
+
+###########################################################################################
+###########################################################################################
+### --- MAN --- ###
+# color man page
+function van() {
+ if [[ -z "$@" ]]; then
+ if command -v fzf >/dev/null 2>&1; then
+ local page=$(command man -k . | fzf --prompt='Man> ' --exit-0 | awk '{print $1}')
+ if [[ -n $page ]]; then
+ nvim +"Man $page | only"
+ fi
+ fi
+ else
+ nvim +"Man $@ | only"
+ fi
+}
+function ban() {
+ BAT_THEME="ansi" command batman "$@"
+ return $?
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- NVIM --- ###
+# rename nvim directory
+alias ctn=rename_nvim_dir
+function rename_nvim_dir() {
+ if [ $# -ne 2 ]; then
+ echo "Usage: ctn <old_suffix> <new_suffix>"
+ return 1
+ fi
+
+ local old_suffix="$1"
+ local new_suffix="$2"
+ local base_name="nvim"
+
+ # Handle the case where the old suffix is '.'
+ [ "$old_suffix" = "." ] && old_suffix=""
+ [ "$new_suffix" = "." ] && new_suffix=""
+
+ # Directories to be renamed
+ local directories=(
+ "$HOME/.config/$base_name"
+ "$HOME/.local/share/$base_name"
+ "$HOME/.local/state/$base_name"
+ "$HOME/.cache/$base_name"
+ )
+
+ for dir in "${directories[@]}"; do
+ if [ -d "$dir$old_suffix" ]; then
+ mv "$dir$old_suffix" "$dir$new_suffix"
+ echo "Renamed $dir$old_suffix to $dir$new_suffix"
+ else
+ echo "Directory $dir$old_suffix does not exist"
+ fi
+ done
+}
+
+# change nvim config
+alias cnf=change_nvim_config_dir
+function change_nvim_config_dir() {
+ local base_dir="${XDG_DOTFILES_DIR:-$HOME/.dotfiles}/$(whereami)/.config" # Base directory for Neovim configs
+ local target_dir="${XDG_CONFIG_HOME:-$HOME/.config}/nvim" # Target directory for active Neovim config
+ local target_share="${XDG_DATA_HOME:-$HOME/.local/share}/nvim" # Neovim"s share directory
+ local target_state="${XDG_STATE_HOME:-$HOME/.local/state}/nvim" # Neovim"s state directory
+ local target_cache="${XDG_CACHE_HOME:-$HOME/.cache}/nvim" # Neovim"s cache directory
+
+ # Explicitly list your configuration options
+ local configs=("Default" "TheSiahxyz" "AstroNvim" "LazyVim" "LunarVim" "NvChad")
+ local selected_dir=$(printf "%s\n" "${configs[@]}" | fzf --cycle --prompt=" Neovim Config  " --height 50% --layout=reverse --border --exit-0)
+
+ # Check if a configuration was selected
+ [[ -z $selected_dir ]] && return 1
+
+ # Default configuration
+ if [[ $selected_dir == "Default" ]]; then
+ selected_dir="kickstart"
+ echo "Clearing the Neovim configuration directory..."
+ rm -rf "$target_dir" "$target_share" "$target_state" "$target_cache" &>/dev/null
+ echo "Switched to the base Neovim configuration."
+ return 0
+ fi
+
+ # Construct the full path of the selected configuration
+ local config_path="$base_dir/$selected_dir"
+ echo "$config_path"
+
+ # Clear existing configurations if confirmed by the user
+ echo -n "This will overwrite existing configurations. Continue? (y/n) "
+ read reply
+ if [[ $reply =~ ^[Yy]$ ]]; then
+ echo "Clearing existing Neovim configurations..."
+ rm -rf "$target_dir" "$target_share" "$target_state" "$target_cache" &>/dev/null
+ mkdir -p "$target_dir" "$target_share" "$target_state" "$target_cache" &>/dev/null
+ else
+ echo "Operation cancelled."
+ return 2
+ fi
+
+ # Copy the selected configuration to the target directories
+ if [[ -d "$config_path" ]]; then
+ cp -r "$config_path/." "$target_dir" > /dev/null 2>&1
+ echo "Successfully applied $selected_dir configuration."
+ shortcuts >/dev/null
+ else
+ echo "Configuration directory for $selected_dir does not exist."
+ return 3
+ fi
+
+ if [ "$whereami" = "ar" ]; then
+ chown -R "$USER:wheel" "/home/$USER/.config/nvim"
+ fi
+}
+
+# run nvim with target config
+alias vnf=nvim_target_config
+function nvim_target_config() {
+ items=("Default" "TheSiahxyz" "AstroNvim" "LazyVim" "LunarVim" "NvChad")
+ config=$(printf "%s\n" "${items[@]}" | fzf --cycle --prompt=" Neovim Config  " --height=~50% --layout=reverse --border --exit-0)
+ [[ -z $config ]] && return 0
+ [[ $config == "Default" ]] && config="kickstart"
+ NVIM_APPNAME=$config nvim $@
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- PASS --- ###
+# otp
+function pass_otp() { pass otp uri -q $1; }
+
+# otp insert
+function pass_otp_insert() { pass otp insert $1; }
+
+# copy pass qr code
+alias cpqr=pass_qr
+function pass_qr() { qrencode -o "$1".png -t png -Sv 40 < "$1".pgp; }
+
+
+###########################################################################################
+###########################################################################################
+### --- PASTE --- ###
+if ls "${ZPLUGINDIR:-${XDG_SCRIPTS_HOME:-${HOME}/.local/bin}/zsh}/zsh-autosuggestions" >/dev/null 2>&1; then
+ autoload -Uz url-quote-magic
+ function pasteinit() {
+ OLD_SELF_INSERT=${${(s.:.)widgets[self-insert]}[2,3]}
+ zle -N self-insert url-quote-magic
+ }
+ function pastefinish() {
+ zle -N self-insert $OLD_SELF_INSERT
+ }
+ zstyle :bracketed-paste-magic paste-init pasteinit
+ zstyle :bracketed-paste-magic paste-finish pastefinish
+fi
+
+
+###########################################################################################
+###########################################################################################
+### --- SDCV --- ###
+function def() {
+ sdcv -n --utf8-output --color "$@" 2>&1 | \
+ fold --width=$(tput cols) | \
+ less --quit-if-one-screen -RX
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- STOW --- ###
+# run stow script from dotfiles repo
+alias dstw=dotfeils_stw
+function dotfiles_stw() { "${XDG_DOTFILES_DIR:-${HOME}/.dotfiles}/$(whereami)/.local/bin/stw"; }
+
+
+###########################################################################################
+###########################################################################################
+### --- SUDO --- ###
+# insert prefix at the beginning of the previous command
+function __command_replace_buffer() {
+ local old=$1 new=$2 space=${2:+ }
+ if [[ $CURSOR -le ${#old} ]]; then
+ BUFFER="${new}${space}${BUFFER#$old }"
+ CURSOR=${#new}
+ else
+ LBUFFER="${new}${space}${LBUFFER#$old }"
+ fi
+}
+
+# manipulate the previous command line
+function pre_cmd() {
+ local prepend_command=$1
+ local EDITOR=${SUDO_EDITOR:-${VISUAL:-$EDITOR}}
+ [[ -z $BUFFER ]] && LBUFFER="$(fc -ln -1)"
+ local WHITESPACE=""
+
+ # Remove leading whitespace and store it for later restoration
+ if [[ ${LBUFFER:0:1} = " " ]]; then
+ WHITESPACE=" "
+ LBUFFER="${LBUFFER:1}"
+ fi
+
+ # Main logic block
+ {
+ local cmd="${${(Az)BUFFER}[1]}"
+ local realcmd="${${(Az)aliases[$cmd]}[1]:-$cmd}"
+ local editorcmd="${${(Az)EDITOR}[1]}"
+ # Check if EDITOR is set, otherwise prepend the command and return
+ if [[ -z "$EDITOR" ]]; then
+ LBUFFER="$prepend_command $LBUFFER"
+ return
+ fi
+ # Check if the command is an editor command
+ is_editor_cmd=false
+ # Check if realcmd matches EDITOR, editorcmd, or their case variations
+ [[ "$realcmd" = (\$EDITOR|$editorcmd|${editorcmd:c}) || "${realcmd:c}" = ($editorcmd|${editorcmd:c}) ]] && is_editor_cmd=true
+ # Check if the real command's executable path matches the editor command
+ builtin which -a "$realcmd" | command grep -Fx -q "$editorcmd" && is_editor_cmd=true
+ # Execute the command replacement if it's an editor command
+ if $is_editor_cmd; then
+ __command_replace_buffer "$cmd" "$prepend_command -e"
+ return
+ fi
+ # Handle various command patterns in BUFFER
+ case "$BUFFER" in
+ $editorcmd\ *) __command_replace_buffer "$editorcmd" "$prepend_command -e" ;;
+ \$EDITOR\ *) __command_replace_buffer '$EDITOR' "$prepend_command -e" ;;
+ ${prepend_command}\ -e\ *) __command_replace_buffer "${prepend_command} -e" "$EDITOR" ;;
+ ${prepend_command}\ *) __command_replace_buffer "${prepend_command}" "" ;;
+ *) LBUFFER="$prepend_command $LBUFFER" ;;
+ esac
+ } always {
+ # Cleanup code: restore leading whitespace and update the command line
+ LBUFFER="${WHITESPACE}${LBUFFER}"
+ zle && zle redisplay # Only run redisplay if zle is enabled
+ }
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- TMUX --- ###
+# tmux init
+alias tit=tmux_init
+function tmux_init() {
+ ! tmux has-session -t "$TERMINAL" 2>/dev/null && tmux new-session -d -s "$TERMINAL" -c "$HOME"
+ [[ -n "$TMUX" ]] && tmux switch-client -t "$TERMINAL" || tmux attach-session -t "$TERMINAL"
+}
+
+# cd tmux session
+alias cds=cd_session_path
+function cd_session_path() { cd "$(tmux display-message -p '#{session_path}')"; }
+
+# kill tmux session
+alias tmk='kill_tmux_sessions'
+function kill_tmux_sessions() {
+ local sessions
+ sessions="$(tmux ls | fzf --cycle --exit-0 --multi)" || return $?
+ local i
+ for i in "${(f@)sessions}"
+ do
+ [[ $i =~ '([^:]*):.*' ]] && {
+ echo "Killing $match[1]"
+ tmux kill-session -t "$match[1]"
+ }
+ done
+}
+
+# switch tmux session
+alias tms='switch_tmux_session'
+function switch_tmux_session() {
+ local session
+ session=$(tmux list-sessions -F "#{session_name}" \
+ | fzf --cycle --query="$1" --select-1 --exit-0) &&
+ tmux switch-client -t "$session"
+}
+
+
+###########################################################################################
+###########################################################################################
+### --- VIRTUAL ENV --- ###
+# create venvs
+alias createv=create_venv
+function create_venv() {
+ local env_dir="${XDG_DATA_HOME:-${HOME}/.local/share}/venvs/${1:-venv}"
+ local requirements_path="${XDG_DATA_HOME:-${HOME}/.local/share}/venvs"
+
+ # Check if the environment already exists
+ # Create the virtual environment
+ echo "Creating new virtual environment in '$env_dir'..."
+ python3 -m venv $env_dir
+
+ # Activate the virtual environment
+ source $env_dir/bin/activate
+
+ # Optional: Install any default packages
+ pip3 install --upgrade pip >/dev/null 2>&1
+
+ if [ -f "$requirements_path/default-requirements.txt" ]; then
+ echo "Installing packages from '$requirements_path/default-requirements.txt'..."
+ pip3 install -r "$requirements_path/default-requirements.txt" >/dev/null 2>&1
+ fi
+
+ if [ -f "$requirements_path/captured-requirements.txt" ]; then
+ echo "Installing packages from '$requirements_path/captured-requirements.txt'..."
+ pip3 install -r "$requirements_path/captured-requirements.txt" >/dev/null 2>&1
+ fi
+
+ echo "Virtual environment '${1:-venv}' created and activated!"
+}
+
+# activate or switch venvs
+alias actv=active_venv
+function active_venv() {
+ local venv="$1"
+ if [[ -z "$venv" ]]; then
+ venv=$(find "$XDG_DATA_HOME/venvs" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | fzf)
+ fi
+ source "$XDG_DATA_HOME/venvs/$venv/bin/activate"
+ python -m ensurepip --upgrade >/dev/null 2>&1
+ python -m pip install --upgrade pip >/dev/null 2>&1
+ jupyter kernel --kernel=$venv
+}
+
+# list venvs
+alias listv=list_venv
+function list_venv() {
+ local venvs_dir="${XDG_DATA_HOME:-${HOME}/.local/share}/venvs"
+ local venvs=("$venvs_dir"/*)
+
+ if [ ${#venvs[@]} -eq 0 ]; then
+ echo "No venvs"
+ return 0
+ fi
+
+ echo "venvs list:"
+ for venv in "${venvs[@]}"; do
+ if [ -d "$venv" ]; then
+ echo " 󰢔 $(basename "$venv")"
+ fi
+ done
+}
+
+# deactivate venv
+alias deactv=deactive_venv
+function deactive_venv() {
+ if [[ "$VIRTUAL_ENV" != "" ]]; then
+ if [[ ! -f "${XDG_DATA_HOME:-${HOME}/.local/share}/venvs/requirements.txt" ]]; then
+ pip3 freeze > "${XDG_DATA_HOME:-${HOME}/.local/share}/venvs/captured-requirements.txt"
+ fi
+ deactivate
+ echo "Virtual environment deactivated and all installed packages captured"
+ else
+ echo "No virtual environment is active."
+ fi
+}
+
+# delete venv
+alias delv=delete_venv
+function delete_venv() {
+ local venv="$1"
+ local env_dir="${XDG_DATA_HOME:-${HOME}/.local/share}/venvs"
+
+ if [[ -z $venv ]]; then
+ local options=($(find "$env_dir" -maxdepth 1 -mindepth 1 -type d -exec basename {} \;))
+ options+=("Delete All")
+
+ # Prompt user to select virtual environments or choose to delete all
+ local selected_envs=$(printf "%s\n" "${options[@]}" | fzf --cycle --prompt="venvs  " --height=~50% --layout=reverse --border --multi --exit-0)
+
+ if [[ -z $selected_envs ]]; then
+ echo "No venvs selected"
+ return 0
+ elif [[ $selected_envs == *"Delete All"* ]]; then
+ rm -rf "$env_dir"/*
+ echo "All venvs deleted"
+ else
+ # Loop through selected environments and delete each
+ local env
+ while IFS= read -r env; do
+ rm -rf "$env_dir/$env"
+ echo "$env deleted"
+ done <<< "$selected_envs"
+ fi
+ else
+ rm -rf "$env_dir/$venv"
+ echo "$venv deleted"
+ fi
+}