您可以尝试指定脚本名称 https://github.com/yargs/yargs/pull/1143/files在你的entry.js
文件到你的包装脚本的名称。这可能会强制使用它生成完成名称。我还没有尝试过,但是查看 yargs 的源代码,它看起来像$0
可以使用更改参数scriptName
,这反过来又会影响完成生成函数如何生成完成代码:
In yargs-factor.ts
:
scriptName(scriptName: string): YargsInstance {
this.customScriptName = true;
this.$0 = scriptName;
return this;
}
In completion.ts
:
generateCompletionScript($0: string, cmd: string): string {
let script = this.zshShell
? templates.completionZshTemplate
: templates.completionShTemplate;
const name = this.shim.path.basename($0);
// add ./ to applications not yet installed as bin.
if ($0.match(/\.js$/)) $0 = `./${$0}`;
script = script.replace(/{{app_name}}/g, name);
script = script.replace(/{{completion_command}}/g, cmd);
return script.replace(/{{app_path}}/g, $0);
}
我也不确定如何"bin"
配置有效,但可能是因为scriptName
您将不再需要包装纸。
确保您使用的 yargs 版本支持此功能。
另外,作为旁注,我考虑建议直接修改生成的完成脚本,但除了黑客行为之外,还可能导致脚本名称在完成过程中无法识别。无论如何,我只是先看看正确的方法。
修改后的版本会是这样的:
_entry.sh_yargs_completions()
{
local cur_word args type_list
cur_word="${COMP_WORDS[COMP_CWORD]}"
args=("${COMP_WORDS[@]}")
# ask yargs to generate completions.
type_list=$(/path/to/entry.sh --get-yargs-completions "${args[@]}")
COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )
# if no match was found, fall back to filename completion
if [ ${#COMPREPLY[@]} -eq 0 ]; then
COMPREPLY=()
fi
return 0
}
complete -o default -F _entry.sh_yargs_completions entry.sh
另请注意:如果脚本名称需要根据其调用者的名称是动态的,您可以通过环境变量使其可识别,因此在entry.sh
你可以这样声明它:
export ENTRY_JS_SCRIPT_NAME=entry.sh
node ...
然后在某个地方entry.js
,您可以通过以下方式访问变量名称:
process.env.ENTRY_JS_SCRIPT_NAME
也许甚至只是指定$0
or ${0##*/}
任何有效的方法:
export ENTRY_JS_SCRIPT_NAME=$0