Bash 空头期权完成失败
Bash completion broken on short options
我已经创建了自己的 bash 完成函数。我做了几次编辑。完成本身适合我,但我在短选项 -a
、-p
、-h
之后打破了自动 space
意思是,当我键入 editcfg -fil
TAB 时,它会自动完成 editcfg -file
(space 在 -file
之后)。
但是,如果我键入 editcfg -p
TAB,它不会在 -p
.
之后自动 space
函数:
_editcfg ()
{
local cur prev opts presets u_opts;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
presets=("default" "empty");
u_opts=();
for i in "${opts[@]}";
do
for j in "${COMP_WORDS[@]}";
do
if [[ "$i" == "$j" ]]; then
continue 2;
fi;
done;
u_opts+=("$i");
done;
case ${prev} in
-p)
COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
return 0
;;
-file)
COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
return 0
;;
-h | -version)
u_opts=();
return 0
;;
esac;
COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
return 0
}
我错过了什么?
谢谢
我更新了第二个 for
循环并且它工作正常:
_editcfg ()
{
local cur prev opts presets u_opts;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
presets=("default" "empty");
u_opts=();
for i in "${opts[@]}"; do
for ((j = 0; j < COMP_CWORD; ++j)) do
if [[ "$i" == "${COMP_WORDS[j]}" ]]; then
continue 2;
fi;
done;
u_opts+=("$i");
done;
case ${prev} in
-p)
COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
return 0
;;
-file)
COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
return 0
;;
-h | -version)
u_opts=();
return 0
;;
esac;
COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
return 0
}
我已经创建了自己的 bash 完成函数。我做了几次编辑。完成本身适合我,但我在短选项 -a
、-p
、-h
意思是,当我键入 editcfg -fil
TAB 时,它会自动完成 editcfg -file
(space 在 -file
之后)。
但是,如果我键入 editcfg -p
TAB,它不会在 -p
.
函数:
_editcfg ()
{
local cur prev opts presets u_opts;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
presets=("default" "empty");
u_opts=();
for i in "${opts[@]}";
do
for j in "${COMP_WORDS[@]}";
do
if [[ "$i" == "$j" ]]; then
continue 2;
fi;
done;
u_opts+=("$i");
done;
case ${prev} in
-p)
COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
return 0
;;
-file)
COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
return 0
;;
-h | -version)
u_opts=();
return 0
;;
esac;
COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
return 0
}
我错过了什么?
谢谢
我更新了第二个 for
循环并且它工作正常:
_editcfg ()
{
local cur prev opts presets u_opts;
COMPREPLY=();
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h");
presets=("default" "empty");
u_opts=();
for i in "${opts[@]}"; do
for ((j = 0; j < COMP_CWORD; ++j)) do
if [[ "$i" == "${COMP_WORDS[j]}" ]]; then
continue 2;
fi;
done;
u_opts+=("$i");
done;
case ${prev} in
-p)
COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur}));
return 0
;;
-file)
COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null));
return 0
;;
-h | -version)
u_opts=();
return 0
;;
esac;
COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur}));
return 0
}