main
1# Lazyworktree integration
2has lazyworktree || return
3
4# Source shell functions (fast: ~0.4ms)
5# Resolve symlink for NixOS where commands[] points to /etc/profiles/per-user/...
6local lw_functions="${commands[lazyworktree]:A:h:h}/share/lazyworktree/functions.zsh"
7[[ -f "$lw_functions" ]] && source "$lw_functions"
8
9# Named repo shortcuts
10wh() { worktree_jump "$HOME/src/home" "$@"; }
11wnix() { worktree_jump "$HOME/src/nixpkgs" "$@"; }
12_wh() { _worktree_jump "$HOME/src/home"; }
13_wnix() { _worktree_jump "$HOME/src/nixpkgs"; }
14(( $+functions[compdef] )) && { compdef _wh wh; compdef _wnix wnix; }
15
16# Auto-discover worktree aliases from source directories
17_lazyworktree_discover_aliases() {
18 setopt local_options nullglob
19 local -A repo_dirs=()
20 local base_dirs=(
21 "$HOME/src/gitlab.com:wgb"
22 "$HOME/src/github.com:wgh"
23 "$HOME/src/osp:wo"
24 "$HOME/src:ws"
25 "$HOME/src/tektoncd:wt"
26 )
27 local entry base_dir prefix repo_dir repo_name target_dir alias_name org_name
28
29 for entry in "${base_dirs[@]}"; do
30 base_dir="${entry%%:*}"
31 prefix="${entry##*:}"
32 [[ -d "$base_dir" ]] || continue
33
34 if [[ "$prefix" == "wgh" ]] || [[ "$prefix" == "wgb" ]]; then
35 eval "${prefix}_() {
36 local selection org_dir
37 selection=\$(find \"$base_dir\" -maxdepth 2 -name .git -type d 2>/dev/null | sed 's|/.git$||' | sed \"s|^$base_dir/||\" | fzf --prompt=\"$base_dir: \")
38 [[ -n \"\$selection\" ]] || return 1
39 worktree_jump \"$base_dir/\$selection\" \"\$@\"
40 }"
41 for org_dir in "$base_dir"/*/; do
42 [[ -d "$org_dir" ]] || continue
43 org_name="$(basename "$org_dir")"
44 for repo_dir in "$org_dir"/*/; do
45 [[ -d "$repo_dir" ]] || continue
46 [[ -d "$repo_dir/.git" ]] || continue
47 repo_name="$(basename "$repo_dir")"
48 target_dir="$repo_dir"
49 alias_name="${prefix}_${org_name}_${repo_name}"
50 repo_dirs[$alias_name]="$target_dir"
51 eval "${alias_name}() { worktree_jump \"$target_dir\" \"\$@\"; }"
52 done
53 done
54 else
55 eval "${prefix}_() {
56 local selection
57 selection=\$(ls -1 \"$base_dir\" 2>/dev/null | fzf --prompt=\"$base_dir: \")
58 [[ -n \"\$selection\" ]] || return 1
59 if [[ -d \"$base_dir/\$selection/.git\" ]]; then
60 worktree_jump \"$base_dir/\$selection\" \"\$@\"
61 else
62 echo \"Not a git repo: $base_dir/\$selection\" >&2
63 return 1
64 fi
65 }"
66 for repo_dir in "$base_dir"/*/; do
67 [[ -d "$repo_dir" ]] || continue
68 repo_name="$(basename "$repo_dir")"
69 [[ -d "$repo_dir/.git" ]] || continue
70 target_dir="$repo_dir"
71 alias_name="${prefix}_${repo_name}"
72 if [[ -n "${repo_dirs[$alias_name]}" ]] && [[ "${repo_dirs[$alias_name]}" != "$target_dir" ]]; then
73 alias_name="${prefix}_${repo_name}"
74 fi
75 repo_dirs[$alias_name]="$target_dir"
76 eval "${alias_name}() { worktree_jump \"$target_dir\" \"\$@\"; }"
77 done
78 fi
79 done
80}
81# Defer discovery to first prompt (saves ~210ms)
82__deferred_lazyworktree() {
83 _lazyworktree_discover_aliases >/dev/null 2>&1
84 add-zsh-hook -d precmd __deferred_lazyworktree
85 unfunction __deferred_lazyworktree
86}
87add-zsh-hook precmd __deferred_lazyworktree