标签: bash-completion

覆盖git clone的bash完成

内置完成

git clone的默认完成(在下面重现)为选项提供了标签完成--*:

_git_clone ()
{
    case "$cur" in
    --*)
        __gitcomp_builtin clone
        return
        ;;
    esac
}
Run Code Online (Sandbox Code Playgroud)

bash-completion 1.x(old bash)

(具体的例子,macos high sierra + brew安装了bash-completion/git)

在bash-completion 1.x世界中,要覆盖它,我会(在.bashrc/中.bash_profile)定义我自己的_git_clone完成函数:

# https://github.com/scop/bash-completion/blob/d2f14a7/bash_completion#L498
__ltrim_colon_completions() {
    if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
        # Remove colon-word prefix from COMPREPLY items
        local colon_word=${1%"${1##*:}"}
        local i=${#COMPREPLY[*]}
        while [[ $((--i)) -ge 0 ]]; do
            COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
        done
    fi
}


_git_clone() {
    case "$cur" in
    --*) …
Run Code Online (Sandbox Code Playgroud)

git bash bash-completion

15
推荐指数
1
解决办法
538
查看次数

Rails 3的bash_completion

有没有bash_completion为Rails 3准备好的脚本?

linux bash-completion ruby-on-rails-3

14
推荐指数
1
解决办法
1491
查看次数

在shell中自定义选项卡完成

这可能比"自定义标签完成"有更好的名称,但这是场景:

通常,当我在命令行并输入命令,然后输入{TAB}两次时,我会获得当前目录中所有文件和子目录的列表.例如:

[user@host tmp]$ cat <TAB><TAB>
chromatron2.exe                  Fedora-16-i686-Live-Desktop.iso  isolate.py
favicon.ico                      foo.exe                          James_Gosling_Interview.mp3
Run Code Online (Sandbox Code Playgroud)

但是,我注意到至少有一个程序以某种方式过滤了这个列表:wine.考虑:

[user@host tmp]$ wine <TAB><TAB>
chromatron2.exe  foo.exe
Run Code Online (Sandbox Code Playgroud)

它有效地过滤了结果*.exe.

认为它可能是负责过滤的某种包装脚本,a a whichfilea结果wine不是脚本而是可执行文件.

现在,我不知道这个"过滤器"是否以某种方式编码在程序本身中,或者在默认的wine安装过程中以其他方式指定,所以我不确定这个问题是否更适合stackoverflow或超级用户,所以我是我的手指交叉扔在这里.如果我猜错了,我道歉.(另外,我检查了一些类似的问题,但大多数都是无关紧要的,或者涉及编辑shell配置.)

所以我的问题是,这个"过滤"是如何完成的?提前致谢.

linux bash shell tab-completion bash-completion

14
推荐指数
3
解决办法
9959
查看次数

bash选项卡完成没有变量扩展?

假设我在这里定义了这些变量bashrc:

i='cgi-bin/internal';  
e='cgi-bin/external';  
f='cgi-bin/foo';  
b='cgi-bin/bar';  
ad='cgi-bin/admin';  
#etc...
Run Code Online (Sandbox Code Playgroud)

当我在命令行上使用变量时vim $i/edit_TAB,它将扩展变量并且命令行上的输入变为vim /www/productX/subdomain_x/cgi-bin/internal/edit_(相应于我所在的任何站点)然后我TABTAB获得可能的完成.

没关系,功能不是问题.只是每次看到完整路径而不仅仅是变量的值会变得烦人.

有没有办法不在命令行上扩展bash变量而不影响功能?
是这样做的bash完成吗?

期望的结果$i不会扩展到它的价值(视觉上)或$i扩展到相对路径而不是完整路径.

variables bash expansion bash-completion

13
推荐指数
1
解决办法
2110
查看次数

可以通过编程方式调用bash完成吗?

我想要的是一个我可以从程序中调用的函数,因此它完成了bash给出命令行和按下TAB的位置的方式.

. /etc/bash_completion
generate_completions "command arg1 arg2" 17
Run Code Online (Sandbox Code Playgroud)

将返回相同的东西

command arg1 arg2[TAB]
Run Code Online (Sandbox Code Playgroud)

我没有看到任何方法这样做.

api bash bash-completion

13
推荐指数
1
解决办法
1115
查看次数

如何打破完整的三部曲模式

我有一个命令行工具,它以三部分形式接受参数:

$ t first_second_third
Run Code Online (Sandbox Code Playgroud)

我有一组有效值first,一组有效值second,以及一组有效值third.我想使用Bash完整功能来完成选项值的每个部分,如下例所示:

$ t [tab][tab]           # shows options for first part
walk run skip bike
$ t w[tab]               # completes first part and appends delimiter
$ t walk_[tab][tab]      # shows options for second part
home work park
$ t walk_h[tab]          # completes second part and appends delimiter
$ t walk_home_[tab][tab] # shows options for second part
morning afternoon evening
$ t walk_home_a[tab]     # completes second part and appends space …
Run Code Online (Sandbox Code Playgroud)

bash bash-completion

13
推荐指数
1
解决办法
1161
查看次数

"$ {1-}"vs"$ 1"

git bash完成的代码,特别是函数__gitcomp,使用参数扩展,如"${1-}".这似乎与此类似"$1".有什么不同?

另外:bash手册中记录了哪些内容?

git bash bash-completion

12
推荐指数
2
解决办法
1673
查看次数

Bash自动完成 - 如何将此数组传递给compgen而不会丢失重要的空格?

以下bash完成将一系列可能的单词(即完成)传递给compgen.

basenames=("foo" "fu bar" "baz");

COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

问题是数组元素中的空格不会被保留,即"foo bar"被视为元素,这要归功于单词拆分.有没有办法保留空白,所以显示3个元素,而不是4?

编辑

basenames 包含文件名,几乎每个字符(除了/和\ 0)都是允许的.

编辑2

-W标志需要一个单词,就像这样foo bar foobar.传递多个元素(这是${basenames[@]}可以做的)是行不通的.

编辑3

更改了示例性的basenames数组(因此foofoofrom foo bar不会折叠).

使用换行符分隔单词的工作原理:

local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" --  ${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

使用\0不:

local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" --  ${COMP_WORDS[COMP_CWORD]}"))
Run Code Online (Sandbox Code Playgroud)

arrays bash bash-completion

12
推荐指数
1
解决办法
3986
查看次数

python -m 模块的命令行自动补全

是否有可能获得命令行自动完成功能python -m package.subpackage.module

这类似于但不一样,python ./package/subpackage/module.py它会自动完成目录和文件路径。但是-m,使用 时,python 将库的模块作为具有适当命名空间和导入路径的脚本来运行。

我希望能够python -m package.s[TAB]自动完成subpackage.

此功能是否内置于某处,或者我该如何设置?

python bash autocomplete bash-completion

12
推荐指数
1
解决办法
1940
查看次数

如何将Shell补全推迟到bash和zsh中的另一个命令?

我试图编写一个将其他Shell实用程序包装到单个CLI中的Shell脚本实用程序,并试图使Shell完成在zsh和bash中工作。

例如,假设CLI名为util

util aws [...args] #=> runs aws
util docker [...args] #=> runs docker
util terraform [...args] #=> runs terraform
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要的是zsh和bash补全中的一种方式,它能够独立于包装脚本的补全实现说“像其他命令Y一样完成此子命令X”。

就像是:

compdef 'util aws'='aws'
compdef 'util docker'='docker'
compdef 'util terraform'='terraform'
Run Code Online (Sandbox Code Playgroud)

扩展目标将是允许对另一个二进制文件中的子命令完成任意子命令:

util aws [...args] #=> completes against `aws`
util ecr [...args] #=> completes against `aws ecr`
Run Code Online (Sandbox Code Playgroud)

有可能吗?我一直在尝试模拟单个二进制文件的完成脚本,但是在编写其他完成脚本的方式上有很大的不同。

bash zsh bash-completion zsh-completion completion

12
推荐指数
1
解决办法
356
查看次数