diff --git a/pkg/usr/share/fish/completions/aptss.fish b/pkg/usr/share/fish/completions/aptss.fish index 1c00f22..0bb08fa 100644 --- a/pkg/usr/share/fish/completions/aptss.fish +++ b/pkg/usr/share/fish/completions/aptss.fish @@ -1,36 +1,66 @@ # 清除已有的 aptss 补全(如果有的话) complete -c aptss -e -# 禁用默认的文件补全 +# 禁用默认的文件补全(避免显示当前目录文件) complete -c aptss -f ######################################################################## -# aptss Fish 补全脚本(中文说明版) +# aptss Fish 补全脚本(中文说明版,软件包补全显示简介) # -# 该脚本参考了 Debian 的 aptss bash 补全和 apt 的 Fish 补全, -# 并将子命令的说明翻译为中文。 +# 说明: +# 1. 子命令和选项的说明采用中文显示。 +# 2. 软件包补全部分不再调用 apt-cache,而是解析 aptss 自有的软件源索引文件, +# 从 /var/lib/aptss/lists/*Packages(或 *Sources)中提取软件包名称及简介信息。 +# +# 注意:如果你的 aptss 软件源索引文件位置或格式有变化,请相应修改下面的 awk 命令。 ######################################################################## ### 辅助函数 -# 输出所有可用的包名(调用 apt-cache 并指定 aptss 的缓存目录) +# 解析 /var/lib/aptss/lists/*Packages 文件,输出符合当前输入前缀的“软件包<TAB>简介” function __fish_aptss_print_packages - apt-cache --no-generate pkgnames -o Dir::Cache="/var/lib/aptss/" 2>/dev/null + set cur (commandline -ct) + # 将所有匹配的 Packages 文件拼接后,用 awk 分段解析(RS="" 表示以空行为分段) + awk -v cur="$cur" ' + BEGIN { RS=""; FS="\n" } + { + pkg = ""; desc = ""; + for(i=1; i<=NF; i++){ + if($i ~ /^Package: /) { pkg = substr($i, 10) } # “Package: ”共9个字符 + else if($i ~ /^Description: /) { desc = substr($i, 14) } # “Description: ”共13个字符 + } + if(pkg != "" && (cur == "" || pkg ~ ("^" cur))) { + print pkg "\t" desc + } + } + ' /var/lib/aptss/lists/*Packages 2>/dev/null end -# 输出所有可用的源包(从 apt-cache dumpavail 中提取 Source 字段) -function __fish_aptss_print_sources - apt-cache dumpavail -o Dir::Cache="/var/lib/aptss/" 2>/dev/null | \ - grep "^Source:" | cut -d' ' -f2 | sort -u +# 解析已安装软件包(这里仍使用 dpkg-query,如果需要使用 aptss 数据,可另外构造) +function __fish_aptss_print_installed_packages + set cur (commandline -ct) + dpkg-query -W -f='${Package}\t${Description}\n' 2>/dev/null | grep -i "^$cur" end -# 输出 target-release 备选项(从 apt-cache policy 中提取) -function __fish_aptss_target_release - apt-cache policy -o Dir::Cache="/var/lib/aptss/" | \ - grep -oE 'a=[^,]*|n=[^,]*' | cut -d= -f2 | sort -u +# 解析 /var/lib/aptss/lists/*Sources 文件,输出源代码包信息(如果存在) +function __fish_aptss_print_source_packages + set cur (commandline -ct) + awk -v cur="$cur" ' + BEGIN { RS=""; FS="\n" } + { + pkg = ""; desc = ""; + for(i=1; i<=NF; i++){ + if($i ~ /^Package: /) { pkg = substr($i, 10) } + else if($i ~ /^Description: /) { desc = substr($i, 14) } + } + if(pkg != "" && (cur == "" || pkg ~ ("^" cur))) { + print pkg "\t" desc + } + } + ' /var/lib/aptss/lists/*Sources 2>/dev/null end -# 翻译子命令为中文说明 +# 翻译子命令为中文说明(用于补全时显示在括号内) function __fish_translate_aptss_cmd switch $argv[1] case ssupdate @@ -93,17 +123,17 @@ end # 所有子命令列表 set -g __aptss_commands ssupdate list search show showsrc install remove purge autoremove update upgrade full-upgrade dist-upgrade edit-sources help source build-dep clean autoclean download changelog moo depends rdepends policy -# 需要补全包名的子命令(例如安装、显示、搜索等) +# 需要补全二进制软件包名称的子命令(例如 install、show、search、download、changelog、depends、rdepends) set -l __aptss_pkg_subcmds install show search download changelog depends rdepends -# 需要补全“已安装”包的子命令(如 remove、purge、autoremove) +# 需要补全已安装软件包的子命令(例如 remove、purge、autoremove) set -l __aptss_installed_pkg_subcmds remove purge autoremove -# 需要补全源包的子命令(结合 apt-cache dumpavail) +# 需要补全源代码包的子命令(例如 source、build-dep、showsrc、policy) set -l __aptss_src_pkg_subcmds source build-dep showsrc policy ### 子命令补全 -# 当未输入子命令时,显示所有候选子命令,并使用中文说明 +# 未输入子命令时,显示所有候选子命令,并在括号中显示中文说明 for cmd in $__aptss_commands set desc (__fish_translate_aptss_cmd $cmd) complete -c aptss -a $cmd -d "$desc" -n "not __fish_seen_subcommand_from $__aptss_commands" @@ -198,19 +228,15 @@ complete -c aptss -n ' end ' -a '(__fish_aptss_target_release)' -d '目标版本' -### 包名补全 -# 对于需要包名参数的子命令,调用 __fish_aptss_print_packages -complete -c aptss -n "__fish_seen_subcommand_from $__aptss_pkg_subcmds" -a '(__fish_aptss_print_packages)' -d '软件包名称' +### 软件包补全 +# 对于需要二进制软件包名称的子命令,调用 __fish_aptss_print_packages, +# 输出的每一行格式为 "包名<TAB>简介",Fish 会将 TAB 后内容显示为注释。 +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_pkg_subcmds" -a '(__fish_aptss_print_packages)' -# 对于 remove、purge、autoremove 命令,补全“已安装”包 -complete -c aptss -n "__fish_seen_subcommand_from $__aptss_installed_pkg_subcmds" -a '(__fish_aptss_print_packages)' -d '已安装软件包' +# 对于 remove、purge、autoremove 命令,补全已安装的软件包(使用 dpkg-query 输出) +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_installed_pkg_subcmds" -a '(__fish_aptss_print_installed_packages)' -d '已安装软件包' -# 对于 source、build-dep、showsrc、policy 命令,组合补全包名及源包名称 -complete -c aptss -n "__fish_seen_subcommand_from $__aptss_src_pkg_subcmds" -a '(__fish_aptss_print_packages; __fish_aptss_print_sources)' -d '源代码包' - -### 文件补全 -# 对于 install 命令:若参数看似为文件路径,则仅补全 .deb 文件 -complete -c aptss -n '__fish_seen_subcommand_from install; and test (string match -q "/*" (commandline -ct))' -a "(_filedir -X '*.deb')" -d 'Deb 安装包' - -# 对于 edit-sources 命令:补全 /etc/apt/sources.list 与 /etc/apt/sources.list.d 下的 .list 文件 -complete -c aptss -n "__fish_seen_subcommand_from edit-sources" -a "(__fish_complete_path /etc/apt/sources.list /etc/apt/sources.list.d/*.list)" -d '软件源文件' +# 对于 source、build-dep、showsrc、policy 命令,补全源代码包, +# 如果存在对应的 Sources 索引文件,则调用 __fish_aptss_print_source_packages, +# 否则可考虑默认使用二进制包的索引。 +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_src_pkg_subcmds" -a '(__fish_aptss_print_source_packages)' -d '源代码包'