From ee44717891add50a52167e84e862f7706cf9519b Mon Sep 17 00:00:00 2001 From: Dict Xiong Date: Fri, 19 Dec 2025 21:56:09 +0800 Subject: [PATCH] feat: zsh completion for beam and beaml --- functions/_beam | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ functions/_beaml | 35 +++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 functions/_beam create mode 100644 functions/_beaml diff --git a/functions/_beam b/functions/_beam new file mode 100644 index 0000000..f337a7a --- /dev/null +++ b/functions/_beam @@ -0,0 +1,99 @@ +#compdef beam + +# ============================================================================= +# Beam-Go Zsh Completion Script +# ============================================================================= + +_beam() { + local context state state_descr line + typeset -A opt_args + + _arguments -C \ + '1: :_beam_commands' \ + '*:: :->args' + + case $state in + (args) + case $line[1] in + (serve) _beam_serve ;; + (add) _beam_add ;; + (list) _beam_list ;; + (del) _beam_del ;; + esac + ;; + esac +} + +# --- Subcommand Definitions --- + +(( $+functions[_beam_commands] )) || +_beam_commands() { + local -a commands + commands=( + 'serve:Start the beam server daemon' + 'add:Share a file or directory' + 'list:List active shares' + 'del:Delete a share by path or code' + ) + _describe -t commands 'beam command' commands +} + +_beam_serve() { + _arguments \ + '(-d --database)'{-d,--database}'=[Database directory (Required)]:directory:_path_files -/' \ + '(-p --port)'{-p,--port}'=[Port to listen on (default :8280)]:port:' \ + '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \ + '--subpath=[Enable subpath sharing]' +} + +_beam_add() { + _arguments \ + '(-d --days)'{-d,--days}'=[Expiration days (default 7)]:days:' \ + '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \ + '1:file to share:_files' +} + +_beam_list() { + _arguments \ + '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' +} + +_beam_del() { + _arguments \ + '(-s --socket)'{-s,--socket}'=[Socket path]:socket path:_files' \ + '(-c --code)'{-c,--code}'=[Share code]:share code:_beam_active_codes' \ + '1:shared path:_files' +} + +# --- Helpers --- + +# 动态获取当前的 Share Code +# 它会尝试读取用户当前输入的 -s 参数,去连接正确的 socket +_beam_active_codes() { + local socket_path="" + + # 从 Zsh 解析的参数中提取 socket 路径 + if [[ -n ${opt_args[-s]} ]]; then + socket_path=${opt_args[-s]} + elif [[ -n ${opt_args[--socket]} ]]; then + socket_path=${opt_args[--socket]} + fi + + # 构造查询命令 + local cmd_args=() + cmd_args+=("list") + [[ -n $socket_path ]] && cmd_args+=("-s" "$socket_path") + + # 调用 beam list,跳过前两行表头,提取 Code($1) 和 Path($3) + # 2>/dev/null 防止服务未启动时报错打印到终端 + local -a shares + shares=("${(@f)$(beam "${cmd_args[@]}" 2>/dev/null | awk 'NR>2 {print $1":"$2" "$3" "$4}')}") + + if [[ ${#shares} -gt 0 ]]; then + _describe -t shares 'active share' shares + else + _message 'no active shares or server not running' + fi +} + +_beam "$@" \ No newline at end of file diff --git a/functions/_beaml b/functions/_beaml new file mode 100644 index 0000000..318b831 --- /dev/null +++ b/functions/_beaml @@ -0,0 +1,35 @@ +#compdef beaml + +_beaml() { + local context state line + typeset -A opt_args + + _arguments -C \ + '1: :->cmds' \ + '2: :->args' + + case $state in + cmds) + local commands; commands=( + 'add:Add a new item' + 'del:Delete an item' + 'list:List all items' + ) + _describe -t commands 'beaml commands' commands + ;; + args) + case $line[1] in + add) + _files + ;; + del) + local -a items + items=( /pss/lite/*(N:t) ) + _describe -t items 'item to delete' items + ;; + esac + ;; + esac +} + +_beaml "$@"