Answers:
而不是继续评论...
complete -f -X '!*.@(zip|udp)' unzip
应该为
-f -X '!*.@(zip|udp)'
| | | |||________|
| | | || |
| | | || +- filterpat: zip or udp
| | | |+------------- @ : Matches one of the given patterns
| | | +-------------- *. : Anything+<dot>
| | +---------------- ! : Negate
| +------------------- -X : Filter out matches in "filterpat"
+---------------------- -f : files
换句话说:完成文件并删除所有未以.zip
或结尾的文件.udp
。
如果您添加-o default
完成,则如果没有以或结尾的文件,则完成/匹配所有文件和目录。.zip
.udp
如果添加-o plusdirs
完成,则除了以.zip
或结尾的文件的任何匹配项外,还将添加任何目录.udp
。
使用时,complete -p unzip
您将获得当前模式。
从您的评论中听起来,您听起来好像就像是在失踪+
还是@
在模式中失踪,例如:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
这意味着匹配任何以.(zip|udp)
。结尾的文件。例如
touch 'file_test.(zip|udp)'
还可以查看手册的这一部分:
可能例如extglob
未启用。通过以下方式启用:
shopt -s extglob
shopt
通过输入以下命令检查所有设置的当前状态:
shopt
如果是-F something
这样,则表示它使用一个名为something的函数来生成补全列表。
在_filedir_xspec
通常是一个Debian功能。您可能会有这样的事情:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
这意味着/usr/share/bash-completion/bash_completion
获取来源。在这里,您将找到有问题的功能。再往后几行,您会看到此功能/完成功能是_install_xspec
由例如以下名称的功能添加的:
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
–由于无效的存档或文件权限而导致不匹配。
这不应影响结果。complete
仅匹配规则给定的文件,不处理文件。如果您可以使用列出它们ls
,则它们应该匹配。
附带说明一下,可以通过使用完整功能来添加这样的功能:
function _unzip_validated() {
# 1. Generate list of files ending in e.g. .zip and .udp
# 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
–颜色。为什么ls
区分test.zip
从test.upd
?
这不影响complete
。ls
提供的颜色由提供$LS_COLORS
。尝试:
echo "$LS_COLORS" | tr : '\n' | sort
您应该看到类似的*.zip=01;31
含义:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
另一方面,没有与之关联的条目,因此没有着色。
bash --norc
complete -f -X '!*.@(zip|udp)' unzip
shopt -s extglob
unzip <tab><tab>
结果?
另外,点击问题下方的修改,然后添加以下内容的输出:
bind -V
shopt
env
可能会有所帮助。
~/bin/testing
,2. complete -f -X '!*.@(zip|udp)' testing
,3. testing <tab><tab>
?
shopt
:
extglob
被激活。带有“测试”的示例zip
仅再次选择文件。我注意到,该test.zip
图标显示为红色,而test.upd
白色显示为ls -l
,带有相同的权限,ownershift和组关联的两个文件均为空。为什么ls
区分test.zip
从test.upd
?也许这暗示了我的问题?
在/etc/bash_completion
您可能在某处采购的文件中,至少对于我的bash
(v4.2.25)版本,默认完成是
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo
尝试将整个表达式更改为
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo
并添加到您的 .bash_profile
unzip <tab>
既不认定.zip
也不是.upd
文件还是其他文件。
gzip
有.gz
文件吗?
gunzip
与.gz
文件一起使用时,仅选择以结尾的文件.gz
,但定义也不同:complete -F _filedir_xspec gunzip
。
/etc/bash_completion
作为源.bashrc
?
shopt -s extglob
尝试在.bashrc中添加以下行:
complete -f -o default -X '!*.+(zip|udp)' unzip
.udp
文件,但前提是没有.zip
文件。如果当前目录中存在test.zip
和test.udp
文件,则unzip <tab>
仅列出.zip
文件。我希望能看到两个文件(即bash完成会给出test.
)。
udp
和zip
文件。.bashrc
添加行后您是否找到货源?
unzip <tab>
列出了所有文件,甚至包括以不同短语结尾的文件。现在正是我所需要的。
complete -f -o default -X '!*.zip' unzip
和complete -f -o default -X '!*.udp' unzip
最好使用_filedir
而不是“ raw” complete
。
理由
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
)路径正在扩展/home/tux/Do<TAB><TAB>
,您作为答复得到的列表将删除'/ home / tux',因此更加紧凑微机
_unzip_completor()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
_filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
complete -p unzip
产生complete -f -X '!*.@(zip|udp)' unzip
并unzip <tab>
完成名为的文件test.zip
。但是,该目录还包含一个名为的文件,该文件test.upd
在的制表符补全中找不到unzip
。文件权限或文件长度为零的事实是否可以解释这种奇怪的行为?