我正在尝试编写一个小型命令启动器应用程序,并希望在我自己的完成系统中使用bash的选项卡完成.我已经能够获得一般命令的完成列表compgen -abck.
但是,我还希望获得特定命令的完成:例如,输入git p应显示git命令的完成.
我有什么方法可以compgen用来做这个吗?如果没有,还有其他方法可以通过编程方式获得完成列表吗?
[编辑:澄清一点,我不是要为 bash 提供完成 - 我的应用程序是一个GUI命令启动器.我只想在我自己的应用程序中使用bash的现有完成.
当我实现bash自动完成功能时,有些东西让我感到困惑,我将它放在/etc/bash_completion.d/中
为了实现某些功能,我想:从变量中删除单词break字符冒号()$COMP_WORDBREAKS并/在开头添加斜杠()$COMP_WORDBREAKS.
COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
local cur=${COMP_WORDS[COMP_CWORD]}
compopt -o nospace
# my implement here
COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool
Run Code Online (Sandbox Code Playgroud)
但是,我无法COMP_WORDBREAKS直接重置,因为该值与其他完成脚本共享.调用完成函数时,COMP_WORDS已经填充了变量数组,因此本地更改COMP_WORDBREAKS不起作用.
是否有任何解决方案可以更改COMP_WORDBREAKS一个完成脚本而对其他脚本没有影响?
$ echo $BASH_VERSION
4.2.10(1)-release
Run Code Online (Sandbox Code Playgroud) 键入内容时,通常会使用bash自动完成:例如,您开始编写命令,然后键入TAB以获取其余部分.
您可能已经注意到,当多个选项与您的命令匹配时,bash会显示如下:
foobar@myserv:~$ admin-
admin-addrsync admin-adduser admin-delrsync admin-deluser admin-listsvn
admin-addsvn admin-chmod admin-delsvn admin-listrsync
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种解决方案,在新线上显示每个可能的解决方案,类似于上一栏的最后一栏ls -l.更好的是,如果我可以应用这样的规则将是完美的:"如果您发现少于10条建议,则逐行显示,如果更多=>实际显示".
我发现Bash shell支持一种与"传统"自动完成不同的自动完成,其中所有可能性都列在下一行.
使用"传统"自动完成功能,如果我键入ch然后Tab按键,我会得到类似的结果:
$ ch
chacl chgrp chmod chown chvt
Run Code Online (Sandbox Code Playgroud)
但是如果我/etc/inputrc将以下行添加到my (将Tab键重新映射到内置menu-complete函数):
Tab: menu-complete
Run Code Online (Sandbox Code Playgroud)
然后shell的行为发生变化:要完成的单词被替换为"inline",其中包含可能完成列表中的单个匹配,如果我再次按Tab键,则该单词将替换为下一个匹配.
我发现这很有用,但我仍然希望保留传统的自动完成功能并将其绑定到组合键Ctrl + Tab.所以我/etc/inputrc根据readline库文档的建议将以下行添加到我的文件中:
Ctrl-Tab: complete
Run Code Online (Sandbox Code Playgroud)
然而,加入这一行似乎只能使双方Tab并Ctrl-Tab调用传统complete功能.
有谁知道我做错了什么?
提前致谢!
我想从我的自定义完成中获得以下行为
特定
$ mkdir foo
$ touch foo faz/bar faz/baz
Run Code Online (Sandbox Code Playgroud)
我想得到这个
$ foo -u <tab><tab> =>
foo faz/
$ foo -u fa<tab><tab> =>
foo -u faz/
$ foo -u faz/<tab><tab> =>
bar baz
Run Code Online (Sandbox Code Playgroud)
我认为compgen -f f会输出foo faz/,但它的输出foo faz对我没什么帮助.
我是否需要对输出进行后处理,或者是否有一些神奇的选项组合可以使用?
目前bash需要大约2秒才能加载.我用-x旗帜运行bash,我看到输出,似乎PATH在cygwin中被多次加载.有趣的是我在linux环境中使用相同的文件,但它工作正常,没有重载问题.以下可能导致问题吗?
if [ `uname -o` = "Cygwin" ]; then
....
fi
Run Code Online (Sandbox Code Playgroud) 我目前有一个Bash完成文件,它从一个允许的脚本命令列表(称为"pbt")中完成一个参数.这是工作Bash完成文件:
_pbt_complete()
{
local cur goals
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
goals='asadmin clean deploy'
cur=`echo $cur`
COMPREPLY=($(compgen -W "${goals}" ${cur}))
}
complete -F _pbt_complete pbt
Run Code Online (Sandbox Code Playgroud)
所以,如果我打电话
pbt <tab>
Run Code Online (Sandbox Code Playgroud)
Bash完成所有允许的命令(asadmin,clean,deploy),这没关系.
现在我想在完成时添加"第二"级别.所以例如,如果我输入
pbt asadmin <tab>
Run Code Online (Sandbox Code Playgroud)
它应该完成所有只在asadmin-"环境"中可用的选项(我也将在bash完成文件中定义),例如,pbt asadmin [start-domain|stop-domain]但是如果我输入
pbt deploy <tab>
Run Code Online (Sandbox Code Playgroud)
例如,它应该完成另一组选项pbt deploy [all|current].因此第二个命令的选项应始终取决于第一个命令.我怎么能在完成文件中这样做?
我正在为一个工具构建一个bash完成脚本,该脚本与curl共享文件上传语义.
使用curl,您可以:
curl -F var = @ file
上传文件.
我的应用程序具有类似的语义,我希望能够在按下'@'后显示可能的文件.不幸的是,这证明是困难的:
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
if [[ "$cur" == @* && "$prev" == '=' ]]; then
COMPREPLY=( $(compgen -f ${cur:1}) )
return 0
fi
Run Code Online (Sandbox Code Playgroud)
因此,如果命令(到目前为止)以以下结尾:
abc=@
Run Code Online (Sandbox Code Playgroud)
将显示当前目录中的文件.
var=@/usr/
/usr/bin /usr/games
Run Code Online (Sandbox Code Playgroud)
问题是,如果我真的按Tab键完成,'@'就会消失!
var=/usr/bin
Run Code Online (Sandbox Code Playgroud)
所以看起来bash用标签式COMPREPLY替换整个当前单词.
避免这种情况的唯一方法是这样做:
COMPREPLY=( $(compgen -f ${cur:1}) )
for (( i=0; i<${#COMPREPLY[@]}; i++ ));
do
COMPREPLY[$i]='@'${COMPREPLY[$i]}
done
Run Code Online (Sandbox Code Playgroud)
但是现在标签的完成看起来很奇怪:
@/usr/bin @/usr/games
Run Code Online (Sandbox Code Playgroud)
反正有没有显示正常的文件标签完成(没有'@'前缀)但在点击标签时保留'@'?
无论我尝试做什么,我似乎无法在我的zsh shell中进行git tab/auto completion工作.我已经下载了bash-completion脚本和zsh-completion脚本,并按照说明操作,但我无法使其工作.
我重新安装了oh-my-zsh,但似乎没有帮助或有任何区别.
任何能够让它工作的人都可以向我描述他们的设置,这样我就可以尝试模仿它以使其适合我吗?
具体来说,到目前为止我所做的是:
~/.completion/git/git-completion.sh~/.zsh/_gitzstyle ':completion:*:*:git:*' script ~/.completion/git/git-completion.sh没运气.
是否有可能使bash自动完成看起来像Cisco IOS shell?
我的意思是为每个完成添加简短描述,如下所示:
telnet 10.10.10. (TAB Pressed)
10.10.10.10 - routerA
10.10.10.11 - routerB
Run Code Online (Sandbox Code Playgroud)
其中10.10.10.10和10.10.10.11是可能的完成,routerA和routerB只是描述(不执行).
我知道bash可以用"完成-W"完成命令,但是它能够为它们打印描述吗?
bash-completion ×10
bash ×9
autocomplete ×2
shell ×2
cygwin ×1
debugging ×1
git ×1
oh-my-zsh ×1
unix ×1
zsh ×1