308 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			308 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/zsh
 | ||
| 
 | ||
| # NAVIGATION AND FILE SYSTEM
 | ||
| z() {
 | ||
|   unfunction "$0"
 | ||
|   eval "$(zoxide init zsh)"
 | ||
|   $0 "$@"
 | ||
| }
 | ||
| 
 | ||
| zi() { z "$@" }
 | ||
| za() { z "$@" }
 | ||
| zrm() { zoxide remove "$@" }
 | ||
| 
 | ||
| function open {
 | ||
|   for i in $*; do
 | ||
|     setsid nohup xdg-open $i > /dev/null 2> /dev/null
 | ||
|   done
 | ||
| }
 | ||
| 
 | ||
| function fopen() {
 | ||
|   local selected
 | ||
|   selected=$(fd "$@" | fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}')
 | ||
|   [[ -n "$selected" ]] && setsid nohup xdg-open "$selected" >/dev/null 2>&1 &
 | ||
| }
 | ||
| 
 | ||
| # DEVELOPMENT TOOLS
 | ||
| # Package manager detection with caching
 | ||
| function _package_manager {
 | ||
|   local pkg_manager=""
 | ||
|   if [[ -f bun.lockb ]]; then
 | ||
|     pkg_manager="bun"
 | ||
|   elif [[ -f pnpm-lock.yaml ]]; then
 | ||
|     pkg_manager="pnpm"
 | ||
|   elif [[ -f yarn.lock ]]; then
 | ||
|     pkg_manager="yarn"
 | ||
|   elif [[ -f package-lock.json ]]; then
 | ||
|     pkg_manager="npm"
 | ||
|   else
 | ||
|     pkg_manager="pnpm"
 | ||
|   fi
 | ||
| 
 | ||
|   if [[ -f package.json ]] && [[ $1 != "run" ]] && [[ $1 != "install" ]] && [[ $1 != "add" ]] && [[ $1 != "remove" ]] && [[ $1 != "i" ]] && [[ $1 != "rm" ]]; then
 | ||
|     if jq -e ".scripts[\"$1\"] != null" package.json >/dev/null 2>&1; then
 | ||
|       set -- "run" "$@"
 | ||
|     fi
 | ||
|   fi
 | ||
| 
 | ||
|   if command -v corepack >/dev/null 2>&1; then
 | ||
|     corepack ${pkg_manager} "$@"
 | ||
|   else
 | ||
|     command ${pkg_manager} "$@"
 | ||
|   fi
 | ||
| }
 | ||
| 
 | ||
| # Improved development commit with optional message
 | ||
| function dc() {
 | ||
|   if ! git rev-parse --is-inside-work-tree &>/dev/null; then
 | ||
|     echo "Error: Not in a git repository"
 | ||
|     return 1
 | ||
|   fi
 | ||
| 
 | ||
|   if [[ -z $(git status --porcelain) ]]; then
 | ||
|     echo "No changes to commit"
 | ||
|     return 0
 | ||
|   fi
 | ||
| 
 | ||
|   git add .
 | ||
| 
 | ||
|   local commit_msg
 | ||
|   if [[ -n "$1" ]]; then
 | ||
|     commit_msg="$1"
 | ||
|   else
 | ||
|     local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
 | ||
|     commit_msg="dev: automated commit - ${timestamp}"
 | ||
|   fi
 | ||
| 
 | ||
|   git commit -m "$commit_msg" --no-gpg-sign
 | ||
|   git push &>/dev/null || { echo "Push failed"; return 1; }
 | ||
| }
 | ||
| 
 | ||
| # Git branch cleanup helper
 | ||
| function git-clean() {
 | ||
|   local current_branch=$(git rev-parse --abbrev-ref HEAD)
 | ||
|   local branches_to_delete=$(git branch --merged | grep -v "^\*" | grep -v "master" | grep -v "main" | grep -v "develop")
 | ||
| 
 | ||
|   if [[ -z "$branches_to_delete" ]]; then
 | ||
|     echo "No merged branches to clean up"
 | ||
|     return 0
 | ||
|   fi
 | ||
| 
 | ||
|   echo "The following merged branches will be deleted:"
 | ||
|   echo "$branches_to_delete"
 | ||
|   echo -n "Continue? [y/N] "
 | ||
|   read confirm
 | ||
| 
 | ||
|   if [[ "$confirm" =~ ^[Yy]$ ]]; then
 | ||
|     echo "$branches_to_delete" | xargs git branch -d
 | ||
|     echo "Branches deleted locally"
 | ||
| 
 | ||
|     echo -n "Delete remote branches too? [y/N] "
 | ||
|     read confirm_remote
 | ||
| 
 | ||
|     if [[ "$confirm_remote" =~ ^[Yy]$ ]]; then
 | ||
|       echo "$branches_to_delete" | xargs -I{} git push origin --delete {}
 | ||
|       echo "Remote branches deleted"
 | ||
|     fi
 | ||
|   fi
 | ||
| }
 | ||
| 
 | ||
| function sm { /opt/sublime_merge/sublime_merge $1; }
 | ||
| 
 | ||
| function vimrc {
 | ||
|   cd $XDG_CONFIG_HOME/nvim
 | ||
|   nvim
 | ||
|   cd - >/dev/null
 | ||
| }
 | ||
| 
 | ||
| function zshrc {
 | ||
|   cd $XDG_CONFIG_HOME/zsh
 | ||
|   nvim
 | ||
|   cd - >/dev/null
 | ||
| }
 | ||
| 
 | ||
| # FILE SHARING AND NETWORKING
 | ||
| function upload_file() {
 | ||
|   local usage="Usage: $0 [-o] <file>"
 | ||
|   local one_time=true
 | ||
| 
 | ||
|   # Parse options
 | ||
|   while getopts ":o" opt; do
 | ||
|     case ${opt} in
 | ||
|       o ) one_time=false ;;
 | ||
|       \? )
 | ||
|         echo "Invalid option: -$OPTARG" >&2
 | ||
|         echo $usage
 | ||
|         return 1 ;;
 | ||
|     esac
 | ||
|   done
 | ||
|   shift $((OPTIND -1))
 | ||
| 
 | ||
|   # Check file argument
 | ||
|   if [[ -z "$1" ]]; then
 | ||
|     echo $usage
 | ||
|     return 1
 | ||
|   fi
 | ||
|   if [[ ! -f "$1" ]]; then
 | ||
|     echo "Error: File not found: $1"
 | ||
|     return 1
 | ||
|   fi
 | ||
| 
 | ||
|   local url="https://drop.mz.uy"
 | ||
|   echo "Uploading $1 to $url... (one-time: ${one_time})"
 | ||
| 
 | ||
|   # Prepare upload options
 | ||
|   local form_data=("-F" "file=@$1")
 | ||
|   if $one_time; then
 | ||
|     form_data+=("-F" "one_time=")
 | ||
|   fi
 | ||
| 
 | ||
|   # Try up to 3 times with a short delay between attempts
 | ||
|   local max_attempts=3
 | ||
|   local attempt=1
 | ||
|   local success=false
 | ||
| 
 | ||
|   while (( attempt <= max_attempts )) && ! $success; do
 | ||
|     if (( attempt > 1 )); then
 | ||
|       echo "Retry attempt $attempt of $max_attempts..."
 | ||
|       sleep 1
 | ||
|     fi
 | ||
| 
 | ||
|     local full_response=$(curl -i "${form_data[@]}" "$url" 2>/dev/null)
 | ||
|     local curl_status=$?
 | ||
| 
 | ||
|     if [[ $curl_status -eq 0 ]]; then
 | ||
|       local url_response=$(echo "$full_response" | tail -n 1)
 | ||
|       local token=$(echo "$full_response" | grep -i "X-Token:" | awk '{print $2}' | tr -d '\r')
 | ||
| 
 | ||
|       if [[ -n "$url_response" ]]; then
 | ||
|         echo -n "$url_response" | wl-copy
 | ||
|         echo "✓ Uploaded: $url_response (copied to clipboard)"
 | ||
| 
 | ||
|         if [[ -n "$token" ]]; then
 | ||
|           echo "Management token: $token"
 | ||
|         fi
 | ||
| 
 | ||
|         success=true
 | ||
|         break
 | ||
|       fi
 | ||
|     fi
 | ||
| 
 | ||
|     (( attempt++ ))
 | ||
|   done
 | ||
| 
 | ||
|   if ! $success; then
 | ||
|     echo "× Failed to upload file after $max_attempts attempts"
 | ||
|     return 1
 | ||
|   fi
 | ||
| }
 | ||
| 
 | ||
| function expose() {
 | ||
|   if [ -z "$1" ]; then
 | ||
|     echo "Usage: expose <port>"
 | ||
|     return 1
 | ||
|   fi
 | ||
|   ssh marianozunino@srv.us -R 1:localhost:$1
 | ||
| }
 | ||
| 
 | ||
| function ppid {
 | ||
|   lsof -i :$1
 | ||
| }
 | ||
| 
 | ||
| alias pport="ppid"
 | ||
| 
 | ||
| # KUBERNETES AND DEVOPS
 | ||
| function kf {
 | ||
|   if [ -z "$1" ]; then
 | ||
|     echo "Usage: kf <cluster> [service-name]"
 | ||
|     return 1
 | ||
|   fi
 | ||
| 
 | ||
|   local namespace="oc-app"
 | ||
|   local cluster="oc-$1-eks-cluster"
 | ||
|   local svc_filter=""
 | ||
| 
 | ||
|   if [ ! -z "$2" ]; then
 | ||
|     svc_filter="-l app.kubernetes.io/instance=$2"
 | ||
|   fi
 | ||
| 
 | ||
|   sudo -E kubefwd svc -n ${namespace} -x ${cluster} ${svc_filter}
 | ||
| }
 | ||
| 
 | ||
| # SYSTEM AND UTILITY FUNCTIONS
 | ||
| # Lazy-load handler for heavy tools
 | ||
| function _lazy_load() {
 | ||
|   local cmd="$1"
 | ||
|   local loader="$2"
 | ||
| 
 | ||
|   eval "${cmd}() {
 | ||
|     unfunction $cmd
 | ||
|     eval \"\$($loader)\"
 | ||
|     $cmd \"\$@\"
 | ||
|   }"
 | ||
| }
 | ||
| 
 | ||
| # Example: lazy load kubectl completion
 | ||
| _lazy_load kubectl "kubectl completion zsh"
 | ||
| 
 | ||
| function wacom {
 | ||
|     if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
 | ||
|         systemctl --user enable opentabletdriver --now
 | ||
|         otd loadsettings ~/Sync/wacom/wacom.json
 | ||
|     else
 | ||
|         xsetwacom --set "Wacom One by Wacom S Pen stylus" ResetArea
 | ||
|         xsetwacom --set "Wacom One by Wacom S Pen stylus" MapToOutput DisplayPort-0
 | ||
|         xsetwacom --set "Wacom One by Wacom S Pen stylus" Rotate half
 | ||
| 
 | ||
|         xsetwacom --set "Wacom One by Wacom S Pen eraser" ResetArea
 | ||
|         xsetwacom --set "Wacom One by Wacom S Pen eraser" MapToOutput DisplayPort-0
 | ||
|     fi
 | ||
| }
 | ||
| 
 | ||
| function cat {
 | ||
|     if [ -n "$SSH_TTY" ] || [ -n "$SSH_CLIENT" ] || [ -n "$SSH_CONNECTION" ]; then
 | ||
|         bat --plain --paging=never "$@"
 | ||
|     else
 | ||
|         bat "$@"
 | ||
|     fi
 | ||
| }
 | ||
| 
 | ||
| function _has {
 | ||
|   return $( whence $1 >/dev/null )
 | ||
| }
 | ||
| 
 | ||
| # History-based directory navigation
 | ||
| function cdr {
 | ||
|   local dir
 | ||
|   dir=$(dirs -pl | awk '!x[$0]++' | fzf --height 40% --reverse)
 | ||
|   [[ -n "$dir" ]] && cd "$dir"
 | ||
| }
 | ||
| 
 | ||
| if [[ -v TMUX ]]; then
 | ||
|   function swaymsg {
 | ||
|     export SWAYSOCK=$XDG_RUNTIME_DIR/sway-ipc.$UID.$(pgrep -x sway).sock
 | ||
|     command swaymsg "$@"
 | ||
|   }
 | ||
| fi
 | ||
| 
 | ||
| # COMPLETIONS
 | ||
| for completion_file in ~/.local/share/zsh/*-autocomplete.zsh; do
 | ||
|     echo $completion_file
 | ||
|     if [ -f "$completion_file" ]; then
 | ||
|         source "$completion_file"
 | ||
|     fi
 | ||
| done
 | ||
| 
 | ||
| if command -v rop &> /dev/null; then eval "$(rop completion zsh)"; fi
 | ||
| if command -v goq &> /dev/null; then eval "$(goq completion zsh)"; fi
 | ||
| if command -v kubefwd &> /dev/null; then eval "$(kubefwd completion zsh)"; fi
 | ||
| if command -v bombadil &> /dev/null; then eval "$(bombadil generate-completions zsh)"; fi
 | ||
| if command -v eza &> /dev/null; then compdef eza=ls; fi
 | ||
| 
 | ||
| alias dev='~/Dev/marianozunino/dev/dev'
 | ||
| alias p='_package_manager'
 | ||
| alias fo='fopen'
 | ||
| alias drop='upload_file'
 | ||
| alias dump='upload_file'
 | ||
| alias pport=ppid
 | ||
| alias unChonk="echo '🧹 Starting the great node_modules purge...' && find . -name 'node_modules' -type d -prune -exec sh -c 'echo \"💥 Deleting {}\" && rm -rf \"{}\"' \;"
 |