Ale*_*lex 13 bash autocomplete
当我打字
unzip <tab>
Run Code Online (Sandbox Code Playgroud)
我得到了所有以 结尾的文件的列表.zip,这是unzip命令的选项卡完成的标准行为。
但是,除了文件之外,我还希望对以.unzip结尾的列表文件进行bash 补全。我怎样才能在我的本地实现这种行为?.udp.zip.bashrc
Run*_*ium 24
而不是继续评论......
complete -f -X '!*.@(zip|udp)' unzip
Run Code Online (Sandbox Code Playgroud)
应该添加完成
-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
Run Code Online (Sandbox Code Playgroud)
换句话说:完成文件并删除所有不以.zip或结尾的文件.udp。
如果添加-o default完成将完成/匹配所有文件和目录,如果没有以.zip或结尾的文件.udp。
如果添加-o plusdirs完成,除了以.zip或结尾的文件的任何匹配项外,还会添加任何目录.udp。
当您使用时,complete -p unzip您将获得当前模式。
从您的评论来看,您似乎缺少其中之一+或缺少@模式,例如:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
Run Code Online (Sandbox Code Playgroud)
这意味着匹配任何字面上以.(zip|udp). 例如
touch 'file_test.(zip|udp)'
Run Code Online (Sandbox Code Playgroud)
另请查看手册的这一部分:
可能例如extglob未启用。启用方式:
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
shopt通过输入以下命令检查所有设置的当前状态:
shopt
Run Code Online (Sandbox Code Playgroud)
如果是-F something这样,则意味着它使用名为something的函数来生成完成列表。
在_filedir_xspec通常是一个Debian功能。你可能有这样的事情:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Run Code Online (Sandbox Code Playgroud)
这意味着/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
Run Code Online (Sandbox Code Playgroud)
– 由于无效的存档或文件权限,不匹配。
这不应该影响结果。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
Run Code Online (Sandbox Code Playgroud)
- 颜色。为什么ls区分test.zip从test.upd?
这不影响complete。颜色由ls提供$LS_COLORS。尝试:
echo "$LS_COLORS" | tr : '\n' | sort
Run Code Online (Sandbox Code Playgroud)
你应该看到类似的东西*.zip=01;31,这意味着:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
Run Code Online (Sandbox Code Playgroud)
*.udp 另一方面,没有与之关联的条目,因此没有着色。
bash --norccomplete -f -X '!*.@(zip|udp)' unzipshopt -s extglobunzip <tab><tab>结果?
此外,单击问题下方的编辑并添加以下输出:
bind -V
shopt
env
Run Code Online (Sandbox Code Playgroud)
可能会有所帮助。
尝试在 .bashrc 中添加这一行:
complete -f -o default -X '!*.+(zip|udp)' unzip
Run Code Online (Sandbox Code Playgroud)