如何在Zsh自动补全运行时注入参数,实现Wrapper命令补全适配?
Zsh包装脚本bar补全问题解决方案
因为_foo不按常规方式获取命令行参数,修改$words数组没用,你可以通过修改Zsh补全的核心变量,让_foo以为命令行里已经有-C baz参数,具体写法如下:
function _bar() { # 先存好原来的变量,避免影响后续操作 local orig_line="$line" orig_CURRENT="$CURRENT" # 把命令行里的bar替换成foo -C baz line="${line/#bar/foo -C baz}" # 因为多了两个参数(-C和baz),光标位置得往后挪2位 CURRENT=$((CURRENT + 2)) # 调用_foo执行补全 _foo # 把变量还原回去 line="$orig_line" CURRENT="$orig_CURRENT" } compdef _bar bar
原理说明
$line是Zsh补全系统存储当前命令行内容的变量,直接修改它就能让_foo读取到包含-C baz的命令行$CURRENT记录光标在命令行参数中的位置,加2是因为新增了两个参数,这样补全的位置才会正确- 最后恢复原始变量,避免干扰其他补全操作
如果上面的方法仍不生效,还可以尝试临时修改argv数组(部分非标准补全函数会读取这个数组):
function _bar() { local orig_argv=("$argv") # 构造新的参数列表:foo -C baz加上原来bar后面的参数 argv=(foo -C baz "${argv[@]:1}") _foo # 还原参数列表 argv=("${orig_argv[@]}") } compdef _bar bar
内容的提问来源于stack exchange,提问作者Serge Roussak
相关产品推荐
相关产品推荐

