初始化
This commit is contained in:
		
						commit
						f0b9f1b04b
					
				|  | @ -0,0 +1,3 @@ | ||||||
|  | #过滤target文件下生成的编译文件 | ||||||
|  | script/ | ||||||
|  | my_commands | ||||||
|  | @ -0,0 +1,204 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # (v9) 支持新格式:名称 # 说明 # 命令 | ||||||
|  | 
 | ||||||
|  | interactive_mode() { | ||||||
|  |   local command_file="${1:-/Users/linbin/SynologyDrive/附件/590/cmd/my_commands}" | ||||||
|  |   local initial_query="${2:-}" | ||||||
|  | 
 | ||||||
|  |   # 使用临时文件来避免复杂的引号转义问题 | ||||||
|  |   local preview_script="/tmp/preview_$$" | ||||||
|  |   cat > "$preview_script" << 'EOF' | ||||||
|  | #!/bin/bash | ||||||
|  | command_file="$1" | ||||||
|  | line_content="$2" | ||||||
|  | 
 | ||||||
|  | # trim空格 | ||||||
|  | name_part=$(echo "$line_content" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  | # 从原文件中获取完整的行 | ||||||
|  | full_line=$(grep -v "^#" "$command_file" | awk -F'#' -v name="$name_part" '{ | ||||||
|  |   first_field = $1 | ||||||
|  |   gsub(/^[[:space:]]+|[[:space:]]+$/, "", first_field) | ||||||
|  |   if (first_field == name) print $0 | ||||||
|  | }' | head -1) | ||||||
|  | 
 | ||||||
|  | if [ -n "$full_line" ]; then | ||||||
|  |   # 提取三部分:名称、说明、命令 | ||||||
|  |   name=$(echo "$full_line" | awk -F'#' '{print $1}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |   desc=$(echo "$full_line" | awk -F'#' '{print $2}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |   command_part=$(echo "$full_line" | awk -F'#' '{print $3}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  | 
 | ||||||
|  |   # 预览窗口的显示逻辑 | ||||||
|  |   echo "--- 名称 ---" | ||||||
|  |   echo "$name" | ||||||
|  |   echo "" | ||||||
|  |   echo "--- 说明 ---" | ||||||
|  |   echo "$desc" | ||||||
|  |   echo "" | ||||||
|  |   echo "--- 命令 ---" | ||||||
|  |   if [ -f "$command_part" ]; then | ||||||
|  |     echo "$command_part" | ||||||
|  |     echo "" | ||||||
|  |     echo "--- 文件内容 ---" | ||||||
|  |     cat "$command_part" 2>/dev/null || echo "无法读取文件内容" | ||||||
|  |   else | ||||||
|  |     echo "$command_part" | ||||||
|  |   fi | ||||||
|  | else | ||||||
|  |   echo "未找到对应的命令" | ||||||
|  | fi | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  |   chmod +x "$preview_script" | ||||||
|  | 
 | ||||||
|  |   # --- 模糊搜索 --- | ||||||
|  |   local selected_line | ||||||
|  |   selected_line=$(grep -v "^#" "$command_file" | | ||||||
|  |     # 使用#作为分隔符,让fzf只搜索第一部分(名称) | ||||||
|  |     awk -F'#' '{print $1}' | | ||||||
|  |     sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | | ||||||
|  |     fzf --height=40% --tac \ | ||||||
|  |       --query="$initial_query" \ | ||||||
|  |       --header "↑↓ 选择, Enter 执行, Esc 退出 (或 cmd <快捷词> 直接调用)" \ | ||||||
|  |       --preview "$preview_script '$command_file' {}") | ||||||
|  | 
 | ||||||
|  |   # 清理临时文件 | ||||||
|  |   rm -f "$preview_script" | ||||||
|  | 
 | ||||||
|  |   # 如果用户选择了,获取名称部分 | ||||||
|  |   if [ -n "$selected_line" ]; then | ||||||
|  |     selected_line=$(echo "$selected_line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   if [ -z "$selected_line" ]; then | ||||||
|  |     echo "已取消。" | ||||||
|  |     return 0 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # 从原文件中重新获取完整命令 | ||||||
|  |   local full_line | ||||||
|  |   full_line=$(grep -v "^#" "$command_file" | awk -F'#' -v name="$selected_line" '{ | ||||||
|  |     first_field = $1 | ||||||
|  |     gsub(/^[[:space:]]+|[[:space:]]+$/, "", first_field) | ||||||
|  |     if (first_field == name) print $0 | ||||||
|  |   }' | head -1) | ||||||
|  | 
 | ||||||
|  |   # 提取三部分 | ||||||
|  |   local name_part desc_part command_to_run | ||||||
|  |   name_part=$(echo "$full_line" | awk -F'#' '{print $1}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |   desc_part=$(echo "$full_line" | awk -F'#' '{print $2}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |   command_to_run=$(echo "$full_line" | awk -F'#' '{print $3}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  | 
 | ||||||
|  |   echo "▶ $name_part【$desc_part】" | ||||||
|  | 
 | ||||||
|  |   # 执行逻辑 - 对sh文件使用source执行 | ||||||
|  |   if [ -f "$command_to_run" ]; then | ||||||
|  |     if [[ "$command_to_run" == *.sh ]]; then | ||||||
|  |       source "$command_to_run" | ||||||
|  |     elif [ -x "$command_to_run" ]; then | ||||||
|  |       "$command_to_run" | ||||||
|  |     else | ||||||
|  |       source "$command_to_run" | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     eval "$command_to_run" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | cmd() { | ||||||
|  |   local command_file="/Users/linbin/SynologyDrive/附件/590/cmd/my_commands" | ||||||
|  | 
 | ||||||
|  |   # 检查命令文件是否存在 | ||||||
|  |   if [ ! -f "$command_file" ]; then | ||||||
|  |     echo "命令文件 $command_file 不存在。" | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # --- 处理直接调用(支持模糊匹配)--- | ||||||
|  |   # 检查是否提供了参数 (如: cmd lsa) | ||||||
|  |   if [ "$#" -gt 0 ]; then | ||||||
|  |     # 将所有参数用空格连接起来构造精确匹配模式 | ||||||
|  |     local shortcut="" | ||||||
|  |     for arg in "$@"; do | ||||||
|  |       if [ -n "$shortcut" ]; then | ||||||
|  |         shortcut="$shortcut $arg" | ||||||
|  |       else | ||||||
|  |         shortcut="$arg" | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     # 统一使用模糊匹配逻辑处理所有输入 | ||||||
|  |     # 将所有参数用空格连接起来进行模糊匹配 | ||||||
|  |     local all_args="" | ||||||
|  |     for arg in "$@"; do | ||||||
|  |       if [ -n "$all_args" ]; then | ||||||
|  |         all_args="$all_args $arg" | ||||||
|  |       else | ||||||
|  |         all_args="$arg" | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     fuzzy_matches=$(grep -v "^#" "$command_file" | awk -v keywords="$all_args" -F'#' ' | ||||||
|  |       { | ||||||
|  |         # 提取第一部分(名称)并trim空格 | ||||||
|  |         name_part = $1 | ||||||
|  |         gsub(/^[[:space:]]+|[[:space:]]+$/, "", name_part) | ||||||
|  | 
 | ||||||
|  |         # 将关键字按空格分割并检查每个关键字是否都匹配 | ||||||
|  |         n = split(keywords, kw_array, " ") | ||||||
|  |         match_all = 1 | ||||||
|  |         for (i = 1; i <= n; i++) { | ||||||
|  |           # 检查关键字是否为空,并且是否在name_part中存在 | ||||||
|  |           if (kw_array[i] != "" && index(name_part, kw_array[i]) == 0) { | ||||||
|  |             match_all = 0 | ||||||
|  |             break | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         if (match_all == 1) print $0 | ||||||
|  |       }') | ||||||
|  | 
 | ||||||
|  |     if [ -n "$fuzzy_matches" ]; then | ||||||
|  |         # 统计匹配数量 - 只统计非空行 | ||||||
|  |         local match_count | ||||||
|  |         match_count=$(echo "$fuzzy_matches" | grep -c '.') | ||||||
|  | 
 | ||||||
|  |         if [ "$match_count" -eq 1 ]; then | ||||||
|  |           # 只有一个模糊匹配,直接执行 | ||||||
|  |           local name_part desc_part command_to_run | ||||||
|  |           name_part=$(echo "$fuzzy_matches" | awk -F'#' '{print $1}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |           desc_part=$(echo "$fuzzy_matches" | awk -F'#' '{print $2}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |           command_to_run=$(echo "$fuzzy_matches" | awk -F'#' '{print $3}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | ||||||
|  |           echo "▶ $name_part【$desc_part】" | ||||||
|  | 
 | ||||||
|  |           # 执行命令 - 对sh文件使用source执行 | ||||||
|  |           if [ -f "$command_to_run" ]; then | ||||||
|  |             if [[ "$command_to_run" == *.sh ]]; then | ||||||
|  |               source "$command_to_run" | ||||||
|  |             elif [ -x "$command_to_run" ]; then | ||||||
|  |               "$command_to_run" | ||||||
|  |             else | ||||||
|  |               source "$command_to_run" | ||||||
|  |             fi | ||||||
|  |           else | ||||||
|  |             eval "$command_to_run" | ||||||
|  |           fi | ||||||
|  |           return 0 | ||||||
|  |         else | ||||||
|  |           # 多个匹配,进入交互模式让用户选择 | ||||||
|  |           echo "找到 $match_count 个匹配项:" | ||||||
|  |           echo "$fuzzy_matches" | awk -F'#' '{print $1}' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | nl -b a | ||||||
|  |           echo "" | ||||||
|  | 
 | ||||||
|  |           # 直接进入交互模式 | ||||||
|  |           interactive_mode "" "$all_args" | ||||||
|  |           return 0 | ||||||
|  |         fi | ||||||
|  |       else | ||||||
|  |         echo "未找到匹配项,进入交互搜索模式..." | ||||||
|  |         # 进入交互模式 | ||||||
|  |         interactive_mode "" "$all_args" | ||||||
|  |       fi | ||||||
|  |   # 如果没有提供参数,直接进入交互模式 | ||||||
|  |   else | ||||||
|  |     interactive_mode | ||||||
|  |   fi | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue