git clone的默认完成(在下面重现)为选项提供了标签完成--*:
_git_clone ()
{
case "$cur" in
--*)
__gitcomp_builtin clone
return
;;
esac
}
Run Code Online (Sandbox Code Playgroud)
(具体的例子,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) 有没有bash_completion为Rails 3准备好的脚本?
这可能比"自定义标签完成"有更好的名称,但这是场景:
通常,当我在命令行并输入命令,然后输入{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 which和filea结果wine不是脚本而是可执行文件.
现在,我不知道这个"过滤器"是否以某种方式编码在程序本身中,或者在默认的wine安装过程中以其他方式指定,所以我不确定这个问题是否更适合stackoverflow或超级用户,所以我是我的手指交叉扔在这里.如果我猜错了,我道歉.(另外,我检查了一些类似的问题,但大多数都是无关紧要的,或者涉及编辑shell配置.)
所以我的问题是,这个"过滤"是如何完成的?提前致谢.
假设我在这里定义了这些变量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扩展到相对路径而不是完整路径.
我想要的是一个我可以从程序中调用的函数,因此它完成了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)
我没有看到任何方法这样做.
我有一个命令行工具,它以三部分形式接受参数:
$ 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) git bash完成的代码,特别是函数__gitcomp,使用参数扩展,如"${1-}".这似乎与此类似"$1".有什么不同?
另外:bash手册中记录了哪些内容?
以下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数组(因此foo和foofrom 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) 是否有可能获得命令行自动完成功能python -m package.subpackage.module?
这类似于但不一样,python ./package/subpackage/module.py它会自动完成目录和文件路径。但是-m,使用 时,python 将库的模块作为具有适当命名空间和导入路径的脚本来运行。
我希望能够python -m package.s[TAB]自动完成subpackage.
此功能是否内置于某处,或者我该如何设置?
我试图编写一个将其他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-completion ×10
bash ×9
git ×2
linux ×2
api ×1
arrays ×1
autocomplete ×1
completion ×1
expansion ×1
python ×1
shell ×1
variables ×1
zsh ×1