标签: bash-completion

以编程方式访问特定命令的bash完成

我正在尝试编写一个小型命令启动器应用程序,并希望在我自己的完成系统中使用bash的选项卡完成.我已经能够获得一般命令的完成列表compgen -abck.
但是,我还希望获得特定命令的完成:例如,输入git p应显示git命令的完成.

我有什么方法可以compgen用来做这个吗?如果没有,还有其他方法可以通过编程方式获得完成列表吗?

[编辑:澄清一点,我不是要 bash 提供完成 - 我的应用程序是一个GUI命令启动器.我只想在我自己的应用程序中使用bash的现有完成.

bash shell tab-completion bash-completion

22
推荐指数
1
解决办法
1606
查看次数

如何在不影响其他完成脚本的情况下重置COMP_WORDBREAKS?

当我实现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 shell autocomplete bash-completion

22
推荐指数
1
解决办法
3997
查看次数

自定义bash完成输出:新行上的每个建议

键入内容时,通常会使用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条建议,则逐行显示,如果更多=>实际显示".

unix bash customization bash-completion

21
推荐指数
2
解决办法
1564
查看次数

让"完整"和"菜单完成"一起工作

我发现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)

然而,加入这一行似乎只能使双方TabCtrl-Tab调用传统complete功能.

有谁知道我做错了什么?

提前致谢!

bash bash-completion

20
推荐指数
3
解决办法
1万
查看次数

在查找文件时让compgen在目录中包含斜杠

我想从我的自定义完成中获得以下行为

特定

$ 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 autocomplete bash-completion

20
推荐指数
3
解决办法
3462
查看次数

在cygwin中缓慢加载bash的时间

目前bash需要大约2秒才能加载.我用-x旗帜运行bash,我看到输出,似乎PATH在cygwin中被多次加载.有趣的是我在linux环境中使用相同的文件,但它工作正常,没有重载问题.以下可能导致问题吗?

if [ `uname -o` = "Cygwin" ]; then
    ....
fi
Run Code Online (Sandbox Code Playgroud)

debugging bash cygwin bash-completion

18
推荐指数
3
解决办法
1万
查看次数

多级Bash完成

我目前有一个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 bash-completion

17
推荐指数
1
解决办法
4476
查看次数

如何防止在标签完成时替换字符完成bash完成

我正在为一个工具构建一个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)

反正有没有显示正常的文件标签完成(没有'@'前缀)但在点击标签时保留'@'?

bash bash-completion

16
推荐指数
1
解决办法
1054
查看次数

Git选项卡完成在mac上的zsh中无效

无论我尝试做什么,我似乎无法在我的zsh shell中进行git tab/auto completion工作.我已经下载了bash-completion脚本和zsh-completion脚本,并按照说明操作,但我无法使其工作.

我重新安装了oh-my-zsh,但似乎没有帮助或有任何区别.

任何能够让它工作的人都可以向我描述他们的设置,这样我就可以尝试模仿它以使其适合我吗?

具体来说,到目前为止我所做的是:

没运气.

git zsh bash-completion zsh-completion oh-my-zsh

16
推荐指数
3
解决办法
9179
查看次数

bash自动完成:添加可能的完成描述

是否有可能使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 tab-completion bash-completion

15
推荐指数
2
解决办法
2011
查看次数