| # Custom completion widget that handles both :commands and @ completion | |
| function forge-completion() { | |
| local current_word="${LBUFFER##* }" | |
| # Handle @ completion (files and directories) | |
| if [[ "$current_word" =~ ^@.*$ ]]; then | |
| local filter_text="${current_word#@}" | |
| local selected | |
| # Use Rust's built-in file picker | |
| selected=$(_forge_select_with_query "$filter_text" file) | |
| if [[ -n "$selected" ]]; then | |
| selected="@[${selected}]" | |
| LBUFFER="${LBUFFER%$current_word}" | |
| BUFFER="${LBUFFER}${selected}${RBUFFER}" | |
| CURSOR=$((${#LBUFFER} + ${#selected})) | |
| fi | |
| zle reset-prompt | |
| return 0 | |
| fi | |
| # Handle :command completion (supports letters, numbers, hyphens, underscores) | |
| if [[ "${LBUFFER}" =~ "^:([a-zA-Z][a-zA-Z0-9_-]*)?$" ]]; then | |
| # Extract the text after the colon for filtering | |
| local filter_text="${LBUFFER#:}" | |
| # Use Rust's built-in command picker | |
| local selected | |
| selected=$(_forge_select_with_query "$filter_text" command) | |
| if [[ -n "$selected" ]]; then | |
| # Replace the current buffer with the selected command | |
| BUFFER=":$selected " | |
| CURSOR=${#BUFFER} | |
| fi | |
| zle reset-prompt | |
| return 0 | |
| fi | |
| # Fall back to default completion | |
| zle expand-or-complete | |
| } | |